2014-10-18 128 views
1

我一直在嘗試序列化對象PKCS10CertificationRequest一段時間。我認爲正確的做法是創建一個ASN1Primitive類,通過網絡發送它,然後反序列化它。然而,似乎只有串行化爲 ASN1,但似乎從 ASN1沒有反序列化,我不想手動解析和重建的請求。我該怎麼辦?到目前爲止我的代碼是如何序列化BouncyCastle中的PKCS10CertificationRequest以通過網絡發送?

Security.addProvider(new BouncyCastleProvider()); 
    KeyPairGenerator kpg = KeyPairGenerator.getInstance("RSA", "SC"); 
    kpg.initialize(1024); 
    KeyPair kp = kpg.genKeyPair(); 
    System.out.println("Private: " + kp.getPrivate()); 
    System.out.println("Public: " + kp.getPublic()); 

    X500NameBuilder x500NameBld = new X500NameBuilder(BCStyle.INSTANCE); 

    x500NameBld.addRDN(BCStyle.C, "AU"); 
    x500NameBld.addRDN(BCStyle.O, "The Legion of the Bouncy Castle"); 
    x500NameBld.addRDN(BCStyle.L, "Melbourne"); 
    x500NameBld.addRDN(BCStyle.ST, "Victoria"); 
    x500NameBld.addRDN(BCStyle.EmailAddress, "[email protected]"); 

    X500Name subject = x500NameBld.build(); 

    PKCS10CertificationRequestBuilder requestBuilder = new JcaPKCS10CertificationRequestBuilder(subject, kp.getPublic()); 

    PKCS10CertificationRequest req1 = requestBuilder.build(new JcaContentSignerBuilder("SHA1withRSA").setProvider("SC").build(
      kp.getPrivate())); 

    JcaPKCS10CertificationRequest req2 = new JcaPKCS10CertificationRequest(req1.getEncoded()).setProvider("SC"); 

//serialization 
    ByteArrayOutputStream abOut = new ByteArrayOutputStream(); 
    ASN1OutputStream berOut = new ASN1OutputStream(abOut); 
    berOut.writeObject(req2.toASN1Structure()); 

    byte[] serializedData = abOut.toByteArray(); 

    ASN1Primitive asn1Primitive = ASN1Primitive.fromByteArray(serializedData); 
    System.out.println(""); 
    System.out.println("" + asn1Primitive.toString()); 

,輸出是

[[0, [[[2.5.4.6, AU]], [[2.5.4.10, The Legion of the Bouncy Castle]], [[2.5.4.7, Melbourne]], [[2.5.4.8, Victoria]], [[1.2.840.113549.1.9.1, [email protected]]]], [[1.2.840.113549.1.1.1, NULL], #03818D0030818902818100A... 

我不想手動解析此。我該怎麼做呢?

回答

1

忘掉ASN1,它是一個爛攤子,而且似乎沒有自動反序列化。但是,您可以使用BouncyCastle中的JcaPEMWriterPEMParser類創建一個String對象來序列化或反序列化數據,並通過網絡發送它。

StringWriter sw = new StringWriter(); 
    JcaPEMWriter pemWriter = new JcaPEMWriter(sw); 
    pemWriter.writeObject(req2); 
    pemWriter.close(); 

    PEMParser pemParser = null; 
    try 
    { 
     pemParser = new PEMParser(new StringReader(sw.toString())); 
     Object parsedObj = pemParser.readObject(); 
     System.out.println("PemParser returned: " + parsedObj); 
     if (parsedObj instanceof PKCS10CertificationRequest) 
     { 
      JcaPKCS10CertificationRequest jcaPKCS10CertificationRequest = new JcaPKCS10CertificationRequest((PKCS10CertificationRequest)parsedObj); 
      System.out.println("" + jcaPKCS10CertificationRequest.getPublicKey()); 
     } 
    } 
    catch (IOException ex) 
    { 
     ex.printStackTrace(); 
    } 
    finally 
    { 
     if (pemParser != null) 
     { 
      pemParser.close(); 
     } 
    } 

編輯:雖然如果有人真的需要走出ASN1Encodable對象(元素像X500NameRDN,顯然你需要IETFUtils類按https://stackoverflow.com/a/5527171/2413303