我正在编写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}"
Run Code Online (Sandbox Code Playgroud)
这个密钥库似乎工作正常,因为在我的Java应用程序中提供相应的.jks信任将获得TLS连接.但是我无法让.p12信任库工作.
我尝试按照此处的建议创建信任库:
# Create .p12 truststore
openssl pkcs12 -export -nokeys -in "${cert}" -out "${truststore}"
Run Code Online (Sandbox Code Playgroud)
然后加载它像这样:
FileInputStream fis = new FileInputStream(new File(trustorePath));
KeyStore trustStore = KeyStore.getInstance("PKCS12");
trustStore.load(fis, truststorePassword.toCharArray());
fis.close();
Run Code Online (Sandbox Code Playgroud)
但我在我的java代码中收到以下异常:
意外错误:java.security.InvalidAlgorithmParameterException:trustAnchors参数必须为非空
我有什么想法我做错了吗?
(非常感谢使用带有Java 8的.p12信任库的工作代码段.)
这种行为的可能解释:
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):
Run Code Online (Sandbox Code Playgroud)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>
资源:
我还没有找到使用 openssl 执行此操作的方法,尽管我找到了使用 keytool(OpenJDK 套件的一部分)执行此操作的方法。
我需要创建一个密钥库,其中包含具有该2.16.840.1.113894.746875.1.1: <Unsupported tag 6>属性的 CA 证书和一个附加证书及其不具有该属性的密钥。我想与其他通过谷歌搜索找到此页面的人分享解决方案openssl "2.16.840.1.113894.746875.1.1":-)
此命令使用 CA 证书创建 PKCS12(假设您已经有一个 CA),其2.16.840.1.113894.746875.1.1: <Unsupported tag 6>属性为:
keytool -storepass '***' -import -alias ca -file ***/ca.crt.pem -keystore ***/ca.p12 -deststoretype PKCS12
Run Code Online (Sandbox Code Playgroud)
此命令将附加 PEM 编码的证书及其私钥转换为 PKCS12:
openssl pkcs12 -in ***/additional.cert.pem -inkey ***/additional.key.pem -name additional -export -out ***/additional.p12
Run Code Online (Sandbox Code Playgroud)
此命令将包含 CA 证书的 PKCS12 密钥库合并到包含附加密钥及其私钥的 PKCS12 密钥库:
keytool -importkeystore -srckeystore ***/ca.p12 -srcstoretype pkcs12 -srcstorepass '***' -destkeystore ***/additional.p12 -deststoretype pkcs12 -deststorepass '***'
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4558 次 |
| 最近记录: |