如何使用 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的主要内容,如果未能解决你的问题,请参考以下文章