如何将PuTTY生成的SSH-1 RSA密钥对转为Express后端JWT认证兼容格式
转换PuTTY SSH-1 RSA密钥为JWT兼容格式
嘿,我来帮你搞定PuTTY密钥转JWT可用格式的问题!你遇到的十进制公钥和PuTTY私钥格式,确实和JWT库(express-jwt、jsonwebtoken这些)要求的PEM/OpenSSH格式不兼容,咱们一步步来转换:
一、转换PuTTY SSH-1 RSA公钥到PEM格式(用于JWT验证)
你的公钥是十进制格式的SSH-1 RSA密钥,需要转成PEM格式(JWT库的标准输入格式),有两种方式:
方式1:用PuTTYgen图形界面(简单直观)
- 打开PuTTYgen工具,点击左上角「Load」按钮,选择你的PuTTY公钥文件(注意文件类型选「All Files」才能看到)
- 加载成功后,顶部菜单栏选择「Conversions」→「Export Public Key」
- 保存文件为
public_key.pem,这个就是JWT验证能用的PEM格式公钥了
方式2:用命令行(适合批量/服务器环境)
如果你的环境有OpenSSH工具包,直接用ssh-keygen命令转换:
ssh-keygen -i -f your_putty_public_key_file > public_key.pem
解释:-i参数表示导入PuTTY格式的密钥,输出就是标准OpenSSH PEM格式。
二、转换PuTTY私钥到OpenSSH PEM格式(用于JWT签名)
你的私钥是PuTTY专属的「SSH PRIVATE KEY FILE FORMAT 1.1」二进制格式,得转成OpenSSH的PEM私钥才能给jsonwebtoken用来签名JWT:
方式1:PuTTYgen图形界面
- 打开PuTTYgen,点击「Load」加载你的PuTTY私钥文件
- 如果私钥有密码保护,输入密码解锁
- 菜单栏选择「Conversions」→「Export OpenSSH key」,保存为
private_key.pem
方式2:命令行(PuTTYgen命令行版本)
如果安装了PuTTY工具包的命令行组件,用以下命令:
puttygen your_putty_private_key_file -O private-openssh -o private_key.pem
解释:-O private-openssh指定输出为OpenSSH私钥格式,-o指定输出文件。
三、在Express后端中使用转换后的密钥
转换完成后,就能直接和你的JWT库配合使用了:
1. 用私钥签名JWT(jsonwebtoken)
const jwt = require('jsonwebtoken'); const fs = require('fs'); // 读取PEM格式私钥 const privateKey = fs.readFileSync('./private_key.pem', 'utf8'); // 签名生成JWT const token = jwt.sign( { userId: 'test-user', role: 'admin' }, // 自定义Payload privateKey, { algorithm: 'RS256', expiresIn: '1h' } // 用RS256算法,1小时过期 ); console.log('生成的JWT:', token);
2. 用公钥验证JWT(express-jwt)
const express = require('express'); const jwt = require('express-jwt'); const fs = require('fs'); const app = express(); const publicKey = fs.readFileSync('./public_key.pem', 'utf8'); // 全局JWT验证中间件 app.use(jwt({ secret: publicKey, algorithms: ['RS256'] // 必须和签名时的算法一致 })); // 受保护的路由 app.get('/api/protected', (req, res) => { res.send(`欢迎访问受保护路由,当前用户ID:${req.user.userId}`); }); app.listen(3000, () => console.log('服务器启动在3000端口'));
3. (可选)转成JWKS格式配合jwks-rsa使用
如果你的架构需要用JWKS(JSON Web Key Set)来管理密钥,可以把PEM公钥转成JWKS:
const pemToJwk = require('pem-jwk'); const fs = require('fs'); const publicKeyPem = fs.readFileSync('./public_key.pem', 'utf8'); const jwk = pemToJwk(publicKeyPem); // 生成JWKS格式 const jwks = { keys: [jwk] }; fs.writeFileSync('./jwks.json', JSON.stringify(jwks, null, 2));
之后就能用jwks-rsa库从这个JWKS文件加载密钥进行验证了。
注意事项
- SSH-1 RSA用的是SHA1哈希算法,JWT推荐用RS256(SHA256withRSA),转换后的密钥完全支持这个算法,所以签名和验证时一定要指定
algorithms: ['RS256'] - 私钥一定要妥善保管,不要暴露给前端或不可信环境
- 如果密钥有密码保护,签名时需要传入密码参数(比如
jwt.sign(..., { passphrase: 'your-password' }))
内容的提问来源于stack exchange,提问作者Crowdpleasr
相关产品推荐
相关产品推荐

