CSR 是什么

在 PKI(Public Key Infrastructure,公钥基础设施) 中,CSR 全称 Certificate Signing Request(证书签名请求)——向 CA(证书颁发机构)申请数字证书时提交的一段数据文件。

它包含你要申请证书的主体信息,以及你生成的公钥。通俗理解:

「我要申请一个证书,这是我的基本身份信息和我的公钥,请你(CA)帮我签名一下。」

CSR 文件里有什么

典型内容包括:

  • 公钥(Public Key)
  • 组织信息(CN 域名、公司名、国家等)
  • 使用用途信息(服务器认证、客户端认证等)
  • 生成 CSR 的算法(RSA / ECC 等元信息)
  • CSR 的数字签名(由你的私钥对 CSR 内容签名)
注意:CSR 不包含私钥。私钥永远保留在本地。

典型生成流程

  1. 本地生成密钥对:私钥本地保存;公钥放入 CSR。
  2. 用私钥签名 CSR 内容。
  3. 将 CSR 发送给 CA。
  4. CA 验证后用 CA 私钥对 CSR 内容签名,生成最终证书。

为什么 CSR 必须包含公钥

这是 PKI 的核心疑问:为什么不是 CA 替你生成公钥?

私钥永远不能离开本地

私钥是身份凭证,不能传给 CA,也不能上传,只能在本地生成并自己保存。CA 的职责是「认证你的公钥」,而不是「生成你的密钥对」。

CSR 的真正目的

「我这边生成好了一对密钥,这是我的公钥,请你确认并签名,发给我一个证书。」

CSR 必须包含公钥,否则 CA 无法把公钥写进证书。

为什么 CSR 要用私钥签名

CSR 文件里的内容会被私钥签名。CA 验证这个签名来确认:

「你确实拥有这份公钥对应的私钥。」

也就是说:

  • 公钥在 CSR 里
  • 私钥不在 CSR 里
  • 但 CSR 用私钥签名,证明「这是我的公钥,我有私钥,不是伪造的」

什么时候会"公钥和私钥一起返回"

实际上永远不会有任何权威 CA 返回你的私钥。如果有人给你"私钥 + 证书",那是非常不安全的做法,只会出现在:

  • 内部系统的脚本测试环境
  • 某些只用于内部的自动签发工具
  • 某些不安全的自助服务

正规 CA(DigiCert、GlobalSign、Let's Encrypt)绝不会返回私钥。

PEM 是什么

PEM(Privacy-Enhanced Mail)是一种文件格式/编码方式,不是专门给 CSR 用的。它是一种:

  • Text(文本)
  • Base64 编码
  • 有头尾标识符的格式

CSR 的 PEM 形如:

-----BEGIN CERTIFICATE REQUEST-----
MIICqDCCAZACAQAw...
-----END CERTIFICATE REQUEST-----

PEM 可表示多种类型:

内容头部标记
私钥-----BEGIN PRIVATE KEY-----
公钥-----BEGIN PUBLIC KEY-----
CSR-----BEGIN CERTIFICATE REQUEST-----
X.509 证书-----BEGIN CERTIFICATE-----

关系:PEM = Base64(DER)——PEM 是 ASN.1 DER 二进制结构的 Base64 文本包装。

本篇准则

  1. 私钥永不外传——任何让你把私钥发给"客服"或"系统"的请求都是骗局。
  2. CSR 必带公钥——CA 没有你的公钥就签不出证书。
  3. PEM ≠ DER——PEM 是 Base64 包装的文本格式,DER 是 ASN.1 二进制结构本身。
  4. CSR / 证书 / 私钥分别用不同 PEM 头——不要搞混。
参考资料