Generieren X509Certificate mit bouncycastle X509v3CertificateBuilder

Ich versuche, auf port JXTA für die Ausführung auf der App Engine. Da die BouncyCastle "BC" - Anbieter wird noch nicht unterstützt, auf App Engine, habe ich zu port die bestehende JXTA-code zu generieren, ein X509Certificate-weiß-aufgeführten Klassen. Mein wissen über Crypto ist minimal und ich bin nicht sicher, dass das, was ich versuche zu erreichen, ist auch möglich. Hier ist der original-code aus PSEUtils.java von der JXTA Projekt:

PSEUtils.java

Gibt es eine helper-Klasse enthält die java.Sicherheit.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
}

In der Methode:

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

Ich bin die vorbeifahrenden Thema:

new X500Principal("CN="+useCN)

Schlüsselpaar als (von original-code):

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

und die jxta codiert IssuerInfo.

Nun, da kann ich nicht ziehen in die bouncycastle.jce-Pakete, die ich hatte, zu entfernen, die X509Principal und X509V3CertificateGenerator code, der JXTA verwendet und versucht, es zu ersetzen mit einer Implementierung, die entspricht mit der GAE Einschränkungen. Hier ist, was ich derzeit habe für den genCert-Methode mit 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);

Das problem ist, dass ich kann nicht keypair.getPublic().getEncoded() arbeiten mit der SubjectPublicKeyInfo.getInstance() Methode. Wirft java.lang.IllegalArgumentException: unbekanntes Objekt im Werk: [B

Öffentlichen Schlüssel scheint bevölkert zu sein bei der Prüfung:

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

Habe ich Folgendes gefunden, SO link, der zeigt, dieser code funktioniert:

Zeichen CSR mit Hüpfburg

Mein Versuch, zu konvertieren genCert ist unten, aber aus irgendeinem Grund, ich kann nicht vorbei an der Erstellung SubjectPublicKeyInfo aus den kodierten öffentlichen Schlüssel?

Jede Hilfe wird sehr geschätzt.

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

Schreibe einen Kommentar