CSR (证书签名请求)
定义
CSR 是证书签名请求,包含申请者的公钥和希望写入证书的身份信息,用私钥签名后提交给 CA 以申请证书。
CSR(Certificate Signing Request)是申请者生成并提交给 CA 的 PKCS #10 结构(RFC 2986)。里面有申请者的公钥、主题可分辨名称,以及可选的扩展请求(如 SAN 多域名),整体用对应的私钥签名。这个签名证明申请者确实持有私钥,而私钥本身从不离开申请者的机器。
为什么重要
CSR 是你和 CA 之间的分界线:私钥留在你手里,CA 只拿到签发证书所需的信息。CA 把 CSR 当作"请求"而不是"命令":它会自己核验域名,忽略没有验证过的主题字段(比如 DV 证书即使 CSR 里填了 O 也不会写进去),有效期、密钥用途和策略也由 CA 决定。阿里云、腾讯云等控制台通常提供由系统生成 CSR 的选项,这时私钥由平台生成;如果希望私钥只留在自己的服务器上,应在本地生成 CSR 再上传。主题里要写中文组织名时,可以给 OpenSSL 加上 -utf8 参数避免乱码。
例子
openssl req -new -newkey rsa:2048 -nodes \
-keyout example.com.key -out example.com.csr \
-subj "/CN=example.com" \
-addext "subjectAltName=DNS:example.com,DNS:www.example.com"
openssl req -in example.com.csr -noout -text -verify
常见误区
- CSR 里包含私钥。 只有公钥,.key 文件不要发给任何人。
- CSR 里填的每个字段都会出现在证书里。 最终内容由 CA 根据验证结果决定。
- 续期时直接用去年的 CSR。 这等于继续使用同一对密钥,续期时重新生成密钥和 CSR 更稳妥。