我尝试在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
一起崩溃。完整的回溯:
然而,私钥似乎提取正确。在
为什么这个格式不正确?在
PEM是一种表示编码。它有熟悉的}。在
-BEGIN XXX -
和{我认为
BEGIN PRIVATE KEY
是一个PKCS#8私钥。也许库需要一个PKCS#1私钥和BEGIN RSA PRIVATE KEY
。BEGIN 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(在您的问题中,} ,还有{a2}的定义。在
b'...'
文本很明显)。 有问题的函数是^{必须将私钥数据解码为本机
str
类型:这似乎只对Python3是必需的,但是上面的代码应该也适用于Python2。在
相关问题 更多 >
编程相关推荐