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