निम्नलिखित कोड:बचत प्रमाणपत्र श्रृंखला
//used Bouncy Castle provider for keyStore
keyStore.setKeyEntry(alias, (Key)keyPair.getPrivate(), pwd, certChain);
जहां certChain अंत प्रमाण पत्र और प्रमाण पत्र जारीकर्ता (यानी दो प्रमाण पत्र) रखती है,
के हिस्से के रूप जारीकर्ता प्रमाणपत्र सहेजा नहीं करता कुंजीस्टोर PKCS12
का उदाहरण है, तो फ़ाइल सिस्टम कीस्टोर फ़ाइल में सहेजा गया श्रृंखला।
यह दोनों प्रमाणपत्रों को सहेजता है यदि कीस्टोर प्रकार PKCS12-3DES-3DES
है। यह क्यों है? क्या पीकेसीएस 12 का मानना है कि दोनों प्रमाण पत्र श्रृंखला का हिस्सा हैं?
संपादित करें: यहां एक SSCCE है। यह "JKS"
के साथ ठीक काम करता है, "PKCS12"
के साथ विफल रहता है: श्रृंखला में केवल पहला प्रमाणपत्र getCertificateChain(String)
के माध्यम से पहुंच योग्य है। सहेजी गई फाइल openssl pkcs12
दोनों प्रमाणपत्रों को प्रकट करने के साथ खोला जा सकता है।
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;
}
ओओआई, क्या ओरेकल (सनजेएसएसई प्रदाता) से पीकेसीएस 12 कीस्टोर प्रकार एक ही लक्षण प्रदर्शित करता है? यदि नहीं, तो यह बीसी मेलिंग सूची के लिए एक अच्छा सवाल हो सकता है। –
@ डंकन जोन्स: मैंने बीसी मेलिंग सूची में यह पूछा और – Cratylus
पर एक उत्तर नहीं मिला PKCS # 12 कुछ भी नहीं मानता क्योंकि यह किसी भी प्रमाणपत्र और उनकी निजी कुंजी के लिए एक कंटेनर है। तो यह कार्यान्वयन-विशिष्ट है जिसे पीकेसीएस # 12 कंटेनर में रखा जाएगा। –