将证书导入为PrivateKeyEntry

32

我正在为Tomcat服务器安装SSL,并遵循这个颁发机构的说明https://knowledge.rapidssl.com/support/ssl-certificate-support/index?page=content&actp=CROSSLINK&id=SO16181,它指出:

Verify the following information:

The SSL certificate is imported into the alias with the "Entry Type" of 
PrivateKeyEntry or KeyEntry.  If not, please import the certificate into 
the Private Key alias.

当我导入我使用的证书(Tomcat)时:

keytool -import -trustcacerts -alias your_alias_name -keystore your_keystore_filename
-file your_certificate_filename

但是当我这样做时,它会导入为trustCertEntry

Keystore type: JKS
Keystore provider: SUN

Your keystore contains 3 entries

primaryca, Jul 26, 2014, trustedCertEntry,
Certificate fingerprint (SHA1): <snip>
tomcat, Jul 26, 2014, trustedCertEntry,
Certificate fingerprint (SHA1):  <snip>
secondaryca, Jul 26, 2014, trustedCertEntry,
Certificate fingerprint (SHA1):  <snip>

我如何使别名为tomcat的导入项目变成PrivateKeyEntry?


1
你的证书链不需要 primaryca。服务器应该发送服务器证书和任何中间证书,以构建到受信任机构的路径。客户端是否信任机构或 primaryca 是由客户端决定的。如果客户端不信任机构或 primaryca,则你无法做任何事情(除了要求他们信任它)。 - jww
已经澄清 - 这指的是别名为tomcat的证书,它是服务器的实际证书,而不是任何一个CA证书。 - bhttoan
1
那不起作用,你不能直接这样做!https://www.xinotes.net/notes/note/1007/ - shareef
3个回答

21

您试图添加证书并期望它成为私钥-这是对两个不同事物的混淆。

通常情况下,当您创建密钥库(.jks)时,它会包含私钥。如果该文件为空(已删除),则应从您的密钥和证书生成捆绑包(.p12 文件)。

为了创建新的免费密钥和证书,您可以使用此OpenSSL实现:https://zerossl.com

然后,您将获得一组密钥和证书,您应该从中生成一个(.p12)捆绑文件:(在Linux机器上)

openssl pkcs12 -export -in [filename-certificate] -inkey [filename-key] -name [host] -out [filename-new-PKCS-12.p12]

现在,只需通过执行以下命令将捆绑文件(.p12文件)添加到密钥库(.jks)中:

keytool -importkeystore -deststorepass [password] -destkeystore [filename-new-keystore.jks] -srckeystore [filename-new-PKCS-12.p12] -srcstoretype PKCS12

openssl PKCS12 导出可能需要您提供密码。您可以通过命令行提供它,使用 -password pass:YourPasswordHere。您需要在 keytool 导入时提供它,使用 -srcstorepass YourPasswordHere - Mr. Llama

11

删除 -trustcacerts 选项。它不是CA证书,而是 你的 证书。并使用与私钥已有的相同别名。


8
不戴那个对我来说没有影响。这不一定是唯一的问题。 - Todd Wilcox
@ToddWilcox 我并没有说这是唯一的问题。我提出了第二个要求。你满足了吗? - user207421

5
这些CA指南有点误导。正如@EJP所说,您不应该为您的证书使用-trustcacerts
此外,这份CA文件建议将主要和中间CA证书分别导入,这样应该会给您一个类似于以下结果:
primaryca, Jul 26, 2014, trustedCertEntry,
Certificate fingerprint (SHA1): <snip>
secondaryca, Jul 26, 2014, trustedCertEntry,
Certificate fingerprint (SHA1):  <snip>
tomcat, Jul 26, 2014, PrivateKeyEntry,
Certificate fingerprint (SHA1):  <snip>

很遗憾,像这样在您的密钥库中导入CA证书是没有意义的(在信任库中会有用处,但您使用的CA可能已经在默认的信任库中了)。
确实,在您的证书中拥有CA证书是有用的,以便在需要中间证书时呈现完整的证书链。然而,密钥管理器(除非可能是自定义实现)不会为您构建链,即使它在PrivateKeyEntry中找到了适当的CA证书也不会这样做。
您需要将这些证书作为链一起导入,针对您的私钥条目。为此,请将证书连接在一起放入一个文本文件中(PEM编码),首先是您的服务器证书,然后是用于发行它的证书,以此类推。然后,使用该私钥别名将该文件导入您的密钥库。(这与此问题完全相同,只是涉及服务器证书。)
我不确定你的CA是否已经将证书文件作为一个链给你,但通常你至少会得到一个仅包含证书的文件和另一个包含中间CA证书的文件。你链接的文档似乎有误导之嫌,因为他们没有提到在--BEGIN/END CERT--之间有多个块,但他们的示例截图却显示单一别名下的4个证书长度。

正如@jww在你的问题评论中指出的那样,你不需要这个链中的“根”CA证书(自签名的那个),因为你的客户端要么已经信任它,要么在你发送时没有理由信任它。将其放入链中并不是错误,但是毫无意义,并可能增加一些网络开销。

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