首页/安全/加密与证书速查/CSR 证书签名请求生成

CSR 证书签名请求生成

CSR(PKCS#10)包含申请者公钥与身份信息,并用对应私钥签名证明持有权;CA 验证信息后据此签发证书,CN 与 SAN 是填写时的关键字段。

加密与证书速查安全更新于 2026-10-13

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」与「备份私钥」两件事,避免误传。

易错点

  • 漏写 SAN:客户端报域名不匹配,需要重新申请证书
  • 把私钥随 CSR 一起提交:等于交出身份材料,签发的证书失去独占性
  • 主体信息与证照不一致:企业证书审核被拒,需重新生成并提交
  • 通配符使用超出范围:通配符证书只覆盖一级子域,更深层级需要单独写入 SAN
  • 生成后不回读 CSR 文本:交互模式下字段输错很常见,提交前用 -text 确认一遍

数据来源与参考

  • RFC 2986(PKCS#10)
  • RFC 5280(SAN 与 CN)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌