关于证书签名过程的java问题

时间:2011-02-28 20:41:24

标签: java security digital-signature x509certificate digital-certificate

我对在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的证书? 感谢

2 个答案:

答案 0 :(得分:6)

你是正确的,直到创建CSR。你会用这样的东西:

$ keytool -certreq -alias myalias -file myalias.csr -keystore keystore

生成CSR,其中包含:

  • 您的公钥(从自签名证书中提取)
  • 专有名称(即申请证书的实体名称)

并使用您的私钥进行签名。然后,CA使用以下内容生成新证书:

  • subject =您的DN(来自CSR或使用您在申请过程中提供的详细信息自动生成)
  • issuer = CA的DN
  • 公钥=来自CSR

您需要导入到密钥库中,替换原始的自签名证书:

$ 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自己的证书中的主题,而该证书又由另一个发行者签名,...因此您有一个证书链,终止于已经受信任的根在你的信任库里。