Java PKCS10CertificationRequest在android上创建

Java PKCS10CertificationRequest在android上创建,java,android,bouncycastle,csr,Java,Android,Bouncycastle,Csr,我对android和java都很陌生,所以希望我错过了 这里简单点。我只想创建一个简单的PKCS10 证书签名请求。我有一些代码可以编译和修改 在我的ubuntu盒(java-6-openjdk)上运行,但抛出一个空指针 android emulator中的异常: KeyPair myKeyPair = KeyPairGenerator.getInstance("RSA").generateKeyPair(); X500Principal subject = ne

我对android和java都很陌生,所以希望我错过了 这里简单点。我只想创建一个简单的PKCS10 证书签名请求。我有一些代码可以编译和修改 在我的ubuntu盒(java-6-openjdk)上运行,但抛出一个空指针 android emulator中的异常:

        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)
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):位于org.bouncycastle.asn1.ASN1Collection.addObject(ASN1Collection.java:95)
06-22 04:41:06.353:WARN/System.err(337):位于org.bounchycastle.asn1.DERSequence.(DERSequence.java:34)
06-22 04:41:06.433:WARN/System.err(337):位于org.bounchycastle.asn1.x509.algorithmidentier.toASN1Object(algorithmidentier.java:
124)
06-22 04:41:06.453:WARN/System.err(337):位于org.bounchycastle.asn1.ASN1Encodable.getDERObject(ASN1Encodable.java:
77)
06-22 04:41:06.483:WARN/System.err(337):位于org.bounchycastle.asn1.DEROutputStream.writeObject(DEROutputStream.java:
74)
06-22 04:41:06.523:WARN/System.err(337):位于org.bounchycastle.asn1.DERSequence.encode(DERSequence.java:70)
06-22 04:41:06.544:WARN/System.err(337):位于org.bounchycastle.asn1.DEROutputStream.writeObject(DEROutputStream.java:
74)
06-22 04:41:06.593:WARN/System.err(337):位于org.bounchycastle.jce.PKCS10CertificationRequest.getEncoded(PKCS10CertificationRequest.java:
443)
我已经在API级别7和8中尝试过这一点。我知道有一个 我可以发布大量关于各种版本的其他详细信息 我的系统的组件。就像我说的,我是新手,所以现在 我更多的是寻找一个前进的方向,而不一定是决赛 回答

非常感谢


Adam Mackler

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

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


以前的帖子我知道,但也遇到了同样的问题,多亏了这篇帖子才得以解决。看来这个“虫子”还在。以2.3安卓为目标

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

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.

谢谢你的回复,ZZ。你能告诉我你建议的改变——添加null第二个参数——是否对你在android平台上有效,如果是,是哪个版本?改变是删除null,而不是添加。这是在J2SE5上完成的,而不是在Android上。这个bug已经存在一段时间了。我怀疑安铎版本的重要性。啊,是的,你确实这么说了。我的错。而且你的修复看起来确实有效!我想让我不高兴的是(除了没有仔细阅读之外)最近的bouncycastle源代码将该null更改为DERNull的实例(称为instance)。安卓资源也做了同样的事情,但给它起了一个不同的名字(_)。我甚至不认为把它删掉就行了,但很明显它行了。非常感谢您抽出时间分享您的知识。你帮了大忙。
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.