我对在java中创建由CA签名的有效证书的过程感到困惑
我知道java有工具keytool
来创建公钥和证书
它还支持JKS和PKCS#12
因此,可以创建具有公钥 - 私钥对和证书的密钥库,例如
keytool -genkey -keyalg RSA -alias aCert -keystore someKeystore.keystore
这将创建一个带有证书的密钥库(自签名)
到目前为止我明白了。
我可以导出证书以获取要发送给CA的csr请求,例如Verisign,当然没有私钥。
在这部分之后,我迷路了
CA会签名,我必须将其重新导入我的密钥库吗?这将替换密钥库中已有的原始证书?
它仍将是自签名的。
发行人不应该是CA本身吗?但那么这怎么可能?我只发送公钥而不是证书?
有关清理流程的任何帮助吗?
的更新:
CA是否签署证书(例如Verisign)也是签发者?或者它可以签署issuer==subject
的证书?
感谢
答案 0 :(得分:6)
你是正确的,直到创建CSR。你会用这样的东西:
$ keytool -certreq -alias myalias -file myalias.csr -keystore keystore
生成CSR,其中包含:
并使用您的私钥进行签名。然后,CA使用以下内容生成新证书:
您需要导入到密钥库中,替换原始的自签名证书:
$ keytool -import -alias myalias -keystore keystore -file myalias.crt
CA通常会使用中间证书对您的新证书进行签名,而该证书又由受信任的根签署;在这种情况下,您应该在您自己的证书之前导入中间证书:
$ keytool -import -trustcacerts -alias intermediate -file intermediate.crt -keystore keystore
编辑:来自keytool文档的这个不起眼的部分非常清楚(它涉及证书的“链”,这只是指将你的链接到根目录的中间证书):
keytool可以创建和管理密钥库“密钥”条目,每个条目包含一个私钥和一个关联的证书“链”。链中的第一个证书包含与私钥对应的公钥。
首次生成密钥时(请参阅-genkey子命令),链开始时包含单个元素,即自签名证书。自签名证书是发行者(签名者)与主题相同的证书(证书对其公钥进行身份验证的实体)。只要调用-genkey子命令生成新的公钥/私钥对,它也会将公钥包装到自签名证书中。
稍后,在生成证书签名请求(CSR)(请参阅-certreq子命令)并发送到证书颁发机构(CA)后,将导入CA的响应(请参阅-import),并且签名证书由证书链替换。链的底部是CA颁发的证书(回复),用于验证主题的公钥。链中的下一个证书是验证CA公钥的证书。
答案 1 :(得分:2)
CA签署证书后,它将不再自签名。自签名证书具有issuer == subject。当CA签署它时,颁发者成为CA,CA对应于CA自己的证书中的主题,而该证书又由另一个发行者签名,...因此您有一个证书链,终止于已经受信任的根在你的信任库里。