我对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.我知道有一个 我可以发布关于各种版本的其他细节 我系统的组件。就像我说的,我是新手,所以现在 我更希望进入一个方向而不是决赛 答案。
非常感谢,
亚当麦克勒答案 0 :(得分:3)
你遇到了一个BouncyCastle错误。我不确定它是否已修复。我最终使用了自己的PKCS10CertificateRequest。您只需要在构造函数中更改这一行,
this.sigAlgId = new AlgorithmIdentifier(sigOID, null);
到
this.sigAlgId = new AlgorithmIdentifier(sigOID);
答案 1 :(得分:1)
旧帖我知道,但是由于这篇文章,我遇到了同样的问题并解决了它。好像这个'bug'还在。针对2.3 Android。
通过使用反射来解决它,所以只想在这里分享。只需注入'正确'的构造AlgorithmIdentifier。
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.