Расшифровка JsonWebKey из хранилища ключей Azure с помощью Python - PullRequest
0 голосов
/ 25 февраля 2019

У меня есть скрипт Python, который извлекает закрытый ключ RSA из хранилища ключей Azure.Попытка сериализации значения ключа дает:

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()
    )

Загрузка ключа изХранилище BLOB-объектов в формате .p8 работает с сериализованным ключом.Хранилище ключей требует, чтобы ключ был сохранен в формате pem.

Я пробовал разные декодирования и т. Д., Но мне не удалось расшифровать байты.Буду признателен за любую помощь или советы для решения этой проблемы.

1 Ответ

0 голосов
/ 27 февраля 2019

Примечание Я работал с 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== (обратите внимание на '==' в конце, то, что вы ожидаете увидеть в конце закрытого ключа)

Опять же,не уверен, поможет ли это.

Этот дает некоторый контекст параметров, и из того, что я понимаю из этой статьи, вы на самом деле не можете получить закрытый ключ изхранилище ключей, только публичное.

...