使用openssl创建.p12信任库

vto*_*osh 5 java ssl openssl

我正在编写Java 8应用程序,并希望使用自签名证书设置一个简单的密钥库和信任库.

通常情况如下:

  1. 使用创建密钥对+证书openssl.
  2. 使用创建.jks密钥库+ .jks信任库 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信任库的工作代码段.)

vto*_*osh 9

这种行为的可能解释:

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>
Run Code Online (Sandbox Code Playgroud)

资源:

  • 我在"1.8.0_171"并且这不起作用,仅包含证书的PKCS12给出"trustAnchors参数必须为非空"错误 (4认同)

Vol*_*nyk 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)