CSR 生成器
在浏览器本地生成 RSA 2048/4096、EC P-256/P-384、Ed25519 密钥对,手写 DER 编码出标准 PKCS#10 证书签名请求,导出 CSR 与私钥 PEM,并给出公钥 SHA-256 指纹与 openssl 校验命令,全程不发任何请求。
这一步生成的是密钥,不是证书
浏览器本地生成一对新密钥,再用私钥给一份「证书签名请求」签上名,产物就是 CSR。证书要交给 CA 用他们的私钥再签一次才会发回来。
所以私钥只在你的浏览器里存在,页面不发任何请求,关掉标签页后想找回只能重新生成 —— 之前签好的证书如果和这份私钥不是同一把,会装不上。
本地怎么验这份 CSR 对不对
存成 <code>csr.pem</code> 后:<code>openssl req -in csr.pem -noout -text</code> 看内容、<code>-verify</code> 验签名是否自洽(应输出 <code>verify OK</code>)。
公钥是否就是那把私钥的:<code>openssl req -in csr.pem -noout -pubkey</code> 与 <code>openssl pkey -in key.pem -pubout</code> 的输出对比,一致才对得上。
CN 与 SAN 有什么区别
现在浏览器基本只看 SAN,所以 CSR 里必须带 SAN,否则 CA 给了证书也会被浏览器判「域名不匹配」。CN 只在非常旧的客户端里还有意义。
SAN 可以写多个域名与邮箱;工具会把 <code>example.com</code> 自动补成 <code>example.com</code> 与 <code>www.example.com</code> 两条,这是常见搭配,不想要就在输入框里显式写清楚。
算法怎么选
RSA 2048 兼容性最好,CA 基本都收;RSA 4096 更强但生成慢一点、体积大;EC P-256/P-384 更快更小,现代客户端都支持;Ed25519 很新,部分老 CA 与老 OpenSSL 还不认。
这份 CSR 用的签名算法由上面的选项决定,与 CA 无关 —— CA 签发时用的是自己的算法。
常见问题
私钥会被传到哪去?
哪也不去。密钥由浏览器的 WebCrypto 在本地生成,PEM 由页面里的 JavaScript 拼出来,页面全程不发任何请求。生成后请自己复制或下载保存。
为什么每次点生成的私钥都不一样?
因为每次都是全新的随机密钥,没有复用也没有缓存,这是应该的行为。想复用同一把私钥签多个域名,就保存下这份私钥,用 openssl 或你自己的工具基于它再签。
为什么 Ed25519 会提示不支持?
浏览器从 2025 年前后才在 WebCrypto 里支持 Ed25519,老版本浏览器会直接报不支持。这种情况换 RSA 2048 或 EC 即可,生成的 CSR 对 CA 来说没有区别。
这份 CSR 能直接用吗?
结构上是标准的 PKCS#10,openssl 能验、CA 也认。但实际能不能签下来取决于你填的域名、你的域名所有权验证方式,以及 CA 自己的要求(比如必须 2048 位以上 RSA、公钥算法白名单等)。