如何检查 CSR
- 粘贴请求,从
-----BEGIN CERTIFICATE REQUEST-----一直到对应的 END 行,或者把.csr/.req文件拖到框中。 - 检查卡片上的 主体、主体备用名称(SAN) 和 公钥。
- 也可以在 CSR 下方粘贴私钥。它的卡片只显示密钥类型和长度,以及一个可以与 CSR 进行比较的 SPKI SHA-256 固定值(pin)。
- 如果 CA 门户需要其他格式的请求,使用 复制 PEM 或 下载 .der。
证书签名请求里有什么
CSR(PKCS#10)很小:一个主体名称、一个公钥、可选的属性,以及对这一切的签名。解码器会这样列出它们:
| 字段 | 说明 |
|---|---|
| 主体 | C=US, O=Example Corp, CN=app.example.com。对于域名验证(DV)证书,CA 只保留它验证过的内容,所以组织字段通常会被丢弃。 |
| 版本 | PKCS#10 始终为 v1。 |
| 公钥 | 类型和长度,例如 RSA 2048 或 EC P-256。这部分会原封不动地进入证书。 |
| 签名算法 | 通常是 sha256WithRSAEncryption 或 ecdsa-with-SHA256。 |
| 主体备用名称(SAN)、密钥用法、扩展密钥用法 | 请求的扩展。CA 可能照办、改写或丢弃它们。 |
| 属性 | 其他 PKCS#9 属性。challengePassword 只会显示为已设置,值会被隐藏。 |
| SPKI SHA-256 固定值(pin) | 公钥的哈希。签发的证书会有相同的固定值。 |
提交前值得发现的错误
- 没有主体备用名称。 浏览器匹配主机名时会忽略 CN。公共 CA 通常会帮你把 CN 复制到 SAN 中;内部 CA 往往不会,结果就是证书因名称不匹配而失败。
- 漏掉了某个名称。
www.example.com和example.com是两个不同的条目。通配符*.example.com不包括example.com本身。 - 密钥太短。 受公众信任的 CA 要求 RSA 至少 2048 位。RSA 1024 的 CSR 会被拒绝。
- 密钥不对。 在另一台服务器上或用旧密钥文件生成的 CSR,签发出的证书你的服务器无法使用。请比较固定值。
- 主体中有拼写错误。 现在改起来很便宜,等 OV 或 EV 验证走完之后再改就很贵了。
工具会读取 CSR,但不会检查它的自签名。被截断或被修改过的请求仍可能解码成功,有疑问时请运行 openssl req -verify。
用 OpenSSL 创建和验证 CSR
一步生成新的 RSA 密钥和包含两个主机名的 CSR(-addext 需要 OpenSSL 1.1.1 或更高版本):
openssl req -new -newkey rsa:2048 -nodes -keyout app.key -out app.csr \
-subj "/CN=app.example.com" \
-addext "subjectAltName=DNS:app.example.com,DNS:www.app.example.com"
检查它(包括签名),并确认它与密钥匹配:
openssl req -in app.csr -noout -text -verify
diff <(openssl req -in app.csr -noout -pubkey) <(openssl pkey -in app.key -pubout) && echo "key matches"
对于完好的请求,-verify 那一行会输出 Certificate request self-signature verify OK。更多命令行用法见 OpenSSL 页面。
CSR 的 Base64 长什么样
和证书一样,CSR 也是包裹在 PEM 中的 DER。RSA-2048 请求的 DER 大约有 650–700 字节,所以它的 Base64 以 MIIC 开头;EC P-256 请求接近 300 字节,以 MIIB 开头。如果你收到的内容以 MIIC 开头,但头部写的是 CERTIFICATE,那它是证书。请改为粘贴到 证书解码器;两者用的是同一个组件,它会告诉你找到的是哪一种。
常见问题
怎么查看 CSR 中包含哪些域名?
粘贴 CSR,查看 主体备用名称(SAN)。证书覆盖哪些主机名由这个列表决定;浏览器会忽略主体中的 CN。如果没有这一行,说明请求中不含 SAN 扩展。
怎么判断 CSR 是否与我的私钥匹配?
把 CSR 和私钥一起粘贴。如果两张卡片显示的 SPKI SHA-256 固定值(pin) 相同,它们就属于同一个密钥对。用 OpenSSL 的话,比较 openssl req -in app.csr -noout -pubkey 和 openssl pkey -in app.key -pubout 的输出。
CSR 里包含私钥吗?
不包含。CSR 包含公钥、申请的名称,以及一个用私钥生成的签名,用来证明你持有私钥。它可以放心地发给 CA,私钥则应留在服务器上。
PEM 头部的 NEW CERTIFICATE REQUEST 是什么意思?
这是 Java keytool 和一些 Windows 工具使用的旧标签。内容是同样的 PKCS#10 结构,解码器会像读取其他 CSR 一样读取它。