我有一个Python脚本,可从Azure Key Vault检索RSA私钥。尝试序列化键值给出:
ValueError:无法反序列化关键数据。
key_bytes看起来像“ b'\ xb8w \ xb7 \ xce {s \ xf7 \ xa0 \ xce \ xba \ xf5#\ x07 \ x8b?\ x1d \ xc9m ...”
代码:
from azure.keyvault import KeyVaultClient, KeyVaultAuthentication
from azure.common.credentials import ServicePrincipalCredentials
from cryptography.hazmat.backends import default_backend
from cryptography.hazmat.primitives.asymmetric import rsa
from cryptography.hazmat.primitives.asymmetric import dsa
from cryptography.hazmat.primitives import serialization
subscription_id = "xxx"
VAULT_URL = "xxx"
KEY_ID = "xxx"
KEY_VERSION = "xxx"
credentials = ServicePrincipalCredentials(
client_id = 'xxx',
secret = 'xxx',
tenant = 'xxx'
)
client = KeyVaultClient(credentials)
key_bundle = client.get_key(VAULT_URL,
KEY_ID,
KEY_VERSION)
key_bytes = key_bundle.key.n
p_key = serialization.load_pem_private_key(
key_bytes,
password='xxx',
backend=default_backend()
)
通过以.p8格式从Blob存储中加载密钥,上述密钥序列化工作。密钥库要求密钥以pem格式保存。
我尝试了其他解码方式,但是在解码字节方面没有成功。任何帮助或解决此问题的技巧将不胜感激。
答案 0 :(得分:1)
注意。我正在使用jwcrypto。
不确定是否与此有关,但是最近几天我一直在与JWK挣扎。帮助我的一件事是base64编码和解码e和n(密钥的指数和模数):
base64.urlsafe_b64encode(n).decode()
的作用是将ASCII编码(我相信)字节的n值(b'...')接收并返回base64编码的字节,然后将其解码为字符串,因为这是我的输入所需要的
b'\xd4b\xd3/"Vi\x8b\xce\xaf...\xf1\xec\xcd
b'1GLTLyJWaYvOrwdje1O3...OvHszQ==
'1GLTLyJWaYvOrwdje1O3...OvHszQ==
(请注意末尾的'==',这是您期望在私钥末尾看到的内容)同样,不确定是否有帮助。
This提供了一些参数的上下文,据我对this文章的了解,您实际上不能从Key Vault中获得私钥,而只能从公共Vault中获取私钥。