导入证书或链时java keytool命令的区别

ha9*_*3ar 3 java certificate ca keystore keytool

只是想将这个问题作为“澄清”而不是决议提出:

java keytool 有-importcert-trustcacertsarg的命令。来自官方帮助指南。

从 CA 导入证书回复

导入对您提交证书签名请求的 CA 的公钥进行身份验证的证书后(或 cacerts 文件中已经有这样的证书),您可以导入证书回复并将您的自签名证书替换为证书链。此链是 CA 为响应您的请求而返回的链(当 CA 回复是链时),或者是使用证书回复和已在导入回复的密钥库或 cacerts 密钥库文件中的密钥库。

例如,如果您向 VeriSign 发送了证书签名请求,那么您可以使用以下内容导入回复,假设返回的证书名为 VSMarkJ.cer:

keytool -importcert -trustcacerts -file VSMarkJ.cer

我还从keytool文档中阅读了以下内容:

如果回复是单个 X.509 证书,keytool 会尝试建立信任链,从证书回复开始到自签名证书(属于根 CA)结束。证书回复和用于验证证书回复的证书层次构成了新的别名证书链。如果无法建立信任链,则不会导入证书回复。在这种情况下,keytool 不会打印出证书并提示用户验证它,因为用户很难(如果不是不可能的话)确定证书回复的真实性。

如果回复是 PKCS#7 格式的证书链,则在 keytool 尝试将回复中提供的根 CA 证书与任何密钥库或“cacerts”密钥库文件中的可信证书(如果指定了 -trustcacerts 选项)。如果找不到匹配项,则打印出根 CA 证书的信息,并提示用户对其进行验证,例如,通过将显示的证书指纹与从其他(受信任的)信息源获得的指纹进行比较,从而可能是根 CA 本身。然后用户可以选择中止导入操作。但是,如果提供了 -noprompt 选项,则不会与用户进行交互。

如果我收到带有根 CA 和我签署的证书的证书回复,哪个是我正确导入证书的正确命令(或者以下所有内容都将根据根 CA 的可用性工作):

# Assuming doesn't exist at all
keytool -import -keystore server_keystore.jks -storepass pass -alias rootCA -file ca-cert-file
keytool -import -keystore server_keystore.jks -storepass pass -alias fqdn_name -file signed_server_cert
Run Code Online (Sandbox Code Playgroud)

对比

#Assuming that root CA exists in system-wide cacerts
keytool -import -trustcacerts -keystore server_keystore.jks -storepass pass -alias fqdn_name -file signed_server_cert
Run Code Online (Sandbox Code Playgroud)

对比

# Assuming that the root CA doesn't exist
keytool -importcert -keystore java_home\jre\lib\security\cacerts -storepass changeit -alias someRootCA -file root_ca_cert
keytool -importcert -trustcacerts -keystore server_keystore.jks -storepass pass -alias fqdn_name -file signed_server_cert
Run Code Online (Sandbox Code Playgroud)

抱歉任何不正确的假设,只是想通过与他人合作来理解:)

问候,

use*_*421 5

# Assuming doesn't exist at all
keytool -import -keystore server_keystore.jks -storepass pass -alias rootCA -file ca-cert-file
keytool -import -keystore server_keystore.jks -storepass pass -alias fqdn_name -file signed_server_cert
Run Code Online (Sandbox Code Playgroud)

这是要使用的。您需要-trustcacerts第一个选项,或对相应提示的“是”回复。

#Assuming that root CA exists in system-wide cacerts
keytool -import -trustcacerts -keystore server_keystore.jks -storepass pass -alias fqdn_name -file signed_server_cert
Run Code Online (Sandbox Code Playgroud)

这会工作,如果签署你的证书在cacerts。通常情况并非如此:根证书应该在那里,但他们可能使用离根证书更深三个或更多步骤的证书对其进行签名。

# Assuming that the root CA is a new authority
keytool -importcert -keystore java_home\jre\lib\security\cacerts -storepass changeit -alias someRootCA -file root_ca_cert
keytool -importcert -trustcacerts -keystore server_keystore.jks -storepass pass -alias fqdn_name -file signed_server_cert
Run Code Online (Sandbox Code Playgroud)

理论上看起来不错,但如果 CA 是一个新的权威,无论如何其他人都不会信任它,所以这是徒劳的。

请注意,当您导入签名证书时,您必须使用与生成密钥对和 CSR 时使用的相同的密钥库文件和别名。这是一个常见的错误来源。