2017-01-06 2 views
0

J'essaie de générer mon propre CSR pour mon keystore, mais cela ne s'est pas bien passé et cette erreur me perturbe. Voici mon code:"Les données ne sont pas un ID d'objet (tag = 49)" lors de la génération du certificat X509

import java.io.BufferedInputStream; 
import java.io.File; 
import java.io.FileInputStream; 
import java.io.FileOutputStream; 
import java.io.FileWriter; 
import java.io.IOException; 
import java.security.GeneralSecurityException; 
import java.security.KeyPair; 
import java.security.KeyPairGenerator; 
import java.security.KeyStore; 
import java.security.KeyStoreException; 
import java.security.NoSuchAlgorithmException; 
import java.security.cert.CertificateException; 
import java.security.cert.CertificateFactory; 
import java.security.cert.X509Certificate; 
import java.security.interfaces.RSAPrivateKey; 
import java.security.interfaces.RSAPublicKey; 
import org.bouncycastle.asn1.x500.X500Name; 
import org.bouncycastle.asn1.x500.X500NameBuilder; 
import org.bouncycastle.asn1.x500.style.BCStyle; 
import org.bouncycastle.openssl.PEMWriter; 
import org.bouncycastle.operator.ContentSigner; 
import org.bouncycastle.operator.OperatorCreationException; 
import org.bouncycastle.operator.jcajce.JcaContentSignerBuilder; 
import org.bouncycastle.pkcs.PKCS10CertificationRequest; 
import org.bouncycastle.pkcs.PKCS10CertificationRequestBuilder; 
import org.bouncycastle.pkcs.jcajce.JcaPKCS10CertificationRequestBuilder; 

public class CreateKeyTest { 

    public static void main(String[] args) throws OperatorCreationException, IOException, GeneralSecurityException { 
    KeyPairGenerator kpg; 
    KeyPair kp; 
    RSAPublicKey pubKey; 
    RSAPrivateKey privKey; 

    FileOutputStream out; 
    KeyStore ks; 
    FileInputStream in; 
    FileInputStream bFis; 

    try { 
     ks = KeyStore.getInstance("JKS"); 

     kpg = KeyPairGenerator.getInstance("RSA"); 
     kpg.initialize(1024); 
     kp = kpg.generateKeyPair(); 
     pubKey = (RSAPublicKey) kp.getPublic(); 
     privKey = (RSAPrivateKey) kp.getPrivate(); 

     // generate CSR 
     ContentSigner sign = new JcaContentSignerBuilder("SHA1withRSA").build(privKey); 

     X500NameBuilder nBuilder = new X500NameBuilder(); 
     nBuilder.addRDN(BCStyle.CN, "TestCSR"); 
     nBuilder.addRDN(BCStyle.C, "ER"); 
     nBuilder.addRDN(BCStyle.E, "[email protected]"); 
     X500Name name = nBuilder.build(); 

     PKCS10CertificationRequestBuilder cerReq = new JcaPKCS10CertificationRequestBuilder(name, pubKey); 
     PKCS10CertificationRequest request = cerReq.build(sign); 

     PEMWriter pWr = new PEMWriter(new FileWriter(new File("D:\\test.csr"))); 
     pWr.writeObject(request); 
     pWr.flush(); 
     pWr.close(); 

     bFis = new FileInputStream("D:\\test.csr"); 
     BufferedInputStream ksbufin = new BufferedInputStream(bFis); 
     X509Certificate certificate = (X509Certificate) CertificateFactory.getInstance("X.509") 
       .generateCertificate(ksbufin); 

     ks.setKeyEntry("RSA_key", kp.getPrivate(), "changeit".toCharArray(), 
       new java.security.cert.Certificate[] { certificate }); 

     out = new FileOutputStream("key.store"); 
     ks.store(out, "changeit".toCharArray()); 

     System.out.println("New Keystore Generated"); 
     out.close(); 
    } catch (KeyStoreException | IOException | CertificateException | NoSuchAlgorithmException 
      | OperatorCreationException e) { 
     System.out.println(e.getMessage()); 
     e.printStackTrace(); 
    } 
} 
} 

Quand je l'exécute, il m'a montré l'exception: X509.ObjectIdentifier() -- data isn't an object ID (tag = 49), et il pourrait être de retour à generateCertificate(ksbufin) retracée. Mais j'ai vérifié test.cer et il a des données de certificat là-dedans, et ce message d'exception m'a dérouté, je ne sais même pas ce que cela signifie (object ID? tag = 49? Je n'ai pas vu que j'ai généré un ID dans mon code).

Quelqu'un peut-il m'aider dans cette boue?

Répondre

0

Le message d'erreur est correct,test.csrne contient pas de certificat. Vous l'avez construit en utilisant un PKCS10CertificationRequest, il contient donc une demande de signature de certificat (CSR).

Vous avez généré une paire de clés, privée et publique, ainsi qu'une demande de signature de certificat. Le CSR est une demande de certificat à une autorité de certification (CA). Il contient la clé publique et certains attributs attendus pour le certificat (CN, C, OU, etc.). CSR est signé avec la clé privée et doit être envoyé à CA. L'autorité de certification extrait la clé publique, génère un certificat et le signe. Voir Certificate enrollment process

Si vous voulez un certificat, vous devez faire signer le certificat par l'AC

+0

hmm, que 'X509.ObjectIdentifier() - données ne sont pas un ID d'objet (tag = 49) 'ne ressemble pas à me dire cela à première vue. Je me demande pourquoi ils n'écrivent pas la raison plus clairement? – Kaninchen

+0

Eh bien, on dirait que j'ai 1 fragment manquant. merci de résoudre ma confusion. – Kaninchen