私钥被格式化有什么特别之处?

2024-09-28 21:53:04 发布

您现在位置:Python中文网/ 问答频道 /正文

我尝试在python3.4中使用Google API with a oAuth service account。其中一个步骤是generate a JSON Web Token,为此我使用^{}。在

我的生成代码如下:

# opening the certificate downloaded from the Google API console
# it is password protected by the standard password ('notasecret')
p12 = OpenSSL.crypto.load_pkcs12(open('certfromgoogle.p12', 'rb').read(), 'notasecret')

# extracting the private key from the certificate and dumping it to a PEM
# format (FILETYPE_PEM)
private_key = OpenSSL.crypto.dump_privatekey(OpenSSL.crypto.FILETYPE_PEM, p12.get_privatekey())

# at that stage, private_key contains the private key as
# b'-----BEGIN PRIVATE KEY-----\nMIICdg(...)FIyw==\n-----END PRIVATE KEY-----\n'

# trying to get the JWT
encoded = jwt.encode(claim, private_key, algorithm='RS256', headers={"alg": "RS256", "typ": "JWT"})

jwt.encode的调用与TypeError: Expecting a PEM-formatted key一起崩溃。完整的回溯:

^{pr2}$

然而,私钥似乎提取正确。在

为什么这个格式不正确?在


Tags: thetokeyfromapigoogleitpassword
2条回答

What is special for a private key to be PEM-formatted?

PEM是一种表示编码。它有熟悉的 -BEGIN XXX -和{}。在

我认为BEGIN PRIVATE KEY是一个PKCS#8私钥。也许库需要一个PKCS#1私钥和BEGIN RSA PRIVATE KEYBEGIN RSA PRIVATE KEY也被称为传统的密钥编码(与PKCS#8相反)。在

您应该检查相关文档并以正确的格式提供密钥。在

要从传统密钥转换为PKCS#8密钥,请参阅^{}的OpenSSL手册页。-topk8很有趣。另请参见How to convert PKCS#8-formatted PEM private key to the tranditional format?

要从PKCS#8密钥转换为传统密钥,请参阅^{}的OpenSSL手册页。另请参见Convert PEM traditional private key to PKCS8 private key?

在检查了PyJWT源代码之后,很明显,库希望PEM数据是字符串类型,但是您提供的是bytestring(在您的问题中,b'...'文本很明显)。 有问题的函数是^{},还有{a2}的定义。在

必须将私钥数据解码为本机str类型:

private_key_bytes = OpenSSL.crypto.dump_privatekey(OpenSSL.crypto.FILETYPE_PEM, p12.get_privatekey())
private_key = private_key_bytes.decode('utf-8')

这似乎只对Python3是必需的,但是上面的代码应该也适用于Python2。在

相关问题 更多 >