1. CSR 基础概念:你提交的到底是什么?
很多刚接触 PKI 的朋友,上来就问:「CSR 是个文件吧?我直接生成一个不就行了?」
嗯,没那么简单。CSR 是你向 CA 申请证书的「申请书」。你想想看,你去办身份证,总得先填表、贴照片、交复印件吧?CSR 就是那个「表」。
1.1 什么是 CSR?
CSR 的全称是 Certificate Signing Request,证书签名请求。它是一个 Base64 编码的文本块,里面包含了你的身份信息和公钥。
我习惯把它叫做「证书申请书」。你把它交给 CA,CA 审核通过后,会在你的公钥上签名,最终生成一张 X.509 数字证书。
核心要点:CSR 本身不是证书,它是生成证书的「原材料」。没有 CSR,CA 没法给你签发证书。
1.2 CSR 的作用是什么?
说白了,CSR 就干三件事:
- 证明你是谁 —— 告诉 CA 你的域名、组织名称、所在地等信息。
- 提交你的公钥 —— 让 CA 把公钥和你的身份绑定在一起。
- 证明你拥有私钥 —— 生成 CSR 时必须用私钥签名,CA 可以验证你确实持有对应的私钥。
我曾经遇到过一个客户,他直接把私钥文件发给了 CA,说「帮我生成证书」。我当时就懵了……私钥是绝对不能给任何人的!CSR 里只包含公钥,私钥必须自己保管好。
⚠️ 重要提醒:私钥一旦泄露,你生成的证书就毫无安全可言。任何人拿到你的私钥,都可以冒充你的身份。
1.3 CSR 包含哪些信息?
一个标准的 CSR 包含以下字段。我整理了一张表,方便你对照:
| 字段 | 含义 | 示例 |
|---|---|---|
| CN | 通用名称(域名或设备名) | www.example.com |
| O | 组织名称 | Example Inc. |
| OU | 部门名称 | IT Security |
| L | 城市/地点 | Beijing |
| ST | 省份/州 | Beijing |
| C | 国家代码(两位) | CN |
| 公钥 | RSA/ECC 公钥 | 2048-bit RSA |
| 签名算法 | 用于签名的哈希算法 | sha256WithRSAEncryption |
你可能会问:「为什么没有私钥?」因为 CSR 里本来就不该有私钥。私钥是你自己生成的,永远留在你的服务器或 HSM 里。CSR 只提交公钥和身份信息。
1.4 公钥与私钥的关系
这个关系其实很简单,但我发现很多人搞混。我打个比方:
- 公钥 就像一把「锁」。你可以把锁发给任何人,别人可以用这把锁加密数据。
- 私钥 是唯一能打开这把锁的「钥匙」。钥匙必须你自己保管。
生成 CSR 时,你先生成一对密钥对(公钥 + 私钥),然后把公钥放进 CSR 里提交给 CA。CA 签完证书后,你拿着证书和私钥一起部署到服务器上。
💡 我的经验:生成密钥对时,我建议使用 2048 位以上的 RSA 密钥,或者直接用 ECC(椭圆曲线)密钥。ECC 更安全,性能也更好。我最近的项目里,已经全面切换到 ECC P-256 了。
为什么会这样设计?因为非对称加密的核心就是「公钥公开,私钥保密」。你想想看,如果私钥也放进 CSR 里,那传输过程中一旦被截获,整个加密体系就崩塌了。
1.5 CSR 的生成流程(核心逻辑)
下面这张图,是我自己画的一个流程图。它清晰地展示了 CSR 从生成到提交的完整路径:
你看,整个流程里,私钥始终没有离开过你的服务器。CSR 提交给 CA 的,只有公钥和你的身份信息。CA 验证通过后,用它的根证书私钥对你的公钥签名,最终生成一张数字证书。
1.6 一个真实的 CSR 长什么样?
我直接贴一段我生成过的 CSR 示例(已脱敏)。你可以看看它的结构:
-----BEGIN CERTIFICATE REQUEST-----
MIICxjCCAa4CAQAwXzELMAkGA1UEBhMCQ04xETAPBgNVBAgMCEJlaWppbmcxETAP
BgNVBAcMCEJlaWppbmcxFTATBgNVBAoMDEV4YW1wbGUgSW5jLjETMBEGA1UEAwwK
d3d3LmV4YW1wbGUuY29tMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA
yR8WnJ6...(省略中间部分)...IDAQABoAAwDQYJKoZIhvcNAQELBQADggEBAGJk4XyK
-----END CERTIFICATE REQUEST-----
这段 Base64 编码的内容,解码后可以看到 CN、O、公钥等信息。你可以用 openssl req -text -noout -verify -in server.csr 命令查看它的明文内容。
💡 小技巧:生成 CSR 后,我习惯先用 openssl req -verify 验证一下签名是否有效。如果验证失败,说明 CSR 在传输过程中被篡改了,必须重新生成。
1.7 避坑指南
最后,分享几个我踩过的坑:
- CN 必须准确 —— 我曾经把 CN 写成了
example.com,但实际域名是www.example.com,结果证书签发后浏览器报域名不匹配。后来我养成了习惯,生成前先核对 CN。 - 密钥长度别偷懒 —— 1024 位的 RSA 现在已经不安全了。我建议至少 2048 位,或者直接用 ECC P-256。
- 私钥权限要设好 —— 生成私钥后,记得
chmod 600,防止其他用户读取。我见过有人把私钥放在/tmp目录下,权限还是 777……
嗯,这一章的内容就到这里。CSR 的概念其实不复杂,但它是整个 PKI 体系的基石。你理解了 CSR,后面生成证书、配置 HTTPS 就顺理成章了。