- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个名为:cert.cer
的证书链,内容为:
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 -别名链
,只添加OU=MyCA的顶级证书。
如何将此链正确添加到 JavaKeyStore (JKS)?
最佳答案
好的,我运行了您的命令以合并 PKCS7 格式的证书:
openssl > crl2pkcs7 -nocrl -certfile a.crt -certfile b.crt -out outfile.p7b
成功了。
然后我尝试按照您所说的使用以下命令将 PKCS#7 文件导入 JKS 文件:
keytool -import -trustcacerts -file outfile.p7b -keystore keystore1.jks -storepass 123456 -alias chain
它没有用。
然后我稍微研究了一下,发现我需要将证书链保存在 Base64 格式或 Der 格式的文件中。我有 Base64 格式的文件。因此,我尝试使用以下 Windows 命令连接文件:
copy /b a.crt+b.crt c.crt
linux 命令是:
cat a.crt b.crt > c.crt
所以输出文件看起来像这样:
-----BEGIN CERTIFICATE-----
..............................
..............................
-----END CERTIFICATE----------BEGIN CERTIFICATE-----
...............................
...............................
-----END CERTIFICATE-----
然后,尝试使用上述命令在 JKS 中导入证书链。有效。然后,我尝试从 keystore 中查看证书列表。为此,我运行了以下命令:
keytool -list -v -keystore keystore1.jks
但是它说,只有“找到一个条目”并且显示了一个证书。由于 keystore 没有加载完整的证书链,因此实验失败了。
因此,我尝试使用以下 openssl 命令转换证书链中的 PKCS#7 文件:
pkcs7 -print_certs -in outfile.p7b -out certificates.cer
输出文件与您的文件完全一样,以主题 dn 和发行者 dn 开头,然后是页眉和页脚。然后我尝试将证书从“certificates.cer”存储到 jks 文件“keystore1.jks”。但是,同样,在导入之后,它显示 keystore 只有一个证书。因此,发行人 dn 和主题 dn 不是问题。
然后我尝试将Base64文件转换为Der文件,然后尝试连接数据:
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 concated 文件导入 JKS。但同样只导入了一个证书。
我真的想过我做错了什么。因此,我查找了KeyTool的源代码,找到了导入证书或证书链的方法。
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.
令我惊讶的是,他们的代码将输入流转换为证书列表,但他们只使用证书的一个证书(第一个)。
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 代码来简化我们的工作(我总是这样做)。
抱歉让我这么久。但希望这会消除您的大部分困惑。
关于ssl - 如何将证书链添加到 JKS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31820094/
我是一名优秀的程序员,十分优秀!