【发布时间】:2017-08-03 15:56:16
【问题描述】:
我正在编写一个 Java 8 应用程序,并希望使用自签名证书设置一个简单的密钥库和信任库。
通常情况如下:
- 使用
openssl创建密钥对 + 证书。 - 使用
keytool创建一个 .jks 密钥库 + .jks 信任库
现在我只想使用 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 信任库的工作 sn-p。)
【问题讨论】:
-
信任库通常不包含私钥。可能这会让 Java 感到困惑吗?如果不需要,请删除私钥或再次添加没有私钥的证书。
-
我试过你的截图,它使用 openssl 0.9.8zh 和 oracle jdk 1.8.0_121 工作,很奇怪
-
keytool可能是一个更容易使用的工具。