3

我对android和java都很陌生,所以希望我在这里遗漏了一些简单的东西。我要做的就是创建一个简单的 PKCS10 证书签名请求。我有一些代码可以在我的 ubuntu 机器(java-6-openjdk)上编译和运行,但会在 android 模拟器中引发空指针异常:

        KeyPair myKeyPair = KeyPairGenerator.getInstance("RSA").generateKeyPair();
        X500Principal subject = new X500Principal("CN=Test V3 Certificate");
        PKCS10CertificationRequest csr = new PKCS10CertificationRequest
                        ( "SHA1withRSA",
                           subject,
                           myKeyPair.getPublic(),
                           null,
                           myKeyPair.getPrivate()
                );

        byte[] outBytes = csr.getEncoded();
        return new String(outBytes);

在调试器中,我可以看到我显然已经构建了一个 PKCS10CertificationRequest,但是我不能用它做任何事情(比如 getEncoded() 甚至 toString())而不会出错。当我调用 getEncoded() 时,它在 android 模拟器上失败;这是堆栈跟踪:

06-22 04:41:06.143: WARN/System.err(337): java.lang.NullPointerException: obj == null
06-22 04:41:06.213: WARN/System.err(337):     at org.bouncycastle.asn1.ASN1Collection.addObject(ASN1Collection.java:95)
06-22 04:41:06.353: WARN/System.err(337):     at org.bouncycastle.asn1.DERSequence.<init>(DERSequence.java:34)
06-22 04:41:06.433: WARN/System.err(337):     at org.bouncycastle.asn1.x509.AlgorithmIdentifier.toASN1Object(AlgorithmIdentifier.java:
124)
06-22 04:41:06.453: WARN/System.err(337):     at org.bouncycastle.asn1.ASN1Encodable.getDERObject(ASN1Encodable.java:
77)
06-22 04:41:06.483: WARN/System.err(337):     at org.bouncycastle.asn1.DEROutputStream.writeObject(DEROutputStream.java:
74)
06-22 04:41:06.523: WARN/System.err(337):     at org.bouncycastle.asn1.DERSequence.encode(DERSequence.java:70)
06-22 04:41:06.544: WARN/System.err(337):     at org.bouncycastle.asn1.DEROutputStream.writeObject(DEROutputStream.java:
74)
06-22 04:41:06.593: WARN/System.err(337):     at org.bouncycastle.jce.PKCS10CertificationRequest.getEncoded(PKCS10CertificationRequest.java:
443)

我已经在 API 级别 7 和 8 上进行了尝试。我知道我可以发布大量其他关于我系统各个组件版本的详细信息。就像我说的,我是新手,所以现在我更多的是寻找一个方向,而不是最终的答案。

非常感谢,

亚当麦克勒

4

2 回答 2

3

您遇到了 BouncyCastle 错误。我不确定它是否已修复。我最终使用了我自己的 PKCS10CertificateRequest。您只需要在构造函数中更改这一行,

   this.sigAlgId = new AlgorithmIdentifier(sigOID, null);

   this.sigAlgId = new AlgorithmIdentifier(sigOID);
于 2010-06-22T20:42:44.863 回答
1

我知道旧帖子,但由于这篇帖子而遇到了同样的问题并解决了它。似乎这个“错误”仍然存在。针对 2.3 Android。

通过使用反射解决了它,所以只想在这里分享。只需注入“正确”构造的算法标识符。

PKCS10CertificationRequest pkcs10 = new PKCS10CertificationRequest("SHA1WithRSA", subjectName, publicKey, null, privateKey, "BC");


//FIX ANDROID BUG BY REFLECTION
// 1.2.840.113549.1.1.5 == SHA1WithRSA (lookup identifier for your use)
AlgorithmIdentifier algorithmIdentifier = new AlgorithmIdentifier(new DERObjectIdentifier("1.2.840.113549.1.1.5"));

Field field = CertificationRequest.class.getDeclaredField("sigAlgId");
field.setAccessible(true);
field.set(pkcs10, algorithmIdentifier);

//After this you can access the pkcs10 object.
于 2012-03-16T09:49:38.620 回答