【问题标题】:Download the public key in .PEM format from Azure Key Vault从 Azure Key Vault 下载 .PEM 格式的公钥
【发布时间】:2022-10-20 18:44:11
【问题描述】:
是否有 python sdk 调用从 azure keyvault 下载 .pem 格式的公钥。
是的,我们可以使用 Az CLI “az keyvault key download” 并直接使用 azure 门户下载公钥,但我们正在寻找 python sdk 调用
下面的代码只给出了密钥名称或密钥版本,而不是实际的公钥
get_key 检索以前存储在 Vault 中的密钥。
from azure.identity import DefaultAzureCredential
from azure.keyvault.keys import KeyClient
credential = DefaultAzureCredential()
key_client = KeyClient(vault_url="https://my-key-vault.vault.azure.net/", credential=credential)
key = key_client.get_key("key-name")
print(key.name)
key = key_client.get_key("key-name") >> 给出存储在密钥库中的密钥名称,而不是实际的公钥
我们正在寻找
-----开始公钥-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAzkA+yiEvKHY5SbCcwwY376BZHowPTeDpLzKuAAd5N0QMjCu8GS8OVDnkhu1NxZl30OqvTTVTdd756TOAtALy3/dVVJbe/rB7K0ry/+mkZoWz922KgqXb+BeF+TMficf+zOgkd1PIkzuiiI4OMbIDnLqEd5Hka1RQFwKCzrHHA+V29LJWH0geHe1Q/REaAI/eq5yiIIXcudwpN3ngAKvgDYnX+J0R7fwie1DzzZfdC4sBZfeOthI4aFIfSCAKejnDeLAS3PcQUfh61b6xj+5rZts0zISx7Dz3RQFQIDAQAB
-----结束公钥-----
请任何知道这个问题的人,可以带来一些启示。
【问题讨论】:
标签:
python
azure
azure-keyvault
private-key
public-key
【解决方案2】:
正如杰克在另一个答案中提到的那样,可以从与证书关联的秘密中获取证书的公钥(和私钥)——here 是一个演示了这一点的示例。
不过,您似乎想要 Key Vault 密钥的公钥,而不是证书的密钥。没有直接的方法可以使用azure-keyvault-keys 来获取它,但是您可以使用密钥的 JWK(获取的密钥的 .key property)来构造公钥的 PEM。
以下示例显示了如何使用 RSA 密钥执行此操作,但也说明了如何针对 EC 密钥进行调整:
from base64 import urlsafe_b64encode
from cryptography.hazmat.primitives import serialization
import jwt
from azure.identity import DefaultAzureCredential
from azure.keyvault.keys import KeyClient
vault_url= "https://{vault-name}.vault.azure.net"
credential = DefaultAzureCredential()
client = KeyClient(vault_url, credential)
key = client.get_key("{key-name}")
# The JsonWebKey in `key.key` is correct, but may contain fields with None values
usable_jwk = {}
for k in vars(key.key):
value = vars(key.key)[k]
if value:
usable_jwk[k] = urlsafe_b64encode(value) if isinstance(value, bytes) else value
# The following code is meant for RSA keys
# For EC keys, use `jwt.algorithms.ECAlgorithm.from_jwk(usable_jwk)`
public_key = jwt.algorithms.RSAAlgorithm.from_jwk(usable_jwk)
public_pem = public_key.public_bytes(
encoding=serialization.Encoding.PEM,
format=serialization.PublicFormat.SubjectPublicKeyInfo
)
print(public_pem)
(我在 Python 中使用 Azure SDK)
【解决方案3】:
当您从 Azure Key Vault 下载 get_key 时,您只能获取公钥,要获取私钥,您需要将其作为机密下载。
是的,这很奇怪......
【解决方案4】:
我们可以从 azure key-vault 下载 .pem 格式的公钥。
向密钥保管库注册服务主体
self.KVUri = f"https://{keyVaultName}.vault.azure.net"
self.credential = ClientSecretCredential(
tenant_id="xxxxxxxxxxxxxxxxxxxxxxxxx",
client_id="xxxxxxxxxxxxxxxxxxxxxxxxx",
client_secret="xxxxxxxxxxxxxxxxxxxxxxxxx")
self.key_client = KeyClient(vault_url=self.KVUri,
credential=self.credential)
一、在keyvault中生成key
key_client.create_rsa_key("key-name", 2048)
代码 sn -p 下载公钥:
key = self.key_client.get_key(device_name)
# use a key's JsonWebKey or JWK class (A fetched key's .key property)
# to construct a PEM of the public key.
usable_jwk = {}
for k in vars(key.key):
value = vars(key.key)[k]
if value:
usable_jwk[k] = urlsafe_b64encode(value) if isinstance(
value, bytes) else value
# The following code is meant for RSA keys
# For EC keys, use `jwt.algorithms.ECAlgorithm.from_jwk(usable_jwk)`
public_key = jwt.algorithms.RSAAlgorithm.from_jwk(usable_jwk)
public_pem = public_key.public_bytes(
encoding=serialization.Encoding.PEM,
format=serialization.PublicFormat.SubjectPublicKeyInfo
)
public_pem 是 .pem 格式的公钥。