证书签名请求:是否包含 public 密钥或私钥?

certificate signing request: Does it contain public key or private key?

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

服务器 1:

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

对于创建 CSR 请求,它是基于服务器的 public 密钥还是私钥?

我提到了这个SO question;在那里,它说服务器(正在请求 CSR)在将 CSR 发送到 CA 之前,它自己通过其私钥签署 CSR。

有点迷茫,有以下问题:

The end product (the signed certificate by CA): Does it contain server's private key or public key?

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

While initiating a CSR request, why a server needs to sign a CSR by its private key? Is it correct?

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

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

如果银行在我向 CA 提交您的 public 密钥时坚持使用 PoPo,我的请求将失败,并且您以后无法否认您的消息。但是一旦 CA 在没有 PoPo 的情况下签署请求 - 所有赌注都不会被拒绝。

Eventually, does CA generate a certificate from CSR and how it derives the public key of the server from CSR?

无需进行派生 - 您的服务器的 public 密钥位于请求中名为 CertificateRequestInfo.

的构造中

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