You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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支持的对象:

  1. 先安装paramiko:
pip install paramiko
  1. 修改代码如下:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 03:30:50