Der folgende Code:Speicher von Zertifikatskette in einem pkcs12 Schlüsselspeicher
//used Bouncy Castle provider for keyStore
keyStore.setKeyEntry(alias, (Key)keyPair.getPrivate(), pwd, certChain);
wo certChain das End-Zertifikat und das Ausstellerzertifikat hält (dh zwei Zertifikate),
nicht das Aussteller-Zertifikat im Rahmen der speichern Die Keystore-Datei wird in der Datei gespeichert, wenn der Schlüsselspeicher eine Instanz von PKCS12
ist.
Es speichert beide Zertifikate, wenn der Keystore-Typ PKCS12-3DES-3DES
ist. Warum ist das? Nimmt ein PKCS12 nicht an, dass beide Zertifikate Teil der Kette sind?
EDIT: Hier ist ein SSCCE. Dies funktioniert gut mit "JKS"
, schlägt mit "PKCS12"
: Nur das erste Zertifikat in der Kette ist über getCertificateChain(String)
zugänglich. Die gespeicherte Datei kann mit openssl pkcs12
geöffnet werden, wobei beide Zertifikate angezeigt werden.
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;
}
OOI, zeigt der PKCS12-Keystore-Typ von Oracle (SunJSSE-Anbieter) die gleichen Symptome? Wenn nicht, dann könnte dies eine gute Frage für die BC-Mailingliste sein. –
@DuncanJones: Ich fragte diese in BC Mailing-Liste und erhielt keine Antwort für mehr als eine Woche – Cratylus
PKCS # 12 nimmt nichts an, da es ein Container für eine beliebige Anzahl von Zertifikaten und ihre privaten Schlüssel ist. Es ist also implementierungsspezifisch, was in den PKCS # 12-Container gestellt wird. –