CSR 文件一条 OpenSSL 命令就能生成,真正要盯死的是 CN 和 SAN 两个字段:CN(Common Name,通用名)必须写主域名,SAN(Subject Alternative Name,备用名称)要把 www 等所有需要保护的域名全部列上。这两个字段填错,最直接的后果是 CA 审核退回、证书签发失败,或者证书签下来后浏览器直接报证书域名不匹配。
CSR 文件是什么,生成时到底填了什么
结论:CSR(Certificate Signing Request,证书签名请求)是一个只包含公钥和身份信息的文本文件,不包含私钥,交给 CA 就是为了换取签名证书。
生成 CSR 时你实际填的是 7 个字段:C(国家,两字母代码如 CN)、ST(省份)、L(城市)、O(组织名)、OU(部门)、CN(通用名,写主域名)、以及 SAN 里的域名列表。CA 只从这些字段里取信息写进证书,域名匹配靠 CN + SAN,身份信息靠 O/OU/C/ST/L。私钥始终留在你自己的服务器上,CSR 丢了、泄露了都不影响私钥安全——但私钥泄露就必须吊销证书重签。
用 OpenSSL 生成 CSR 的完整命令是什么
结论:OpenSSL 1.1.1 及以上版本,一条命令同时生成私钥和带 SAN 的 CSR,不需要交互式输入。
openssl req -new -newkey rsa:2048 -nodes \
-keyout example.com.key \
-out example.com.csr \
-subj "/C=CN/ST=Zhejiang/L=Hangzhou/O=Example Tech Co Ltd/OU=IT/CN=example.com" \
-addext "subjectAltName=DNS:example.com,DNS:www.example.com"
关键参数说明:-newkey rsa:2048 表示同时生成 2048 位 RSA 私钥(CA/B 论坛基线要求最低 2048 位,也可用 ECC 的 -newkey ec -pkeyopt ec_paramgen_curve:P-256);-nodes(等价 -noenc)表示私钥不加密,方便 Nginx/Apache 直接读取;-addext 附加 SAN 扩展,老版本 OpenSSL 不支持该参数,需要写进配置文件再配 -reqexts。
生成后务必自检两条命令:
openssl req -in example.com.csr -noout -text # 检查 CN 和 SAN 是否完整
openssl req -in example.com.csr -noout -verify # 校验 CSR 签名完整性
哪些字段填错影响大,哪些影响小
结论:CN 和 SAN 填错是致命的,C/ST/L/O/OU 填错对 DV 证书基本无影响,对 OV、EV 证书会导致审核退回。
按影响从大到小排:CN 写错域名 → 证书直接失效;SAN 漏写 www 或漏写子域名 → 未被覆盖的域名访问报错;O(组织名)与营业执照不一致 → OV/EV 证书在人工核验环节被拒;OU、L、ST 拼写不规范 → DV 证书照发,但信息会原样显示在证书详情里,客户点开能看到。另外注意 CN 长度上限 64 字符,C 必须填标准的两字母国家代码,写“China”会被 CA 直接打回。
还有一条容易被忽略:Chrome 58 起已不再校验 CN,只认 SAN。也就是说 CSR 里 CN 写对了但 SAN 为空,签出来的证书在现代浏览器里照样报 NET::ERR_CERT_COMMON_NAME_INVALID。所以 -addext 那一段千万不能省。
域名填错会出什么错,怎么补救
结论:证书还没签发就重新生成 CSR 重提最快;已经签发只能申请重新签发,已部署的证书必须同步替换。
具体表现:域名不匹配时浏览器报 NET::ERR_CERT_COMMON_NAME_INVALID,curl 报 SSL: no alternative certificate subject name matches target host name,Postman、App 端、支付回调全部连带失败。补救路径是登录 CA 控制台,在证书签发前重新上传 CSR 即可,多数 CA 允许免费重签;签发后发现错误,走“重新签发(Reissue)”流程,旧证书吊销或作废。另外提醒通配符:*.example.com 只覆盖一级子域名,不覆盖 example.com 本身,也不覆盖 a.b.example.com,申请时把根域名一并写进 SAN。
私钥和 CSR 的对应关系最容易出什么事故
结论:同一个私钥可以对应多张 CSR,但证书只能和生成 CSR 时用的那把私钥搭配,混用部署当天就会报错。
上线前用两条命令核对是否配对:
openssl x509 -noout -modulus -in example.com.crt | openssl md5
openssl rsa -noout -modulus -in example.com.key | openssl md5
两个 MD5 值一致才算配对成功,ECC 证书改用 openssl pkey -pubout 比对公钥。常见事故是测试环境签的证书配生产环境新生成的私钥,报 key values mismatch,排查一小时起步。
总结一句:CSR 本身只是一段可以被反复重新生成的公开信息,生成成本几乎为零,但 CN 与 SAN 必须一次写全,O/OU 字段在 OV、EV 场景下必须与营业执照逐字一致。命令记住 -subj 定身份、-addext 定域名,生成后用 -text 复核一遍,能省掉绝大多数返工。签发被退回的具体报错,可以贴到 GJ站长论坛的问答版块,把 CA 返回的原文和 CSR 的 -text 输出一起给出,定位通常几分钟就够。