我厌倦了运行 OpenSSL 命令,于是为 JWK 生成创建了一个 CLI
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 对象,仔细检查 kty、crv、x、y、d 字段,然后保存输出。虽然能用,但我知道以后还得重复这个过程。
解决方案:jwk-cli-tool
我构建了 jwk-cli-tool,一个交互式 CLI,能够完整处理整个工作流:
- 生成新的 PEM 密钥对(EC 或 RSA)
- 将 PEM 文件转换为 JWK JSON 格式
- 在一次流程中完成上述两步
该工具会生成四个文件:
*.private.pem*.public.pem*.private.jwk.json*.public.jwk.json
支持的算法
| 类型 | 算法 |
|---|---|
| EC | ES256, ES384, ES512 |
| RSA | RS256, RS384, RS512 |
安装与使用
无需安装。使用 npx 直接运行工具:
npx jwk-cli-tool
你会看到交互式菜单:
? 你想要做什么?
> 生成新的 PEM 密钥对
生成 JWK JSON 文件
退出
随后可以:
- 为密钥命名
- 选择算法
- 选择生成全新的 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.js 与 TypeScript 构建
- 采用
@inquirer/prompts实现基于文本的 UI - 依赖 Node 内置的
crypto模块——无需额外的重量级加密依赖
工具会写入 process.cwd(),因此无论你从哪个目录运行 npx jwk-cli-tool,keys/ 与 outputs/ 文件夹都会出现在该目录下。
开源
- GitHub:
- npm:
贡献
欢迎提交 Pull Request 和反馈。如果你需要额外的算法或功能(例如 EdDSA/Ed25519、JWKS 数组输出、用于 CI 流水线的非交互模式),请随时打开 Issue。
有时候最好的工具来源于解决自己的问题。希望这能帮其他人省下同样的 30 分钟 OpenSSL 查询时间。