【问题标题】:Import certificate as PrivateKeyEntry导入证书作为 PrivateKeyEntry
【发布时间】:2014-09-18 09:44:20
【问题描述】:

我正在 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?

【问题讨论】:

  • 你的链不需要需要primaryca。服务器应发送服务器证书和任何中间证书,以建立通往受信任机构的路径。由客户来信任权威或primaryca。如果客户不信任权威或primaryca(除了要求他们信任),您无能为力。
  • 已澄清 - 这是指具有别名 tomcat 的证书,它是服务器的实际证书,而不是任何一个 ca 证书
  • 那不行,你不能直接做! xinotes.net/notes/note/1007

标签: ssl keystore keytool


【解决方案1】:

您尝试添加证书并期望它是私钥 - 它混淆了两个不同的事物。

通常,当您创建密钥库 (.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 通过命令行提供它。您需要使用 -srcstorepass YourPasswordHere 将其提供给 keytool 导入。
【解决方案2】:

去掉-trustcacerts 选项。它不是 CA 证书。这是你的证书。并使用与私钥相同的别名。

【讨论】:

  • 放弃它对我来说并没有什么不同。这不一定是唯一的问题。
  • @ToddWilcox 我没有说这是唯一的问题。我提出了第二个要求。你满足了吗?
【解决方案3】:

这些 CA 指南有点误导。 @EJP 正确地说你不应该使用 -trustcacerts 作为你的证书。

此外,此 CA 文档建议在单独的操作中导入主 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>

不幸的是,像这样在 keystore 中导入 CA 证书是没有意义的。 (这在truststore 中很有用,但您使用的 CA 可能已经在默认信任库中。)

在 keystore 中有证书的 CA 证书确实很有用,以便在需要中间证书时提供完整的证书链。但是,密钥管理器(除非可能是自定义实现)不会为您构建链,即使它在您的最终实体证书旁边(在 PrivateKeyEntry 中)找到合适的 CA 证书。

您需要将这些证书一起导入,作为一个链,针对您的私钥所在的条目。为此,请将证书连接到一个文本文件(PEM 编码)中,首先是您的服务器证书,然后是用于颁发它的证书,依此类推。然后,使用该私钥别名将该文件导入您的密钥库。 (这与this question 中的问题完全相同,但使用了服务器证书。)

(我不确定您的 CA 是否已经将您的证书文件作为链提供给您,但通常,您至少只在一个文件中获得您的证书,而在另一个文件中获得中间 CA 证书。您链接到的文档似乎具有误导性,因为他们在--BEGIN/END CERT-- 之间没有提及超过一个块,但不知何故,他们的示例屏幕截图针对该单个别名的证书长度为 4。)

正如@jww 在对您的问题的评论中指出的那样,您不需要此链中的“根”CA 证书(自签名证书),因为您的客户已经信任它,或者它已经发送时没有理由信任它。将它放在你的链中并没有错,但它没有意义,并且可能会增加一些网络开销。

【讨论】:

    猜你喜欢
    • 2020-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多