跳到主要内容
AZ Tools

JWK 与 PEM 互转工具

身份提供方以 JWKS 的形式公开签名密钥:一份塞满 base64url 数字的 JSON 文档。而几乎所有验证令牌的库都要的是 PEM。两种格式用完全不同的形状描述同一个密钥,于是这道沟壑常常只能靠手工填平。 这个工具可以双向转换。粘贴一个 JWK、整个 JWKS,或者一个乃至多个 PEM 公钥,每个密钥都会以另一种格式返回,同时告诉你它究竟是什么:密钥类型、RSA 长度或椭圆曲线、密钥若有声明则显示算法与用途,以及 RFC 7638 指纹——不论随行字段如何,都能标识密钥本身的规范化指纹。 转换本身由浏览器自带的 WebCrypto 实现完成,而不是手工拼装 ASN.1,也就是说这些字节出自浏览器中验证签名的同一份代码。没有任何内容被上传;如果粘贴的 JWK 含有私钥材料,私有成员会在其他处理之前被剔除,并给出提示。

只放公钥。私有成员会在读取前被移除,且不会上传任何内容。

粘贴 JWK、JWKS 或 PEM 公钥即可转换。

使用方法

  1. 粘贴 JWK、JWKS 文档或 PEM 公钥。
  2. 查看详情:密钥类型、长度或曲线,以及声明的算法。
  3. 需要 PEM 的库就复制 PEM,需要 JWKS 就复制 JWK。
  4. 用指纹确认两份副本确实是同一个密钥。
  5. 一次粘贴多个 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 在本地完成,不会发送到任何服务器。

相关工具