3

私はAndroidとJavaの両方に非常に慣れていないので、ここで簡単なものが欠けていることを願っています。私がやりたいのは、単純なPKCS10証明書署名要求を作成することだけです。私のubuntuボックス(java-6-openjdk)でコンパイルして実行するコードがいくつかありますが、Androidエミュレーターでnullポインター例外をスローします:

        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を使用することになりました。コンストラクターでこの1行を変更する必要があります。

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

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

私が知っている古い投稿ですが、同じ問題に遭遇し、この投稿のおかげでそれを解決しました。この「バグ」はまだ残っているようです。2.3Androidをターゲットにしています。

リフレクションを使用して解決したので、ここで共有したいと思います。「正しい」構成された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.
于 2012-03-16T09:49:38.620 に答える