使用OpenSSH RSA密钥通过PyJWT签名JWT报错,是否支持此类密钥?
问题解答
不是无法使用OpenSSH密钥进行JWT签名,而是PyJWT依赖的cryptography库默认不支持OpenSSH格式的私钥(即-----BEGIN OPENSSH PRIVATE KEY-----开头的格式),导致解析失败。下面提供两种可行的解决方案:
方案1:将OpenSSH密钥转换为传统PEM格式
用ssh-keygen命令直接转换密钥格式,转换后密钥会变成-----BEGIN RSA PRIVATE KEY-----开头的标准PEM格式,PyJWT可以直接解析:
ssh-keygen -p -f ~/.ssh/id_rsa -m PEM -N ""
- 参数说明:
-p:修改密钥(这里用来转换格式)-f ~/.ssh/id_rsa:指定要转换的密钥文件路径-m PEM:指定输出格式为PEM-N "":设置空密码(如果原密钥有密码,替换为你的密码字符串即可)
转换完成后,你原来的Python代码就能正常运行。
方案2:不转换密钥,用paramiko库适配格式
如果不想修改密钥文件,可以用paramiko库读取OpenSSH格式的密钥,再转换为cryptography支持的对象:
- 先安装paramiko:
pip install paramiko
- 修改代码如下:
import jwt import paramiko from cryptography.hazmat.primitives import serialization # 读取OpenSSH私钥(如果有密码,添加password=b"你的密码"参数) ssh_key = paramiko.RSAKey.from_private_key_file("~/.ssh/id_rsa") # 转换为cryptography兼容的PKCS8格式PEM pem_key = ssh_key.as_private_key().private_bytes( encoding=serialization.Encoding.PEM, format=serialization.PrivateFormat.PKCS8, encryption_algorithm=serialization.NoEncryption() ) # 生成JWT token = jwt.encode( {'iss': 'me'}, key=pem_key, algorithm='RS256' )
注意事项
如果你的私钥设置了密码,无论用哪种方案,都需要在对应步骤中提供密码才能正常读取密钥。
内容的提问来源于stack exchange,提问作者renatodamas
相关产品推荐
相关产品推荐

