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
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dein code hat 2 Fehler:
erste: Sie nicht gesetzt Issuer-Zertifikat (client-cert ausgestellt werden sollte von CA, um gültige Kette).
zweite: Sie verwenden falsche Reihenfolge beim erstellen einer Zertifikatkette (sollte client-ferts, CA-last)
hier wird überarbeitet, SSCCE, und es funktioniert ohne Fehler.
InformationsquelleAutor der Antwort user1516873
Je nachdem, mit welchem JDK Sie verwenden, gibt es verschiedene Wege, um die Anwendung Verpacken. Es passiert mit uns, wenn einige Leute bei denen die Verwendung von Linux und OpenJDK und einige andere in der Entwicklung auf Windows mit SunJDK (Oracle).
Den neuesten haben einige zusätzliche Konfiguration zu tun, um der Lage sein, die stärksten algorithmen. Dieser Artikel kann Ihnen helfen, wenn Ihr problem mit der JCE-Richtlinie.
InformationsquelleAutor der Antwort рüффп