使用openssl创建.p12信任库

时间:2017-03-13 15:06:53

标签: java ssl openssl

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

通常情况如下:

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

1 个答案:

答案 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>

来源: