证书签名请求:它包含公钥还是私钥?

Cur*_*ind 3 ssl ca csr public-key private-key

我试图揭开 CSR 的生成方式以及公钥和私钥的作用。

服务器1:

  • 生成公钥和私钥

现在,我想要 CSR,为此,我将去 CA 进行签名。

创建 CSR 请求时,是基于服务器的公钥还是私钥?

我提到了这个SO问题;其中,它表示服务器(正在请求 CSR)本身在将其发送到 CA 之前通过其私钥签署 CSR。

我有点困惑,有以下问题:

  • 最终产品(CA 签名的证书):它包含服务器的私钥还是公钥?据我了解,最终产品应包含请求 CSR 的服务器的公钥。

  • 服务器发起CSR请求时,为什么需要用私钥对CSR进行签名?这是对的吗?

  • 服务器的公钥是 CSR 的一部分吗?

  • 最终,CA是否根据CSR生成证书以及如何从CSR导出服务器的公钥?

gar*_*Red 8

最终产品(CA 签名的证书):它包含服务器的私钥还是公钥?

该证书是公共文件。因此它只能包含公钥。如果它包含私钥,那么该密钥将不再是私有的。

服务器发起CSR请求时,为什么需要用私钥对CSR进行签名?这是对的吗?

是的,这通常是正确的。这个概念称为拥有证明(PoPo),它用于向 CA 证明您(或本例中的服务器)拥有与将由 CA 签名的公钥相对应的私钥(或至少拥有它)在 CA 签署您的证书之前的时间)。如果 CA 不坚持 PoPo,那么您可以否认任何已签名的未来消息,如下所示:

  1. 您拥有由 CA 签名的公钥来创建您的证书。此时,您可以按照应有的方式使用私钥签署您的请求。一切都很好。
  2. 我过来并从您的证书中复制您的公钥。我现在将其作为 CSR 提交给 CA,但不包含PoPo。CA 对其进行签名并向我发送证书,其中现在包含我的姓名和您的公钥。
  3. 在某个时候,您向第三方(例如您的银行)发送一条经过数字签名(使用您的私钥)的消息,要求他们向 Stack Overflow 捐赠 1000 美元。
  4. 后来您决定将这 1000 美元花在度假上更好,因此您向银行提出了对签名消息的异议。
  5. 银行说但是你对消息进行了数字签名以验证它!
  6. 正如您所知,CA 在没有 PoPo 的情况下签署证书,您只需说我必须使用您的私钥发送消息,而我现在已销毁该私钥以试图隐藏证据。
  7. 银行无法证明(6)不正确,因为他们没有检查我是否拥有与我的请求中的公钥相对应的私钥,因此不能拒绝您关于不是我的声明- 银行必须偿还你。

如果当我向 CA 提交您的公钥时银行坚持使用 PoPo,那么我的请求就会失败,并且您以后也无法否认您的消息。但是,一旦 CA 在没有 PoPo 的情况下签署了请求,所有关于不可否认性的赌注都会被取消。

最终,CA是否根据CSR生成证书以及如何从CSR导出服务器的公钥?

无需进行推导 - 您的服务器的公钥位于名为CertificateRequestInfo 的构造中的请求中。

此 CertificateRequestInfo 包含您(或服务器)的名称和公钥。它还可以包含其他元素,例如请求的扩展。CA 从此 CertificateRequestInfo 获取所需的任何信息(只有公钥是必需的),并使用该信息生成称为 tbsCertificate 的构造 “tbs”代表待签名)。该构造包含您的姓名、公钥以及 CA 认为合适的任何扩展。然后它会签署此 tbsCertificate 以创建您的证书。

  • 请注意,该领域的一些专家认为(并清楚地解释)为什么至少对于 TLS 而言,CSR 是不需要的额外内容(不需要密钥所有权证明):https://www.agwa.name/blog/帖子/security_review_of_cfssl_signer_code#2098-附录 (2认同)