首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何将证书链添加到JKS

如何将证书链添加到JKS
EN

Stack Overflow用户
提问于 2015-08-04 21:57:32
回答 2查看 25.6K关注 0票数 5

我有一个名为:cert.cer的证书链,其内容为:

代码语言:javascript
运行
复制
subject= ... OU=MyCA
issuer= ... OU=MyCA
-----BEGIN CERTIFICATE-----
...
-----END CERTIFICATE-----

subject= ... OU=Client
issuer= .. OU=MyCA
-----BEGIN CERTIFICATE-----
...
-----END CERTIFICATE-----

我试图通过调用以下命令将这个链添加到JKS中:

keytool -import -trustcacerts -file cert.cer -keystore sample.keystore -storepass 123456 -alias chain

,它只添加OU=MyCA的顶级证书。

如何正确地将此链添加到JavaKeyStore (JKS)?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-08-06 05:27:56

好的,我运行您的命令将证书合并为PKCS7格式:

代码语言:javascript
运行
复制
openssl > crl2pkcs7 -nocrl -certfile a.crt -certfile b.crt -out outfile.p7b

啊,真灵。

然后,我尝试使用如下命令将PKCS#7文件导入JKS文件:

代码语言:javascript
运行
复制
keytool -import -trustcacerts -file outfile.p7b -keystore keystore1.jks -storepass 123456 -alias chain

它不起作用。

然后我进行了一些研究,发现我需要一个文件中的证书链,无论是Base64格式还是Der格式。我有Base64格式文件。因此,我尝试使用以下windows命令连接该文件:

代码语言:javascript
运行
复制
copy /b a.crt+b.crt c.crt

linux命令将是:

代码语言:javascript
运行
复制
cat a.crt b.crt > c.crt

输出文件如下所示:

代码语言:javascript
运行
复制
-----BEGIN CERTIFICATE-----
..............................
..............................
-----END CERTIFICATE----------BEGIN CERTIFICATE-----
...............................
...............................
-----END CERTIFICATE-----

然后,尝试使用上面的命令导入JKS中的证书链。啊,真灵。然后,我尝试从keystore中查看证书列表。为此,我运行了以下命令:

代码语言:javascript
运行
复制
keytool -list -v -keystore keystore1.jks

但它说,只有“一个条目被发现”,并显示了一个证书。由于密钥存储库没有加载完整的证书链,所以实验失败。

因此,我尝试使用下面的openssl命令来转换证书链中的PKCS#7文件:

代码语言:javascript
运行
复制
pkcs7 -print_certs -in outfile.p7b -out certificates.cer

输出文件看起来与您的完全一样,从subject dn和发行者dn开始,然后是页眉和页脚。然后,我尝试将证书从“certificates.cer”存储到jks文件'keystore1.jks‘。但是,在导入之后,它再次显示,keystore只有一个证书。因此,发行者dn和subject dn并不是一个问题。

然后,我尝试将Base64文件转换为Der文件,然后尝试连接数据:

代码语言:javascript
运行
复制
openssl x509 -in a.crt -outform DER -out aa.crt
openssl x509 -in b.crt -outform DER -out bb.crt
copy /b aa.crt+bb.crt cc.crt

然后,我尝试将der连接的文件导入到JKS。但同样,只导入了一个证书。

我真的在想我到底做错了什么。因此,我查找了KeyTool的源代码,并找到了导入证书或证书链的方法。

代码语言:javascript
运行
复制
Imports a JDK 1.1-style identity database. We can only store one certificate per identity, because we use the identity's name as the alias (which references a keystore entry), and aliases must be unique.

我感到惊讶的是,他们的代码将输入流转换为证书列表,但它们只处理证书的一个证书(第一个证书)。

代码语言:javascript
运行
复制
if (certs!=null && certs.length>0) {
      // we can only store one user cert per identity.
      // convert old-style to new-style cert via the encoding
         DerOutputStream dos = new DerOutputStream()
         certs[0].encode(dos);
         .............................

所以我们不能同时对添加多个证书,那里的策略是一个条目的一个证书。因此,如果要输入多个证书,则必须单独输入它们。或者,编写一些java代码来简化我们的工作(我总是这样做)。

抱歉把这事搞得太久了。但希望这能消除你大部分的困惑。

票数 13
EN

Stack Overflow用户

发布于 2015-08-06 09:42:02

JKS类型KeyStore中的条目类型

  • PrivateKey条目包含私钥和该私钥的证书或证书链。
  • 一个TrustedCert条目完全包含,一个证书,没有私钥。

通用的KeyStore接口允许SecretKey的第三种输入,但JKS不支持它,只有很少使用的JCEKS,我相信是BouncyCastle格式。

我找到了您的另一个问题https://security.stackexchange.com/questions/95945/how-to-add-a-certificate-chain-to-a-jks,它解释了为什么正确地不想要私钥条目。但是,您将找到的大多数密钥工具说明等等都是关于将链(通常从CA返回)附加到私钥,并且掩盖了这样一个事实,即没有私钥就不能将证书链存储为一个条目。

所以,是的,必须分别输入每个证书,。但是,这并不一定意味着就意味着您必须分别获取每个证书。CertPathBuilder的存在正是为了从信任库(但不仅仅是) JKS中提取构成有效链的所有证书。不幸的是,要使CertPathBuilder (特别是"PKIX")为SSL/TLS正确工作所需的花哨使用于更简单的应用程序变得相当笨拙,所以您可能更喜欢获取证书。

PS-连接PEM证书在允许链(仅与私钥)的情况下工作,但您显示的示例无效。-----BEGIN-----END行应该是单独的行,而不是像它们一样一起运行。

票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31820094

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档