2017-08-05 157 views
0

只想问这个问题的“澄清”,而不是一个分辨率时,密钥工具命令:导入证书或链

Java的密钥工具与-trustcacerts ARG的-importcert命令。从官方的帮助指南。

导入来自CA

该认证答复后您导入认证的 您提交证书签名请求(该CA的公钥证书或有 已经这样一个证书cacerts文件),您可以导入 证书回复,并将您的自签名证书替换为 证书链。此链是构成由CA在 响应返回到您的请求的一个(当CA答复是链),或一种 (当CA答复是单个证书)使用已经在 认证答复和受信任的证书在您导入答复的密钥库中或在cacerts密钥库 文件中可用 。

例如,如果您发送您的证书签名请求,威瑞信, 那么你可以导入使用以下的答复,这假设 返回的证书名为VSMarkJ.cer:

keytool -importcert -trustcacerts -file VSMarkJ.cer

我也看了跟随着从keytool文档:

如果回答是一个X.509证书,密钥工具学尝试ts到 建立信任链,从证书回复开始,并在自签名证书(属于根CA)结束 。证书 回复和用于认证 证书回复的证书层次结构形成了新的证书链别名。如果不能建立信任链,则不会导入证书回复。在 这种情况下,密钥工具不打印出证书并提示 用户进行验证,因为它是非常硬的(如果不是不可能的),用于一个用户 以确定证书的回复的真实性。

如果答复是PKCS#7格式的证书链,该链是第一 排序(与用户证书第一和自签名的根CA 证书最后一个),前密钥工具试图根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 

# 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

当你尝试时发生了什么?如果你只有一个文件回复,#1和#3可能如何相关?他们都使用两个文件。 – EJP

+0

@EJP好吧我错过了一个改变 - 现在更新了问题。谢谢。我的信任库cacerts受到了损坏(我认为),因为我在服务器密钥库和信任库中使用了“-trustcacerts”。只是想了解如何不搞乱顺序。我使用'openssl s_client'命令来检查服务器在打印出大量证书信息时的行为,但没有实际的数据写入/读取测试。 – ha9u63ar

回答

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选项,或者在相应的提示符下输入'yes'。

#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时使用的密钥库文件和别名。这是错误的常见来源。

+0

感谢您的回答 - 我试图理解您的意思是“您需要-trustcacerts第一个,作为选项或作为对提示的回复”。假设没有中间CA证书存在,是不是'-trustcacerts'意思是说“通过查看系统范围的cacerts文件来建立此证书的信任链?”如果你能够详细阐述这个说法,那将是非常酷的。 – ha9u63ar

+0

是的。如果你不提供它,'keytool'会询问你是否要信任这些证书,并且你必须回答'是'。 – EJP

+0

令人敬畏的工作。谢谢。是的,别名可以搞砸 – ha9u63ar