CSRCertificate Signing Request,证书签名请求)是主体向 CA(证书颁发机构) 申请 数字证书 时提交的请求材料,包含主体 公钥、主体名称、扩展信息,并由主体 私钥 签名。

核心问题

CA 要签发证书,必须知道“要绑定哪把公钥”和“申请者是否持有对应私钥”。CSR 把主体公钥和申请信息打包,并用主体私钥签名,避免别人拿你的身份申请一张绑定攻击者公钥的证书。

核心机制

CSR 通常包含:

字段作用
Subject申请主体信息,例如组织、通用名
Subject Public Key要写入证书的主体公钥
Requested Extensions期望写入证书的扩展,例如 SAN
Signature AlgorithmCSR 自身签名算法
Signature申请者用主体私钥对 CSR 内容生成的签名

抽象流程是:

keypair = generate_keypair()
csr_payload = subject_info || subject_public_key || requested_extensions
csr_signature = Sign(subject_private_key, canonical(csr_payload))
csr = csr_payload || csr_signature

CA 验证 CSR 签名,只能证明申请者持有该公钥对应的私钥;CA 仍要独立验证域名控制权、组织身份或设备来源,才能决定是否签发证书。

工程用途

  • 为 HTTPS 域名申请服务器证书。
  • 企业内部为服务、用户或设备申请证书。
  • 证书自动化系统中由客户端生成密钥和 CSR,再提交给 CA。
  • 合规场景中保留申请材料和签发审批记录。

边界与常见坑

  • CSR 不是证书:CSR 只是申请材料,不能直接用于 TLS 握手证明身份。
  • CSR 可公开,私钥不可公开:CSR 包含公钥和签名,不包含私钥。
  • CSR 签名不证明域名归属:域名控制权验证是 CA 的额外步骤。
  • SAN 比 Common Name 更关键:现代 TLS 域名匹配主要看 Subject Alternative Name。
  • 复用私钥要谨慎:重新申请证书不一定需要换私钥,但长期复用会扩大泄露影响。

相关术语