CSR 是什么
在 PKI(Public Key Infrastructure,公钥基础设施) 中,CSR 全称 Certificate Signing Request(证书签名请求)——向 CA(证书颁发机构)申请数字证书时提交的一段数据文件。
它包含你要申请证书的主体信息,以及你生成的公钥。通俗理解:
「我要申请一个证书,这是我的基本身份信息和我的公钥,请你(CA)帮我签名一下。」
CSR 文件里有什么
典型内容包括:
- 公钥(Public Key)
- 组织信息(CN 域名、公司名、国家等)
- 使用用途信息(服务器认证、客户端认证等)
- 生成 CSR 的算法(RSA / ECC 等元信息)
- CSR 的数字签名(由你的私钥对 CSR 内容签名)
注意:CSR 不包含私钥。私钥永远保留在本地。
典型生成流程
- 本地生成密钥对:私钥本地保存;公钥放入 CSR。
- 用私钥签名 CSR 内容。
- 将 CSR 发送给 CA。
- 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 文本包装。
本篇准则
- 私钥永不外传——任何让你把私钥发给"客服"或"系统"的请求都是骗局。
- CSR 必带公钥——CA 没有你的公钥就签不出证书。
- PEM ≠ DER——PEM 是 Base64 包装的文本格式,DER 是 ASN.1 二进制结构本身。
- CSR / 证书 / 私钥分别用不同 PEM 头——不要搞混。