使用keytool将p7b文件导入Java密钥库

10

我想导入来自第三方的p7b文件到java信任存储中,其中p7b文件似乎包含根证书和公钥。

我尝试使用类似以下命令进行导入:

keytool -importcert -file certs.p7b -keystore dave.jks -storetype JCEKS -trustcacerts

当第三方向我提供文件时,他们没有告诉我公钥的别名是什么。

我想,如果不知道这个信息,就无法导入它,这样对吗?


1
p7b/p7c 只能包含证书,而不能是裸公钥。(Java 密钥库或信任库也不行。)它通常包含形成链的证书:终端实体(例如服务器)、中间证书(通常为一个,有时为多个)和根/锚点。但是将链导入到受信任的信任库中是没有意义的;您只需要锚点即可。p7b/p7c 中的证书没有别名,但 Java 密钥库条目有别名,因此在将(一个!)受信任的证书导入到信任库时,您需要选择或默认别名。要查看 p7b 中的内容,请使用 keytool -printcert -file whatever.p7b 或... - dave_thompson_085
如果您拥有OpenSSL,则可以使用以下命令openssl pkcs7 -print_certs [-text] -in whatever.p7b来打印证书。 - dave_thompson_085
谢谢 Dave,我对证书和公钥之间的区别非常模糊,所以很可能混淆了这些术语。您建议使用的keytool命令给出了keytool错误:java.lang.Exception: Failed to parse input - openssl命令给出了unable to load PKCS7 object 13060:error:0906D06C:PEM routines:PEM_read_bio:no start line:pem_lib.c:701:Expecting: PKCS7。然而,我可以使用KeyStoreExplorer实用程序打开该文件。 - DaveH
1
那么,它要么不是p7格式,要么不是PEM格式。如果你用文本编辑器查看它,它是否由以-----BEGIN开头的一行组成,然后是几行base64编码,最后以-----END开头的一行,并且在BEGIN/END之后有什么单词?如果它不是文本,即大部分是未显示或“dingbat”字符,请尝试将-inform der添加到openssl pkcs7命令中。 - dave_thompson_085
1个回答

6

这是一个相当古老的问题。但我刚遇到了同样的问题,所以我会发布我所做的。

我们从一个持有证书链的公共机构得到了一个 .p7b 文件,必须在我们的系统中接受。由于它有证书链,不能直接导入到 p12 文件中,因此,首先使用 openssl 检查它:

 openssl pkcs7 -print_certs -inform der -in file.p7b

此命令会提供别名和base64编码证书的列表:
subject=LONG CERTIFICATE1 COMMONNAME WITH ESCAPE SEQUENCES
issuer=LONG CERTIFICATE1'S ISSUER COMMONNAME
-----BEGIN CERTIFICATE-----
long base64 string
-----END CERTIFICATE-----

subject=LONG CERTIFICATE2 COMMONNAME WITH ESCAPE SEQUENCES
issuer=LONG CERTIFICATE2'S ISSUER COMMONNAME
-----BEGIN CERTIFICATE-----
long base64 string
-----END CERTIFICATE-----

由于.p7b文件包含了多个证书,因此这个列表比较长。

接下来的步骤是将位于-----BEGIN CERTIFICATE----------END CERTIFICATE-----之间的所有片段复制出来,并将它们存储在不同的文件中,并使用.pem扩展名保存:

certificate1.pem
certificate2.pem
...

然后将它们导入到密钥库中,使用长的通用名称作为别名:

keytool -alias "LONG CERTIFICATE1 COMMONNAME WITH ESCAPE SEQUENCES" -importcert -trustcacerts -file certificate1.pem -keystore trustcerts.p12 -storetype PKCS12
keytool -alias "LONG CERTIFICATE2 COMMONNAME WITH ESCAPE SEQUENCES" -importcert -trustcacerts -file certificate2.pem -keystore trustcerts.p12 -storetype PKCS12

在此之后,我们拥有了一个包含所有 .p7b 证书的 pkcs12 密钥库。


但是你如何使用这种方法来获取证书链呢? - J. Dimeo
证书包含在 p7b 文件中。openssl 命令通过标准输出返回它们。 - Oscar Pérez
2
我执行导入命令时,系统提示我:没有X.509证书。 - guruboy
@guruboy:我遇到了同样的错误:你还需要在.pem文件中包含-----BEGIN CERTIFICATE----------END CERTIFICATE-----。然后使用keytool导入就可以了。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接