piapia123
zh

自签名证书生成

编码

所有处理都在浏览器本地完成,数据不上传服务器

输出

生成一对 RSA 密钥与一张自签名的 X.509 证书,用于本地开发或内网测试的 HTTPS。整个过程在浏览器里完成 —— 私钥由 `crypto.subtle.generateKey` 现生成、只存在于这段输出里,不会经过任何服务器。⚠️ 有两点必须说清楚:自签名证书不被任何浏览器与操作系统信任,用它对外提供服务,访客会看到刺眼的警告页,正式环境请用受信任的 CA 签发的证书;另外私钥不要提交进版本库,它等同于你的身份。证书自带 SAN 扩展(把上面的 CN 写进去)—— 这一点很关键,Chrome 从 58 起完全忽略 CN,只认 SAN,一张只有 CN 的证书在今天的浏览器里连不上。

功能

  • 在本地生成 RSA 密钥对与自签名 X.509 v3 证书
  • 自带 SAN(subjectAltName)扩展 —— 现代浏览器只认它
  • 密钥长度可选 1024 / 2048 / 3072 / 4096 位,有效期 1 天到 10 年
  • 签名哈希可选 SHA-256(兼容性最好)/ SHA-384 / SHA-512
  • 私钥与证书都输出成标准 PEM,可直接给 nginx、Node、Python 使用
  • 证书用 ASN.1 DER 现拼(浏览器不能直接签发证书),已用 OpenSSL 验证可解析
  • 私钥从不离开浏览器,不会上传、不会被记录

使用方法

  1. 填主题名(本地开发就是 `localhost`)
  2. 按需填组织名、有效期、密钥长度与签名哈希
  3. 点「运行」—— 1024 / 2048 位一两百毫秒就好,3072 / 4096 位要等几秒(不是卡住了)
  4. 复制私钥与证书两段 PEM,分别存成文件

常见问题

浏览器为什么还是警告?
因为自签名证书不在任何信任库里。信任链的根是操作系统与浏览器内置的 CA 列表,自签名证书自己当自己的 CA,链条接不上,所以必然报警告。要在本地消掉它,得把这张证书手动导入系统的「受信任的根证书颁发机构」(macOS 是钥匙串、Windows 是证书管理器、Linux 看发行版)—— 但只在你自己的开发机上这么做,别在别人的机器上装它。
为什么证书里要有 SAN?我记得以前只看 CN?
那是 2017 年以前的事。Chrome 58(2017 年)起完全忽略 Common Name,只按 subjectAltName 匹配域名 —— 这是 RFC 6125 早就要求的做法。所以一张只写了 `CN=localhost` 而没写 SAN 的证书,在今天的主流浏览器里会直接判定「名称不匹配」,而错误提示只说证书有问题,很容易让人以为是证书签错了。本工具会自动把 CN 也写进 SAN。
生成的私钥安全吗?
密钥由浏览器的 `crypto.subtle.generateKey` 生成,用的是系统的密码学安全随机源,强度是够的。风险不在生成环节,而在你把它存到哪里:不要提交进 Git(一次提交就永远留在历史里,删掉也没用)、不要放进容器镜像、不要贴进聊天记录。开发机上用完可以随时删掉重新生成 —— 反正只要几秒钟。
密钥长度与签名哈希该选哪个?
本地开发用 2048 位 + SHA-256 就够了:兼容性最好,生成也快。1024 位已被认为不安全,只用于必须对接的老客户端;3072 / 4096 位更抗未来的分解能力,代价是生成要等几秒、握手也更慢。哈希方面,SHA-256 几乎所有客户端都认,SHA-384 / SHA-512 摘要更长、理论强度更高,但个别老客户端可能不支持 —— 拿不准就留在 SHA-256。

相关工具