使用Python从Azure Key Vault解码JsonWebKey

时间:2019-02-25 14:35:52

标签: python azure key rsa

我有一个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格式保存。

我尝试了其他解码方式,但是在解码字节方面没有成功。任何帮助或解决此问题的技巧将不胜感激。

1 个答案:

答案 0 :(得分:1)

注意。我正在使用jwcrypto。

不确定是否与此有关,但是最近几天我一直在与JWK挣扎。帮助我的一件事是base64编码和解码e和n(密钥的指数和模数): base64.urlsafe_b64encode(n).decode()的作用是将ASCII编码(我相信)字节的n值(b'...')接收并返回base64编码的字节,然后将其解码为字符串,因为这是我的输入所需要的

  • 初始n值:b'\xd4b\xd3/"Vi\x8b\xce\xaf...\xf1\xec\xcd
  • base64编码:b'1GLTLyJWaYvOrwdje1O3...OvHszQ==
  • 已解码:'1GLTLyJWaYvOrwdje1O3...OvHszQ==(请注意末尾的'==',这是您期望在私钥末尾看到的内容)

同样,不确定是否有帮助。

This提供了一些参数的上下文,据我对this文章的了解,您实际上不能从Key Vault中获得私钥,而只能从公共Vault中获取私钥。