2010-06-22 35 views
2

Je suis très nouveau à android et java à la fois, donc j'espère que je manque quelque chose de facile ici. Tout ce que je veux faire est de créer une simple demande de signature de certificat PKCS10 . J'ai un code qui compilera et course sur ma boîte ubuntu (java-6-openjdk), mais jette un pointeur NULL exception dans l'émulateur Android:PKCS10CertificationDemande de création sur 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); 

Dans le débogueur, je peux voir que j'ai apparemment construit un PKCS10CertificationRequest, mais je ne peux rien faire avec (comme getEncoded() ou même toString()) sans erreur. Quand j'appelle getEncoded() il échoue sur l'émulateur android ; c'est la trace de la pile:

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) 

Je l'ai essayé avec les deux niveaux de l'API 7 et 8. Je sais qu'il ya une tonne d'autres détails que je pouvais poster sur les versions de divers composants de mon système. Comme je l'ai dit, je suis nouveau à ce sujet, donc maintenant Je suis plus à la recherche d'une direction à entrer que nécessairement une réponse finale .

Merci beaucoup,

Adam Mackler

Répondre

3

Vous avez couru dans un bug BouncyCastle. Je ne suis pas sûr que ce soit corrigé. J'ai fini par utiliser ma propre PKCS10CertificateRequest. Vous avez juste besoin de changer cette une ligne dans le constructeur,

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

à

this.sigAlgId = new AlgorithmIdentifier(sigOID); 
+0

Merci pour votre réponse, ZZ. Pouvez-vous me dire si ce changement que vous suggérez - en ajoutant le deuxième argument nul - a fonctionné pour vous sur la plate-forme android et si oui quelle version? –

+0

Le changement est de supprimer null, pas ajouter. Cela a été fait sur J2SE 5, pas sur Android. Ce bug existe depuis un moment. Je doute que la version d'Andoid soit importante. –

+0

Ah, oui, vous l'avez dit. Ma faute. Et votre solution semble fonctionner! Je pense que ce qui m'a égaré (en plus de ne pas lire attentivement), c'est que les sources bouncycastle les plus récentes ont changé cette valeur null pour une instance de DERNull (appelée INSTANCE). Et les sources Android ont fait la même chose, mais lui ont donné un nom différent (THE_ONE). Je ne pensais même pas que ça ne marcherait pas, mais apparemment c'est le cas. Merci beaucoup d'avoir pris le temps de partager vos connaissances. Vous avez été très utile. –

1

poste Je sais, mais juste rencontré le même problème et résolu grâce à ce poste. On dirait que ce 'bug' est toujours là. Cibler un Android 2.3.

Résolu en utilisant la réflexion, alors je voulais juste partager cela ici. Il suffit d'injecter l'identificateur AlgorithmIdentifier «correct».

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.