Générer X509Certificate à l'aide de bouncycastle X509v3CertificateBuilder

Je suis d'essayer de port JXTA à exécuter sur App Engine. Étant donné que la BouncyCastle "BC" fournisseur n'est pas encore pris en charge sur App Engine, j'ai du port de l'existant JXTA le code pour générer un X509Certificate à l'aide de la liste blanche des classes. Ma connaissance de la Crypto est minime et je ne suis pas certaine que ce que je suis en train d'accomplir est encore possible. Voici le code d'origine de PSEUtils.java à partir de la JXTA projet:

PSEUtils.java

Il y a une classe d'assistance qui contient le java.de sécurité.cert.X509Certificate:

public static class IssuerInfo {
    public X509Certificate cert; //subject Cert
    public PrivateKey subjectPkey; //subject private key
    public X509Certificate issuer; //issuer Cert
    public PrivateKey issuerPkey; //issuer private key
}

Dans la méthode:

public static IssuerInfo genCert(X500Principal subject, KeyPair keypair, IssuerInfo issuerinfo)

Je suis de passage dans le sujet:

new X500Principal("CN="+useCN)

paire de clés que (à partir du code original):

KeyPairGenerator g = KeyPairGenerator.getInstance("RSA");
g.initialize(1024, UTILS.srng);
KeyPair keypair = g.generateKeyPair();

et la jxta codé IssuerInfo.

Maintenant, puisque je ne peux pas tirer dans le bouncycastle.la jce de paquets, j'ai dû enlever le X509Principal et X509V3CertificateGenerator code JXTA usages et de tenter de la remplacer avec une mise en œuvre conforme à la FGA restrictions. Voici ce que j'ai actuellement pour la genCert méthode à l'aide de org.bouncycastle.X509.X509v3CertificateBuilder.

SubjectPublicKeyInfo subPubKeyInfo =  SubjectPublicKeyInfo.getInstance(keypair.getPublic().getEncoded());

X509v3CertificateBuilder v3CertGen = new X509v3CertificateBuilder(
     new X500Name(issuer.getName()), 
     BigInteger.ONE, 
     today, until, 
     new X500Name(subject.getName()), 
     subPubKeyInfo);

Le problème est que je n'arrive pas keypair.getPublic().getEncoded() de travailler avec le SubjectPublicKeyInfo.getInstance() méthode. Jette java.lang.IllegalArgumentException: objet inconnu dans l'usine: [B

Clé publique semble être renseigné lors de l'inspection:

Sun RSA public key, 1024 bits
  modulus: 117521430893506212334140912845641570591161279468597426442875306202350445904550279678434051874985419676760802566018092318362676224355315431299979507080364677679613392086245588766565617009250512996843008784370448997729071786062596049780632058501646041736216482596596901215941577208285499619376322050871534546271
  public exponent: 65537

J'ai trouvé la suite DONC, le lien qui démontre le présent code de travail:

Signe de la RSE à l'aide de Château Gonflable

Ma tentative de convertir genCert est en dessous, mais pour une raison quelconque, je ne peux pas obtenir au-delà de la création de SubjectPublicKeyInfo de la encodée à clé publique?

Toute aide est grandement appréciée.

public static IssuerInfo genCert(X500Principal subject, KeyPair keypair, IssuerInfo issuerinfo)  {
    IssuerInfo info = new IssuerInfo();
    try {
        //set up issuer
        PrivateKey signer;
        X500Principal issuer;

        if (null == issuerinfo) { //self-signed root cert
            signer = keypair.getPrivate();
            issuer = new X500Principal(subject.getEncoded());
        } else { //issuer signed service sert
            signer = issuerinfo.subjectPkey;
            X500Principal issuer_subject = issuerinfo.cert.getSubjectX500Principal();
            issuer = new X500Principal(issuer_subject.getEncoded());
        }

        //set validity 10 years from today
        Date today = new Date();
        Calendar cal = Calendar.getInstance();

        cal.setTime(today);
        cal.add(Calendar.YEAR, 10);
        Date until = cal.getTime();

        SubjectPublicKeyInfo subPubKeyInfo =  SubjectPublicKeyInfo.getInstance(keypair.getPublic().getEncoded());

    //**Can't get here so i'm not sure if the rest of this works?**

        AlgorithmIdentifier sigAlgId = new DefaultSignatureAlgorithmIdentifierFinder().find("SHA1withRSA");
        AlgorithmIdentifier digAlgId = new DefaultDigestAlgorithmIdentifierFinder().find(sigAlgId);

        RSAPrivateCrtKeyParameters cps = (RSAPrivateCrtKeyParameters) keypair.getPrivate();
        ContentSigner sigGen = new BcRSAContentSignerBuilder(sigAlgId, digAlgId).build(cps);            

     X509CertificateHolder certHolder = v3CertGen.build(sigGen);

     CertificateFactory cf = CertificateFactory.getInstance("X.509");

     //Read user Certificate
     InputStream is1 = new ByteArrayInputStream(certHolder.getEncoded());
     X509Certificate eeCert = (X509Certificate) cf.generateCertificate(is1);
     is1.close();
InformationsquelleAutor Chuck D | 2012-03-30