如何使用Azure Key Vault中的PFX证书发送Python POST请求
解决从Azure Key Vault获取PFX证书并用于Requests请求的问题
问题分析
你将PFX证书上传至Azure Key Vault后,通过CertificateClient和SecretClient获取了证书对应的secret,但在转换证书格式用于Requests POST请求时遇到两个错误:
- 使用
x509.load_der_x509_certificate解析时提示ASN1解析错误——因为从Key Vault获取的secret是PKCS12(PFX)格式的Base64编码,而非单独的DER格式证书。 - 使用
crypto.load_pkcs12时提示PKCS12对象不可下标——因为Requests的cert参数不接受PKCS12对象,需要的是PEM格式的证书和私钥对。
正确解决方案
使用cryptography库解析PKCS12数据,提取证书和私钥并转换为PEM格式,直接传入Requests的cert参数:
完整代码示例
from azure.identity import DefaultAzureCredential from azure.keyvault.certificates import CertificateClient from azure.keyvault.secrets import SecretClient from cryptography.hazmat.primitives import serialization from cryptography.hazmat.backends import default_backend import base64 import requests # 1. 从Key Vault获取证书对应的secret credential = DefaultAzureCredential() vault_url = "https://something.vault.azure.net/" certificate_client = CertificateClient(vault_url=vault_url, credential=credential) certificate = certificate_client.get_certificate("aemocert") secret_client = SecretClient(vault_url=vault_url, credential=credential) secret = secret_client.get_secret(certificate.name) # 2. 解析PKCS12数据,提取证书和私钥 pkcs12_data = base64.b64decode(secret.value) # 如果PFX设置了密码,将password改为b"你的密码",否则传None pkcs12 = serialization.pkcs12.load_pkcs12( pkcs12_data, password=None, backend=default_backend() ) # 转换为PEM格式 cert_pem = pkcs12.certificate.public_bytes(encoding=serialization.Encoding.PEM) private_key_pem = pkcs12.private_key.private_bytes( encoding=serialization.Encoding.PEM, format=serialization.PrivateFormat.PKCS8, encryption_algorithm=serialization.NoEncryption() ) # 3. 发送POST请求 url = "https://myurl" headers = {"X-id": "dsd"} data = {"test":"test"} response = requests.request( "POST", url=url, headers=headers, data=data, cert=(cert_pem, private_key_pem), timeout=10 ) # 可选:查看响应结果 print(response.status_code) print(response.text)
关键说明
- Azure Key Vault中,上传的PFX证书会以PKCS12格式存储为secret,因此需要完整解析这个包才能拿到证书和私钥。
- Requests的
cert参数支持传入**(证书PEM字符串, 私钥PEM字符串)**的元组,无需保存到本地文件。
内容的提问来源于stack exchange,提问作者Ali
相关产品推荐
相关产品推荐

