【问题标题】:Why private key is used amidst creation of CSR?为什么在创建 CSR 时使用私钥?
【发布时间】:2026-01-23 05:40:01
【问题描述】:

CSR 主要用于创建具有可信公钥的证书。

在创建 CSR 之前,

我们创建一个私钥

openssl genrsa -out key.pem 1024

然后使用该私钥 (key.pem) 创建 CSR(req.pem) 请求。

openssl req -new -key key.pem -out req.pem

编辑:

我看到安装了一个 docker 引擎,其中包含根证书、服务器证书和与 CSR 一起使用的私有证书

在提交 CSR 时提供私钥(key.pem 作为输入)的确切目的是什么?因为证书应该使用父私钥签名

在创建 CSR 时是否需要私钥 (key.pem) 来生成相应的公钥?

是否使用私钥(key.pem)加密 CSR 并将生成的签名附加到 CSR?

【问题讨论】:

  • CSR 使用您的私钥签名。由于它包含公钥,因此 CA 能够验证签名。
  • @LorinczyZsigmond 并且在从 CSR(openssl x509 -req -days 365 -sha256 -in req.pem -CA ca.pem -CAkey ca-key.pem -CA createserial -out server-cert.pem) 创建证书的过程中,该签名被 CA 私钥的签名替换。这是从 CSR(req.pem) 到证书(server-cert.pem) 内容的唯一区别吗?
  • CA 可能会更改字段、添加/删除用途等。CA 还确定证书的有效期间隔('not before'、'not after' 字段)。编辑:与 CSR 不同,证书还包含特定于颁发者的数据。
  • @LorinczyZsigmond 签名是否被替换?正如我之前的评论中所问的那样......
  • 是的,或者准确地说,cert 和 csr 是不同的文件,由不同的各方(颁发者 CA 与请求者)签署。

标签: certificate ssl-certificate


【解决方案1】:

PKCS#10 认证请求 (RFC 2986) 的结构大致如下:

Request:
    Info:
        Version
        Name
        PublicKey
        Attributes
    SignatureAlgorithmIdentifier
    Signature

属性是请求的属性,如果它们可能是您为生成的证书请求的属性。

CA 可以选择尽可能多地或尽可能少地尊重 CSR。例如,StartSSL 仅读取公钥信息,而丢弃了 CSR 的其余部分——他们需要的其他一切都基于您从他们的 Web UI 和您的帐户状态发出的请求。

一般来说,CA 不会忽略公钥值,因为如果他们为您声明了一个新的密钥对,他们需要弄清楚您应该如何获得私钥。因此,公钥部分需要存在且正确。 OpenSSL 的命令可以通过读取私钥得到公钥值,然后将其嵌入到 CSR 中。

您需要私钥的第二个原因是签署请求。我会断言请求签名的主要原因是强制/强烈建议您在此阶段保存私钥,因此您不会在几分钟内返回“请撤销此新证书,我已经丢失了私钥”请求。 RFC(也)有这样的说法:

注 2 - 认证请求上的签名可防止 实体请求使用另一方的公钥的证书。 这样的攻击将赋予实体假装的轻微能力 是由另一方签署的任何消息的发起者。这 仅当实体不知道消息时,攻击才有意义 被签名并且消息的签名部分不能识别 签名者。该实体仍然无法解密消息 当然是为对方准备的。

【讨论】: