4

我对在 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
谢谢

4

2 回答 2

6

您在创建 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 公钥的证书。

于 2011-02-28T22:56:10.620 回答
2

CA 签署证书后,它不再是自签名的。自签名证书具有颁发者 == 主题。当 CA 签署它时,颁发者成为 CA,它对应于 CA 自己的证书中的主题,而该主题又由另一个颁发者签名,......所以你有一个证书链,终止于一个已经被信任的根在您的信任库中。

于 2011-02-28T22:47:44.113 回答