导入证书或链时java keytool命令之间的差异

导入证书或链时java keytool命令之间的差异,java,certificate,keystore,keytool,ca,Java,Certificate,Keystore,Keytool,Ca,我只是想问这个问题作为“澄清”,而不是一个决议: java键工具具有带有-trustcacertsarg的-importcert命令。来自官方帮助指南 从CA导入证书回复 在您导入对的公钥进行身份验证的证书之后 您向其提交证书签名请求的CA(或存在) 在cacerts文件中已经有这样的证书),您可以导入 证书答复并将自签名证书替换为 证书链。此链是CA在中返回的链 响应您的请求(当CA回复为链时),或 使用 已可用的证书回复和受信任证书 在导入回复的密钥库中或在cacerts密钥库中 文件 例如

我只是想问这个问题作为“澄清”,而不是一个决议:

java键工具具有带有
-trustcacerts
arg的
-importcert
命令。来自官方帮助指南

从CA导入证书回复

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

例如,如果您将证书签名请求发送给VeriSign, 然后,您可以导入带有以下内容的回复,其中假定 返回的证书名为VSMarkJ.cer:

keytool-importcert-trustcacerts-file VSMarkJ.cer

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

如果回复是单个X.509证书,则keytool会尝试 建立信任链,从证书回复开始,到证书回复结束 在自签名证书上(属于根CA)。证书 应答和用于验证的证书层次结构 证书回复表单别名的新证书链。如果是信托 无法建立链,未导入证书回复。在里面 在这种情况下,keytool不会打印证书并提示 用户需要验证它,因为对于一个 用户确定证书回复的真实性

如果回复是PKCS#7格式的证书链,则该链是第一个 已订购(首先是用户证书和自签名根CA 在keytool尝试匹配根CA之前 回复中提供的证书以及任何受信任的证书 在密钥库或“cacerts”密钥库文件中(如果-trustcacerts 已指定选项)。如果找不到匹配项,则 将打印出根CA证书,并提示用户 通过比较显示的证书指纹等方式进行验证 从其他(可信)来源获得的指纹 信息,可能是根CA本身。然后,用户拥有 中止导入操作的选项。如果-noprompt选项为 但是,在给定的条件下,将不会与用户进行交互

如果我收到带有根CA和我的签名证书的证书回复,那么哪一个是正确导入证书的正确命令(或者根据根CA的可用性,以下所有操作是否都有效):

vs

vs

抱歉,有任何错误的假设,只是想通过与他人合作来理解:)

问候,

# 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时相同的密钥库文件和别名。这是一个常见的错误源

你试的时候发生了什么?如果你只收到一份回复文件,那么#1和#3怎么可能相关呢?他们都使用两个文件。@EJP好的,我遗漏了一个更改-现在更新了问题。谢谢我的信任库cacerts已经损坏(我想),因为我在服务器密钥库和信任库中使用了
-trustcacerts
。我只是想知道如何不把秩序搞砸。我使用
openssl s_client
命令检查服务器在打印大量证书信息时的行为,但没有实际的数据写入/读取测试。感谢您的回答-我正在尝试理解您所说的“您需要-信任第一个证书”是什么意思,无论是作为选项还是作为对提示的答复。假设不存在中间CA证书,
-trustcacerts
不是说“通过查看系统范围的cacerts文件来建立此证书的信任链”吗?如果你能详细解释一下这句话,那就太酷了。是的。如果您不提供它,
keytool
将询问您是否要信任这些证书,并且您必须回答“是”。干得好。谢谢是的,别名可能会把事情搞得一团糟。请注意,别名实际上是什么并不重要。例如,它不需要是FQDN。实际上,如果SSL/TLS设置(例如)在作为分布式系统工作的服务器列表之间,那么最好获取基于通配符的SAN/CN的证书,您可以稍后将其与FQDN匹配。当然,这取决于服务器应用程序如何进行验证。
# 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
#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
# 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