我有一个 python 脚本,可以从 Azure Key Vault 检索 RSA 私钥。尝试序列化键值会给出:
ValueError: Could not deserialize key data.
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()
)
通过从 Blob 存储中以 .p8 格式加载 key ,上述 key 序列化可以发挥作用。 Key Vault 要求 key 以 pem 格式保存。
我尝试了不同的解码等,但在解码字节方面没有成功。任何解决此问题的帮助或提示将不胜感激。
最佳答案
注意我正在使用 jwcrypto。
不确定这是否相关,但过去几天我一直在与 JWK 作斗争。对我有帮助的一件事是 Base64 编码和解码 e 和 n( key 的指数和模数):
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 中获取私钥,而只能获取公钥。
关于python - 使用 Python 从 Azure Key Vault 解码 JsonWebKey,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54868524/