我厌倦了运行 OpenSSL 命令,于是为 JWK 生成创建了一个 CLI

发布: (2026年2月27日 GMT+8 16:46)
4 分钟阅读
原文: Dev.to

Source: Dev.to

介绍

有一种只有开发者才懂的挫败感。当你需要做一些相对简单的事,却被工具链逼着走多个手动步骤、每次都要在终端里搜索命令,并且生成的文件格式你也不确定是否正确时,这种感觉尤为强烈。

问题

我在对接一个服务时,需要使用 JWK(JSON Web Key) 格式的密钥,而不是 PEM。
我已经知道如何使用 OpenSSL 生成密钥对:

# Generate a private EC key
openssl ecparam -name prime256v1 -genkey -noout -out private.pem

# Derive the public key
openssl ec -in private.pem -pubout -out public.pem

然而,将这些 PEM 文件转换成 JWK 却非常繁琐。我写了一个一次性的 Node.js 脚本,手动构造 JWK 对象,仔细检查 ktycrvxyd 字段,然后保存输出。虽然能用,但我知道以后还得重复这个过程。

解决方案:jwk-cli-tool

我构建了 jwk-cli-tool,一个交互式 CLI,能够完整处理整个工作流:

  • 生成新的 PEM 密钥对(EC 或 RSA)
  • 将 PEM 文件转换为 JWK JSON 格式
  • 在一次流程中完成上述两步

该工具会生成四个文件:

  • *.private.pem
  • *.public.pem
  • *.private.jwk.json
  • *.public.jwk.json

支持的算法

类型算法
ECES256, ES384, ES512
RSARS256, RS384, RS512

安装与使用

无需安装。使用 npx 直接运行工具:

npx jwk-cli-tool

你会看到交互式菜单:

? 你想要做什么?
> 生成新的 PEM 密钥对
  生成 JWK JSON 文件
  退出

随后可以:

  1. 为密钥命名
  2. 选择算法
  3. 选择生成全新的 PEM 文件,或使用 keys 文件夹中已有的文件

生成的文件会放在:

  • keys/ – 存放 PEM 文件
  • outputs/ – 存放 JWK JSON 文件

如果目录不存在,工具会自动创建。如果密钥名称已存在,CLI 会在覆盖前提示确认。

示例输出

ES256 密钥执行整个流程后,生成的公钥 JWK 大致如下:

{
  "kty": "EC",
  "use": "sig",
  "alg": "ES256",
  "kid": "myapp",
  "crv": "P-256",
  "x": "f83OJ3D2xF1Bg8vub9tLe1gHMzV76e8Tus9uPHvRVEU",
  "y": "x_FEzRu9m36HLN_tue659LNpXW6pCyStikYjKIWI5a0"
}

私钥 JWK 除了上述字段外,还会包含 d 参数。

实现细节

  • 使用 Node.jsTypeScript 构建
  • 采用 @inquirer/prompts 实现基于文本的 UI
  • 依赖 Node 内置的 crypto 模块——无需额外的重量级加密依赖

工具会写入 process.cwd(),因此无论你从哪个目录运行 npx jwk-cli-toolkeys/outputs/ 文件夹都会出现在该目录下。

开源

  • GitHub:
  • npm:

贡献

欢迎提交 Pull Request 和反馈。如果你需要额外的算法或功能(例如 EdDSA/Ed25519、JWKS 数组输出、用于 CI 流水线的非交互模式),请随时打开 Issue。

有时候最好的工具来源于解决自己的问题。希望这能帮其他人省下同样的 30 分钟 OpenSSL 查询时间。

0 浏览
Back to Blog

相关文章

阅读更多 »