【问题标题】: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


    【解决方案1】:

    以该格式获取证书的公钥(基于 PEM 格式的假设)的唯一方法是下载该格式的机密部分,该部分将包括公共和私人。

    在上面的代码中,您打印键的键名,因此它只显示名称: 打印(键名)

    尝试 print(key.n),有关返回 JSONWEBKey 的可用属性的更多信息,请参阅:https://learn.microsoft.com/en-us/python/api/azure-keyvault-keys/azure.keyvault.keys.jsonwebkey?view=azure-python

    【讨论】:

      【解决方案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 格式的公钥。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-06-02
            • 1970-01-01
            相关资源
            最近更新 更多