自签名证书生成
编码所有处理都在浏览器本地完成,数据不上传服务器
生成一对 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 验证可解析
- 私钥从不离开浏览器,不会上传、不会被记录
使用方法
- 填主题名(本地开发就是 `localhost`)
- 按需填组织名、有效期、密钥长度与签名哈希
- 点「运行」—— 1024 / 2048 位一两百毫秒就好,3072 / 4096 位要等几秒(不是卡住了)
- 复制私钥与证书两段 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。
相关工具
RSA 加解密
编码用 PEM 公钥加密、私钥解密,或做签名与验签,还能在线生成 RSA 密钥对。支持 SPKI / PKCS#8 与 PKCS#1 四种 PEM 写法,全部在本地完成。
哈希计算
编码算出文本的 MD5、SHA-1、SHA-256 或 SHA-512 摘要,也可算老系统用的 MD4 与 MD2,中文按 UTF-8 字节计算。全部在本地完成。
Bcrypt 生成与验证
编码生成 bcrypt 密码哈希($2y$ 前缀)或验证密码与已有哈希是否匹配,成本因子可调,全部在浏览器本地完成。
Base64 编解码
编码把文本转成 Base64,或把 Base64 还原成文本,中文与 emoji 都按 UTF-8 正确处理。全部在浏览器本地完成,内容不上传。
URL 编解码
编码把中文、空格与符号转义成 %XX,或把 %XX 还原成文本;整条 URL 与单独的参数值要选对方式,选错不会报错,但链接会打不开。全部在浏览器本地完成。
HTML 实体编解码
编码把 < > & 与引号转成 HTML 实体,也能把实体还原成字符,而且只解一遍:&lt; 得到的是 < 而不是尖括号。全部在浏览器本地完成。