只是想问这个问题" Clarification"而不是决议:
java keytool具有带-importcert
arg的-trustcacerts
命令。从官方帮助指南。
从CA导入证书回复
导入验证公钥的证书后 您提交证书签名请求的CA(或者有 已经在cacerts文件中的这样的证书),你可以导入 证书回复并用a替换你的自签名证书 证书链。这个链是CA返回的链 响应您的请求(当CA回复是链接时)或一个 构建(当CA回复是单个证书时)使用 证书回复和已经可用的受信任证书 在导入回复的密钥库中或在cacerts密钥库中 文件。
例如,如果您将证书签名请求发送给VeriSign, 那么您可以使用以下内容导入回复,该假设是 返回的证书名为VSMarkJ.cer:
keytool -importcert -trustcacerts -file VSMarkJ.cer
我还阅读了keytool
文档中的以下内容:
如果回复是单个X.509证书,则keytool会尝试 建立信任链,从证书回复和结束开始 在自签名证书(属于根CA)。证书 回复和用于验证的证书的层次结构 证书回复形成别名的新证书链。如果是信任 链不能建立,证书回复不导入。在 在这种情况下,keytool不会打印出证书并提示 用户验证它,因为它很难(如果不是不可能的话) 用户确定证书回复的真实性。
如果回复是PKCS#7格式的证书链,则链是第一个 ordered(首先使用用户证书和自签名根CA. 证书最后),在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
VS
#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
VS
# 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
对于任何不正确的假设感到抱歉,只是试图通过与他人合作来理解:)
此致
答案 0 :(得分:2)
# 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
这是使用的。您需要在第一个选项上使用-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
如果您签署的证书位于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
理论上看起来还不错,但如果CA是一个新的权威机构,那么其他任何人都不会相信它,所以这是徒劳的。
请注意,导入签名证书时,必须使用生成密钥对和CSR时使用的相同密钥库文件和别名。这是一个常见的错误来源。