【问题标题】:How to Get Private Key from Certificate in an Azure Key Vault?如何从 Azure Key Vault 中的证书获取私钥?
【发布时间】:2020-02-07 07:33:20
【问题描述】:

我在 Azure Key Vault 中有一个证书,我想从中提取私钥。

根据Microsoft Docs

创建 Key Vault 证书时,还会创建具有相同名称的可寻址密钥和机密。 Key Vault 密钥允许密钥操作,而 Key Vault 机密允许将证书值作为机密检索。

但是,我没有成功从中提取私钥。这是我尝试的一些python代码的示例:

pem_data  = get_secret('https://keyvault.azure.net/', 'x509-cert')
pem_data = '-----BEGIN CERTIFICATE----- ' + pem_data + ' -----END CERTIFICATE-----'
pem_data = pem_data.encode()
key = x509.load_pem_x509_certificate(pem_data,  backend=default_backend())
private_key = key.private_key()

但是,这会出错,说它无法加载证书。

【问题讨论】:

    标签: python azure x509certificate azure-keyvault key-pair


    【解决方案1】:

    您从密钥库中获取的 pem_data 已经是 pem 格式,您只能获取公钥。

    pem_data = client.get_secret("https://XX.vault.azure.net/", "XX", "XX")
    pem_data = pem_data.value.encode()
    
    cert = load_pem_x509_certificate(pem_data,  backend=default_backend())
    public_key = cert.public_key()
    

    如果要获取私钥,可以使用OpenSSL:

    import OpenSSL.crypto
    
    pem_data = client.get_secret("https://XX.vault.azure.net/", "XX", "XX")
    pem_data = pem_data.value.encode()
    crtObj = crypto.load_certificate(crypto.FILETYPE_PEM, pem_data)
    pubKeyObject = crtObj.get_pubkey()
    priKeyString = crypto.dump_privatekey(crypto.FILETYPE_PEM, pubKeyObject)
    print(priKeyString)
    

    注意:

    请确保您在创建证书时已指明密钥是可导出的。如果策略指示不可导出,则当作为秘密检索时,私钥不是值的一部分。详情请参阅this document

    【讨论】:

    • 您获取私钥的代码给了我以下错误:OpenSSL.crypto.Error: [('PEM routines', 'get_name', 'no start line')]
    • 我刚刚从您的屏幕截图中注意到您的内容类型显示 PKCS#12,我的也是。这是否意味着我从秘密中获得的数据不是 PEM?
    • 我的卡在 pkcs12 中。不管怎样,我只标记这个。
    【解决方案2】:

    现在有一个用于azure-keyvault-certificatessample,它显示了如何使用pyOpenSSL 从证书中获取私钥:

    import base64
    from azure.identity import DefaultAzureCredential
    from azure.keyvault.secrets import SecretClient
    from cryptography.hazmat.primitives.serialization import pkcs12
    
    vault_url = "https://{vault-name}.vault.azure.net"
    cert_name = "certificate name"
    credential = DefaultAzureCredential()
    
    secret_client = SecretClient(vault_url=vault_url, credential=credential)
    certificate_secret = secret_client.get_secret(name=cert_name)
    
    # Now we can extract the private key and public certificate from the secret using the cryptography
    # package.
    # This example shows how to parse a certificate in PKCS12 format since it's the default in Key Vault,
    # but PEM certificates are supported as well. With a PEM certificate, you could use load_pem_private_key
    # in place of load_key_and_certificates.
    cert_bytes = base64.b64decode(certificate_secret.value)
    private_key, public_certificate, additional_certificates = pkcs12.load_key_and_certificates(
        data=cert_bytes,
        password=None
    )
    

    可在此处找到有关用于 Key Vault 的新 Azure SDK 包(替换 azure-keyvault)的更多文档:

    (我使用 Python 开发 Azure SDK)

    【讨论】:

      猜你喜欢
      • 2020-08-11
      • 2019-01-27
      • 2018-12-29
      • 2021-10-10
      • 1970-01-01
      • 2019-02-16
      • 2018-09-11
      • 1970-01-01
      • 2018-07-19
      相关资源
      最近更新 更多