CSR 是什么
CSR(Certificate Signing Request,PKCS#10)是向 CA 申请证书时提交的文件:它包含申请者的公钥与身份信息(主体 DN),并用对应私钥签名以证明申请者确实持有该私钥。CA 校验信息后据此签发证书。现代客户端以 SAN(subjectAltName)为域名匹配依据,CN 只作兼容显示。
基本信息
| 标准 | RFC 2986(PKCS#10) |
|---|---|
| 内容 | 公钥、主体 DN(C/ST/L/O/OU/CN)、扩展请求(SAN)、自签名 |
| 生成 | openssl req -new -key key.pem -out req.csr |
| 校验 | openssl req -in req.csr -noout -text -verify |
| 关键字段 | SAN 必须包含所有需要用到的域名 |
| 安全要点 | CSR 只含公钥,私钥始终留在本地 |
典型使用场景
- 向公共 CA 申请证书:提交 CSR 后由 CA 签发
- 企业自建 CA:内部系统用同一套流程签发与管理证书
- 证书换发:域名或组织信息变更时重新生成 CSR
- 批量签发:用脚本生成多个域名的 CSR 并集中提交
- 合规审计:核对 CSR 里的主体信息与 SAN 是否与实际一致
生成带 SAN 的 CSR
生成带 SAN 的 CSR
# 生成私钥(2048 位用于兼容,3072 位用于新系统)
openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:3072 -out example.com.key
# 生成 CSR:-subj 指定主体,-addext 写入 SAN
openssl req -new -key example.com.key -out example.com.csr \
-subj "/C=CN/O=Example/CN=example.com" \
-addext "subjectAltName=DNS:example.com,DNS:www.example.com"
# 校验 CSR 并查看 SAN 是否写入成功
openssl req -in example.com.csr -noout -text | grep -A2 'Alternative'
# 验证 CSR 的自签名与公钥
openssl req -in example.com.csr -noout -verify字段与要点
| 字段 | 含义 | 注意点 |
|---|---|---|
| C / ST / L / O / OU | 国家、省市、组织与部门 | 需与组织证照信息一致,否则 CA 审核可能不通过 |
| CN | 通用名 | 现代客户端不再以此匹配域名,只作显示 |
| SAN | 主题备用名称 | 必须包含全部域名;通配符只能覆盖一级子域 |
| 签名 | 用私钥自签 | 证明持有私钥,CA 会校验 |
| 公钥 | 证书将要绑定的密钥 | 私钥必须留在本地,CSR 中不含私钥 |
只写 CN 不写 SAN 是证书申请中最常见的错误:现代浏览器与客户端只检查 SAN,缺失会导致域名不匹配。申请前先列出全部需要用到的域名(含 www、API、二级域等),一次性写入 SAN。
CSR 可以按流程安全传输,因为它只包含公钥与主体信息;但私钥绝不能随 CSR 一并提交给 CA 或第三方。企业内部流程要明确区分「提交 CSR」与「备份私钥」两件事,避免误传。