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

How to encode private key as JSON WEB TOKEN in RS256 format using python

嗯,我已经经历了很多问题,以及他们各自的答案,主要是代替私钥(从 -----BEGIN RSA PRIVATE KEY----- 开始)在 jwt 中编码,public 正在发送密钥(不是从 -----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')

它总是 return 出现 ValueError: cannot deserialize the data, 他们的 HS256 算法工作正常,但是当涉及到 RS256 时它不会,一些答案建议将其转换为 PEM 格式,但我的是已经采用该格式 (-----BEGIN RSA PRIVATE KEY----- (code) -----END RSA PRIVATE KEY-----)

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

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

private_key_pem 是 private.pem 文件的路径,其中我有我的私钥 (-----开始 RSA 私钥----- (代码) -----结束 RSA 私钥----- )

with open(private_key_pem, "rb") as key_file:
    private_key = crypto_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 算法,有望工作

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