【发布时间】:2012-10-23 19:53:56
【问题描述】:
以下代码:
//used Bouncy Castle provider for keyStore
keyStore.setKeyEntry(alias, (Key)keyPair.getPrivate(), pwd, certChain);
其中 certChain 持有最终证书和颁发者证书(即两个证书),
如果 keyStore 是 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,来自 Oracle(SunJSSE 提供程序)的 PKCS12 密钥库类型是否表现出相同的症状?如果不是,那么这对于 BC 邮件列表来说可能是一个很好的问题。
-
@DuncanJones:我在 BC 邮件列表中问过这个问题,一个多星期没有得到回复
-
PKCS#12 没有任何假设,因为它是任意数量的证书及其私钥的容器。因此,将放入 PKCS#12 容器的内容是特定于实现的。
-
@EugeneMayevski'EldoSCorp:但我所做的只是将链作为关键条目的一部分。当然这不是出于某种原因不支持的东西
-
@EugeneMayevski'EldoSCorp: 好吧。换一种说法。
PKCS12-3DES-3DES不仅仅在加密方案上有所不同?那么为什么行为会有所不同呢?
标签: java security ssl bouncycastle digital-certificate