如何使用 python 将私钥编码为 RS256 格式的 JSON WEB TOKEN

Posted

技术标签:

【中文标题】如何使用 python 将私钥编码为 RS256 格式的 JSON WEB TOKEN【英文标题】:How to encode private key as JSON WEB TOKEN in RS256 format using python 【发布时间】:2021-03-28 05:45:47 【问题描述】:

嗯,我已经经历了很多问题,以及他们各自的答案,主要是代替私钥(从 -----BEGIN RSA PRIVATE KEY----- 开始)在 jwt 中编码,公钥是正在发送(不是从 -----BEGIN RSA PRIVATE KEY----- 开始)。 我已经在 python 中使用 pyjwt 库来编码并获取我用来发送到 docusign 以进行授权的所需令牌。 好吧,这就是我尝试过的方法,但不起作用

payload = 
    "iss": CLIENT_AUTH_ID,
    "sub": ACCOUNT_ID,
    "exp": unix,
    "aud": "account-d.docusign.com",
    "scope": "signature impersonation"

signed = jwt.encode(payload, private_key, algorithm='RS256')

它总是返回ValueError:无法反序列化数据,他们的HS256算法可以正常工作,但是当涉及到RS256时它不会,一些答案建议将其转换为PEM格式,但我的已经是那种格式(- ----BEGIN RSA PRIVATE KEY----- (code) -----END RSA PRIVATE KEY-----)

【问题讨论】:

【参考方案1】:

这对我有用,而不是使用 jwt 库 我的进口

from jose import jws
from cryptography.hazmat.primitives import serialization as crypto_serialization

private_key_pem 是 private.pem 文件的路径,其中我的私钥为 (-----BEGIN RSA PRIVATE KEY----- (code) -----END RSA PRIVATE KEY----- )

with open(private_key_pem, "rb") as key_file:
    private_key = serialization.load_pem_private_key(key_file.read(), password=None)

key = private_key.private_bytes(crypto_serialization.Encoding.PEM,
                                crypto_serialization.PrivateFormat.PKCS8,
                                crypto_serialization.NoEncryption())
signed = jws.sign(payload, key, algorithm='RS256')

以这种方式将 python-jose 用于 RS256 算法,希望可以工作

【讨论】:

【参考方案2】:

传递给jwt.encode 的私钥必须是字节文字b'"..."。我怀疑您的代码正在传递一个字符串(在 Python 中是 unicode 而不是字节)。

【讨论】:

您可以使用他们的官方文档,但仍然无法使用他们提供的 RS256 示例

以上是关于如何使用 python 将私钥编码为 RS256 格式的 JSON WEB TOKEN的主要内容,如果未能解决你的问题,请参考以下文章

使用 RSA SHA 256 对字符串进行签名,仅将私钥作为字符串 .NET

如何使用我自己的 rsa 私钥使用 rs256 算法对字节进行签名?

如何将私钥转换为 RSA 私钥?

使用 RSA 私钥在 Powershell 中将 JSON Web 令牌加密为 RSA RS256

ruby-jwt编码,用RS256算法解码

Azure Api 管理 ValidateJWT 与 Rs256 PrivateKey