Zertifikatskette in einem pkcs12 Keystore speichern

Folgenden code:

//used Bouncy Castle provider for keyStore
keyStore.setKeyEntry(alias, (Key)keyPair.getPrivate(), pwd, certChain);  

wo certChain hält die end-Zertifikat und das Aussteller-Zertifikat (d.h. es sind zwei Zertifikate),
nicht speichern Sie die Aussteller-Zertifikat als Teil der Kette an, die gespeichert, um die Datei-system-keystore-Datei, wenn der keyStore ist eine Instanz von PKCS12.

Es tut speichern sowohl die Zertifikate, wenn die keystore-Typ PKCS12-3DES-3DES.
Warum ist das so? Nicht eine PKCS12 angenommen haben beide Zertifikate sind Teil der Kette?

EDIT: Hier ist ein SSCCE. Dies funktioniert gut mit "JKS"schlägt mit "PKCS12": Nur das erste Zertifikat in der Kette ist zugänglich über getCertificateChain(String). Die gespeicherte Datei kann geöffnet werden mit openssl pkcs12 die sowohl Zertifikate.

    public void testKeyStore() {
    try {
        KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
        keyPairGenerator.initialize(1024);
        KeyPair keyPair = keyPairGenerator.generateKeyPair();
        PublicKey publicKey = keyPair.getPublic();
        PrivateKey privateKey = keyPair.getPrivate();
        Certificate[] outChain = { createCertificate("CN=CA", publicKey, privateKey), createCertificate("CN=Client", publicKey, privateKey) };

        KeyStore outStore = KeyStore.getInstance("PKCS12");
        outStore.load(null, "secret".toCharArray());
        outStore.setKeyEntry("mykey", privateKey, "secret".toCharArray(), outChain);            
        OutputStream outputStream = new FileOutputStream("c:/outstore.pkcs12");
        outStore.store(outputStream, "secret".toCharArray());
        outputStream.flush();
        outputStream.close();

        KeyStore inStore = KeyStore.getInstance("PKCS12");      
        inStore.load(new FileInputStream("c:/outstore.pkcs12"), "secret".toCharArray());
        Key key = outStore.getKey("myKey", "secret".toCharArray());
        assertEquals(privateKey, key);

        Certificate[] inChain = outStore.getCertificateChain("mykey");
        assertNotNull(inChain);
        assertEquals(outChain.length, inChain.length);
    } catch (Exception e) {
        e.printStackTrace();
        fail(e.getMessage());
    }
}

private static X509Certificate createCertificate(String dn, PublicKey publicKey, PrivateKey privateKey) throws Exception {
    X509V3CertificateGenerator certGenerator = new X509V3CertificateGenerator();
    certGenerator.setSerialNumber(new BigInteger("1"));
    certGenerator.setIssuerDN(new X509Name(dn));
    certGenerator.setSubjectDN(new X509Name(dn));
    certGenerator.setNotBefore(Calendar.getInstance().getTime());
    certGenerator.setNotAfter(Calendar.getInstance().getTime());
    certGenerator.setPublicKey(publicKey);
    certGenerator.setSignatureAlgorithm("SHA1withRSA");
    X509Certificate certificate = (X509Certificate)certGenerator.generate(privateKey, "BC");
    return certificate;
}

InformationsquelleAutor der Frage Cratylus | 2012-11-03

Schreibe einen Kommentar