java - 如何在 BouncyCaSTLe 中序列化 PKCS10CertificationRequest 以通过网络发送?

标签 java serialization deserialization bouncycastle pem

我已经尝试序列化对象PKCS10CertificationRequest有一段时间了。我认为正确的方法是创建一个 ASN1Primitive 类,通过网络发送它,然后反序列化它。但是,似乎只有序列化为 ASN1,但似乎没有反序列化 ASN1,而且我不想手动解析和重建请求。我应该怎么办?到目前为止我的代码是

    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, "feedback-crypto@bouncycastle.org");

    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, feedback-crypto@bouncycastle.org]]], [[1.2.840.113549.1.1.1, NULL], #03818D0030818902818100A...

我不想手动解析它。我该怎么办?

最佳答案

忘记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),显然您需要按照 https://stackoverflow.com/a/5527171/2413303IETFUtils 类。

关于java - 如何在 BouncyCaSTLe 中序列化 PKCS10CertificationRequest 以通过网络发送?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26439507/

相关文章:

java - 计划任务不会在夜间的特定时间运行

java - 我必须做什么才能保证 ccc.jar 在 aaa.jar 之前加载?

c# - 如何使用 protobuf-net 嵌入类型信息以用于反序列化目的?

c# - 使用空字段 C# 进行 JSON 反序列化

java - 当我们编写自定义反序列化器时,如何使用 Jackson 反序列化对象数组

java - 如何在 Android Studio 中使用 FatSecret API?

java - 从Java中的抽象类定义精确的类

serialization - 在磁盘上存储一组 protobuf

在 C 中将字节转换为 Int/uint

c# - 无法将 json 转换为对象