Pregunta

Estoy muy nuevo en Android y Java tanto, así que espero que me falta algo fácil aquí. Todo lo que quiero hacer es crear una sencilla PKCS # 10 Solicitud de firma de certificado. Tengo un código que compilará y correr en mi caja de ubuntu (java-6-OpenJDK), pero arroja un puntero nulo excepción en el emulador de 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);

En el depurador puedo ver que he construido un parecer PKCS10CertificationRequest, pero no puede hacer nada con ella (como getEncoded () o incluso toString ()) sin error. Cuando llamo getEncoded () se produce un error en la emulador androide; este es el seguimiento de la pila:

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)

He intentado esto con tanto a nivel de API 7 y 8. Yo sé que hay una tonelada de otros detalles que pude escribir sobre las versiones de varios componentes de mi sistema. Como dije, soy nuevo en esto, así que en este momento Estoy más en busca de una dirección a seguir necesariamente que una final respuesta.

Muchas gracias,

Adam Mackler

¿Fue útil?

Solución

Se encontró con un error BouncyCastle. No estoy seguro de que es fija. Acabé usando mi propia PKCS10CertificateRequest. Sólo tiene que cambiar esta línea en el constructor,

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

a

   this.sigAlgId = new AlgorithmIdentifier(sigOID);

Otros consejos

Mensaje viejo lo sé, pero acabo de encontrar con el mismo problema y lo resolvió gracias a este post. Parece que este 'bug' todavía está alrededor. Dirigidas a un 2.3 Android.

solucionado mediante el uso de la reflexión, por lo que sólo quería compartir eso aquí. Sólo la inyección de la 'correcta' contructed 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.
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top