当前位置: 首页 > 知识库问答 >
问题:

使用openssl创建. p12信任库

龙俊英
2023-03-14

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

通常情况如下:

  1. 使用openssl创建密钥对证书。
  2. 使用keytools
  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信任库工作。

我尝试按照这里的建议创建信任库:

# 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.无效算法参数异常:信任锚参数必须为非空

知道我做错了什么吗?

(非常感谢使用.p12 truststore和Java 8编写一个工作代码段。)

共有2个答案

夹谷辰沛
2023-03-14

我还没有找到用openssl做这件事的方法,尽管我已经找到了用keytools(OpenJDK套件的一部分)做这件事的方法。

我需要创建一个包含CA证书的密钥库,其2.16.840.1.113894.746875.1.1:

此命令使用具有2.16.840.1.113894.746875.1.1的CA证书(假设您已经拥有CA)创建PKCS12:

keytool -storepass '***' -import -alias ca -file ***/ca.crt.pem -keystore ***/ca.p12 -deststoretype PKCS12

此命令将附加的PEM编码证书及其私钥转换为PKCS12:

openssl pkcs12 -in ***/additional.cert.pem -inkey ***/additional.key.pem -name additional -export -out ***/additional.p12

此命令将包含CA证书的PKCS12密钥库合并到包含附加密钥及其私钥的PKCS12密钥库:

keytool -importkeystore -srckeystore ***/ca.p12 -srcstoretype pkcs12 -srcstorepass '***' -destkeystore ***/additional.p12 -deststoretype pkcs12 -deststorepass '***'

梁池暝
2023-03-14

这种行为的一种可能解释是:

直到Java7的标准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>

资料来源:

  • https://github.com/kaikramer/keystore-explorer/issues/35
  • https://github.com/kaikramer/keystore-explorer/issues/11
 类似资料:
  • 我可以使用keytool命令将Java信任库(只有证书的JKS文件,没有私钥)导出到p12文件: 然而,我似乎不知道如何使用“openssl pkcs12”命令创建相同的文件。它允许您传入证书,但我尝试的每个选项都要求用户传入私钥。

  • 然后,为了生成CA要求的,我执行了以下操作: CA使用我存储在名为的文件中的证书进行响应 现在我想将必要的组件(私钥、公钥(?)和证书)捆绑到单个中。为此,我运行了以下操作: 但我收到以下错误消息: 我怎样才能完成这件事呢?

  • 问题内容: 据我了解,密钥库通常会保存私钥/公钥,而信任库通常只保存公钥(并且代表您打算与之通信的受信任方的列表)。好吧,这是我的第一个假设,因此,如果这不正确,那么我可能起步并不顺利… 我很想了解使用keytool时如何/何时区分商店。 因此,到目前为止,我已经使用 这将创建我的keystore.ks文件。我回答了我是否信任bob的问题,但是我不清楚这是否创建了密钥库文件或信任库文件?我可以将我

  • 我正在使用OpenSSL以避免为此付费。我的服务器正在运行IIS 8和Windows server 2012。 我创建证书的方式是: openssl请求-new-key cakey.pem-x509-days 1825-extensions v3_ca-out ca.crt 最后,我使用以下内容签署了证书请求: openssl x509-req-days 365-in certreq.txt-ca

  • 我正在尝试验证使用BearSSL在嵌入式设备上使用OpenSSL创建的ECDSA签名。 首先,我使用OpenSSL创建了一个私钥并提取了公钥: 然后我提取了原始公钥: 我有一个,它只包含,并使用以下命令对此进行签名: 现在,它包含ASN1格式的签名,长度如预期的那样为72个字节: 现在到嵌入部分。我首先包括数据、签名和公钥: 此外,出于偏执,我比较了和我的字符串的md5和,然后再进行进一步的快速检