我正在编写Java 8应用程序,并希望使用自签名证书设置一个简单的密钥库和信任库。
通常情况如下:
openssl
创建密钥对+证书。keytool
现在我只想使用openssl
并创建.p12密钥库而不是.jks密钥库。
使用以下命令创建.p12密钥库效果很好:
# Create private key and certificate
openssl req -x509 -newkey rsa:"${rsa}" -sha256 \
-keyout "${key}" \
-out "${cert}" \
-days "${days}"
# Create .p12 keystore
openssl pkcs12 -export -in "${cert}" -inkey "${key}" -out "${keystore}"
这个密钥库似乎工作正常,因为在我的Java应用程序中提供相应的.jks信任将获得TLS连接。但是我无法让.p12信任库工作。
我尝试按照建议here创建信任库:
# Create .p12 truststore
openssl pkcs12 -export -nokeys -in "${cert}" -out "${truststore}"
然后像这样加载:
FileInputStream fis = new FileInputStream(new File(trustorePath));
KeyStore trustStore = KeyStore.getInstance("PKCS12");
trustStore.load(fis, truststorePassword.toCharArray());
fis.close();
但我在我的java代码中收到以下异常:
意外错误:java.security.InvalidAlgorithmParameterException: trustAnchors参数必须为非空
任何想法我做错了什么?
(非常感谢使用带有Java 8的.p12信任库的工作片段。)
答案 0 :(得分:8)
此行为的可能解释:
Java 7之前的标准PKCS#12提供程序不允许受信任 证书条目。 JSSE参考指南说明了这一点:
不支持在PKCS12密钥库中存储受信任的证书。 PKCS12主要用于提供与关联的私钥 证书链。它没有“信任”的概念 证书。在互操作性方面,其他PKCS12供应商也有 同样的限制。浏览器,如Mozilla和Internet Explorer 不接受仅包含可信证书的PKCS12文件。
这在Java 8中有所改变,它支持可信证书 在PKCS#12中 - 如果它们标有特殊属性(OID 2.16.840.1.113894.746875.1.1):
openssl pkcs12 -in microsoft.p12 -info MAC Iteration 1024 MAC verified OK PKCS7 Encrypted data: pbeWithSHA1And40BitRC2-CBC, Iteration 1024 Certificate bag Bag Attributes friendlyName: microsoft it ssl sha2 (baltimore cybertrust root) 2.16.840.1.113894.746875.1.1: <Unsupported tag 6>
来源: