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