JWK 与 PEM 互转工具
身份提供方以 JWKS 的形式公开签名密钥:一份塞满 base64url 数字的 JSON 文档。而几乎所有验证令牌的库都要的是 PEM。两种格式用完全不同的形状描述同一个密钥,于是这道沟壑常常只能靠手工填平。 这个工具可以双向转换。粘贴一个 JWK、整个 JWKS,或者一个乃至多个 PEM 公钥,每个密钥都会以另一种格式返回,同时告诉你它究竟是什么:密钥类型、RSA 长度或椭圆曲线、密钥若有声明则显示算法与用途,以及 RFC 7638 指纹——不论随行字段如何,都能标识密钥本身的规范化指纹。 转换本身由浏览器自带的 WebCrypto 实现完成,而不是手工拼装 ASN.1,也就是说这些字节出自浏览器中验证签名的同一份代码。没有任何内容被上传;如果粘贴的 JWK 含有私钥材料,私有成员会在其他处理之前被剔除,并给出提示。
只放公钥。私有成员会在读取前被移除,且不会上传任何内容。
粘贴 JWK、JWKS 或 PEM 公钥即可转换。
使用方法
- 粘贴 JWK、JWKS 文档或 PEM 公钥。
- 查看详情:密钥类型、长度或曲线,以及声明的算法。
- 需要 PEM 的库就复制 PEM,需要 JWKS 就复制 JWK。
- 用指纹确认两份副本确实是同一个密钥。
- 一次粘贴多个 PEM 块即可批量转换。
常见问题
- RFC 7638 指纹是什么?
- 对一个只包含定义密钥所需成员的规范化 JSON 求 SHA-256。对 RSA 而言就是 e、kty、n,按此顺序且不含空白。因为其余内容全部排除,同一个密钥的两份副本即使一份带 kid、alg、use 而另一份没有,指纹也完全相同。
- 指纹和 kid 是一回事吗?
- 不一定。kid 只是签发方给这个密钥起的名字,可以是任意内容。很多签发方用 RFC 7638 指纹作为 kid,所以两者经常一致,但并没有规定必须如此。
- 可以转换私钥吗?
- 不可以。如果粘贴的 JWK 含有私有成员,会在读取密钥之前被移除,只转换公钥部分。无论如何都不会上传,但私钥本就不该出现在网页里。
- 支持哪些密钥类型?
- RSA,以及 NIST 曲线 P-256、P-384、P-521,在浏览器支持时还包括 Ed25519。WebCrypto 未实现的曲线(例如 secp256k1)无法在这里转换。
- 为什么转换出的 JWK 没有 alg?
- 因为 PEM 本身不携带 alg。要读取密钥就必须在导入时指定算法,若在结果里保留 alg,那只是本工具的假设而非密钥自己的声明,因此予以移除。
- 我的密钥会被上传吗?
- 不会。转换使用浏览器内置的 WebCrypto 在本地完成,不会发送到任何服务器。
相关工具
Base64 与十六进制互转
在浏览器中将 Base64 字符串转换为十六进制字节,并将十六进制转换回 Base64,支持 URL-safe。
JWT 解码器
解码 JSON Web Token,查看其头部、声明和过期时间。
JWT 生成器
用 Header 与 Payload 构建并签发 HS256 / HS384 / HS512 JWT——与 JWT 解码器配套。
Punycode 转换器
在 Unicode(`münchen.de`)与 Punycode ASCII(`xn--mnchen-3ya.de`)间转换国际化域名。
Base45 编码与解码工具
在浏览器中按照 RFC 9285 将文本编码为 Base45,并将 Base45 解码回文本。
Quoted-Printable 编码与解码
将文本编码为 MIME Quoted-Printable(RFC 2045)或解码 — 处理 =XX 转义、软换行与 UTF-8 — 全部在浏览器内完成,编码时按 76 字符换行。