PKCS10CertificationRequest создание на Android - PullRequest
2 голосов
/ 22 июня 2010

Я очень новичок в Android и Java, так что, надеюсь, я скучаю здесь легко Все, что я хочу сделать, это создать простой PKCS10 запрос на подпись сертификата. У меня есть код, который скомпилирует и запустить на моем Ubuntu Box (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 (), происходит сбой на эмулятор андроида; это трассировка стека:

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. Я знаю, что есть тонну других деталей, которые я мог бы опубликовать о версиях различных компоненты моей системы. Как я уже сказал, я новичок в этом, так прямо сейчас Я больше ищу направление, чем обязательно финал ответить.

Большое спасибо,

Адам Маклер

Ответы [ 2 ]

3 голосов
/ 23 июня 2010

Вы столкнулись с ошибкой BouncyCastle.Я не уверен, что это исправлено.В итоге я использовал свой собственный PKCS10CertificateRequest.Вам просто нужно изменить одну строку в конструкторе,

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

на

   this.sigAlgId = new AlgorithmIdentifier(sigOID);
1 голос
/ 16 марта 2012

Старый пост я знаю, но просто столкнулся с той же проблемой и решил ее благодаря этому посту.Похоже, эта «ошибка» все еще рядом.Ориентация на Android 2.3.

Решил с помощью рефлексии, поэтому просто хотел поделиться этим здесь.Просто введите «правильный» созданный 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.
...