首页/网络/协议速查/生成 CSR 与私钥

生成 CSR 与私钥

CSR 是「公钥 + 域名信息 + 签名」的申请文件,私钥必须本地生成且永不外传;CA 只拿 CSR 签发证书。

协议速查网络更新于 2026-10-13

CSR 与私钥是干什么的

CSR(证书签名请求)是「公钥 + 主体信息 + 自签名」的申请文件。私钥必须在本机生成并永久留在本机,CSR 里只有公钥与域名列表,CA 用它签出证书,整个流程 CA 拿不到私钥。自签名的作用是证明申请者确实持有对应私钥。OpenSSL 用 openssl req 子命令生成密钥与 CSR,跨 Linux、macOS、Windows 一致。

基本信息

适用平台OpenSSL 1.1.1 / 3.x
权限要求普通用户;私钥文件建议 chmod 600
生成方式openssl req -new 配 -newkey,或先用 genrsa/ecparam 造密钥
关键字段CN 通用名、SAN 主体备用名(现代校验以 SAN 为准)
提交给 CA只提交 .csr 文件,绝不上传 .key
推荐密钥ECC prime256v1 或 RSA 2048 及以上

典型使用场景

  • 首次申请证书:本地生成密钥与 CSR,把 CSR 交给 CA 签发
  • 证书续期:沿用原私钥生成新 CSR,避免全站替换密钥
  • 多域名与通配符证书:把所有覆盖域名写进 SAN 列表
  • 内网服务签发:走同一套流程交给自建 CA 签发
  • 密钥轮换:合规要求定期换密钥时生成新密钥对并重新签发

生成与自检

生成与自检
# 一步生成 RSA 私钥与 CSR:-nodes 表示私钥不设口令
openssl req -new -newkey rsa:2048 -nodes -keyout site.key -out site.csr -subj '/CN=example.com'
# 更常见的做法:用配置文件带上 SAN 域名列表
openssl req -new -key site.key -out site.csr -config san.cnf
# ECC 密钥,握手更快、密钥更短
openssl ecparam -genkey -name prime256v1 -out site.key
openssl req -new -key site.key -out site.csr -config san.cnf
# 自检:验证 CSR 签名并查看将要写进证书的字段
openssl req -in site.csr -noout -verify -subject
openssl req -in site.csr -noout -text | grep -A2 'Subject Alternative Name'

CSR 关键字段

字段含义注意事项
CN 通用名证书主体名,传统上填域名现代 CA 以 SAN 为准,CN 已可留空
SAN 主体备用名证书真正覆盖的域名清单浏览器与新版客户端只认这里
C/ST/L/O国家、省份、组织等主体信息按 CA 要求填,个人证书可简化
EKU 扩展用途证书可用的场景一般由 CA 签发时写入,CSR 里常不填
CSR 中含公钥,公开展示没有风险;但私钥一旦泄露等于身份可被冒用。生成后立即 chmod 600,并确认没有随备份、镜像或代码仓库外流。
通配符 *.example.com 只覆盖一级子域,不覆盖 example.com 本身,也不匹配 a.b.example.com;泛域名与裸域需要同时写进 SAN。

易错点

  • -nodes 生成的私钥没有口令保护:任何能读到该文件的人都能冒用该证书,部署后必须收紧权限
  • 只填 CN 不填 SAN:Chrome、Edge 等现代客户端会直接判定域名不匹配
  • 私钥复制到多台机器复用:轮换时必须逐一更换,否则旧副本仍可解密流量
  • CSR 里的域名与实际服务域名不一致(大小写、漏子域):证书签回后不生效,只能重新签发

数据来源与参考

  • RFC 2986(PKCS#10 CSR)
  • CA/Browser Forum BR §3.2.2

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌