다음 코드 : certChain 최종 인증서 발급자 인증서 (즉, 두 개의 인증서)를 보유하고저장 인증서 체인
//used Bouncy Castle provider for keyStore
keyStore.setKeyEntry(alias, (Key)keyPair.getPrivate(), pwd, certChain);
이
이의 일환으로 발급자 인증서를 저장하지 않습니다 키 스토어가 PKCS12
의 인스턴스 인 경우 파일 시스템 키 스토어 파일에 저장됩니다.
키 저장소 유형이 PKCS12-3DES-3DES
인 경우 두 인증서를 모두 저장합니다. 이유가 무엇인가요? PKCS12가 두 인증서를 모두 체인의 일부로 간주하지 않습니까?
편집 : 여기에 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;
}
OOI, 무엇입니까? 그렇지 않은 경우 BC 메일 링리스트에 대한 좋은 질문 일 수 있습니다. –
@DuncanJones : BC 메 일링 목록에서이 질문을하고 1 주일 이상 회신을받지 못했습니다. – Cratylus
PKCS # 12는 인증서와 개인 키의 수에 상관없이 아무 것도 가정하지 않습니다. 따라서 PKCS # 12 컨테이너에 구현 될 구현에 따라 달라집니다. –