如何使用Azure Key Vault Python SDK通过证书签名字符串?
解决Azure Key Vault证书签名字符串的问题
你遇到的错误是因为CryptographyClient是用于和Azure Key Vault服务端交互的工具,它要求传入KeyVaultKey实例或密钥ID,而不是本地提取的私钥对象。下面提供两种可行的签名方案:
方案一:使用Azure Key Vault服务端签名(推荐)
AKV中创建证书时,会自动生成关联的密钥(名称与证书一致)。直接使用这个密钥通过服务端完成签名,私钥不会离开AKV,更安全。
代码示例
import os import hashlib from azure.identity import DefaultAzureCredential from azure.keyvault.keys import KeyClient from azure.keyvault.keys.crypto import CryptographyClient, SignatureAlgorithm VAULT_URL = os.environ["AZURE_VAULT_URL"] CERTIFICATE_NAME = os.environ["AZURE_CERTIFICATE_NAME"] credential = DefaultAzureCredential() # 创建Key客户端,获取证书关联的密钥 key_client = KeyClient(vault_url=VAULT_URL, credential=credential) key = key_client.get_key(CERTIFICATE_NAME) # 初始化CryptographyClient cryptography_client = CryptographyClient(key, credential=credential) # 生成待签名字符串的哈希 digest = hashlib.sha256(b"an example string i want to sign").digest() # 调用服务端签名 result = cryptography_client.sign(SignatureAlgorithm.rs256, digest) print(f"Key ID: {result.key_id}") print(f"Algorithm: {result.algorithm}") print(f"Signature: {result.signature}") signature = result.signature
权限要求
确保你的身份凭证(比如服务主体、用户)拥有Key Vault的Key Sign权限。
方案二:本地使用提取的私钥签名
如果必须在本地完成签名,可以直接用cryptography库操作提取的私钥,无需使用Azure的CryptographyClient。
代码示例
import os import hashlib import base64 from cryptography.hazmat.primitives import hashes from cryptography.hazmat.primitives.asymmetric import padding from cryptography.hazmat.primitives.serialization import pkcs12 from azure.identity import DefaultAzureCredential from azure.keyvault.secrets import SecretClient VAULT_URL = os.environ["AZURE_VAULT_URL"] CERTIFICATE_NAME = os.environ["AZURE_CERTIFICATE_NAME"] credential = DefaultAzureCredential() secret_client = SecretClient(vault_url=VAULT_URL, credential=credential) # 获取证书对应的机密并解析出私钥 certificate_secret = secret_client.get_secret(name=CERTIFICATE_NAME) cert_bytes = base64.b64decode(certificate_secret.value) private_key, public_certificate, additional_certificates = pkcs12.load_key_and_certificates( data=cert_bytes, password=None ) # 待签名的字符串 message = b"an example string i want to sign" # 本地签名 signature = private_key.sign( message, padding.PKCS1v15(), hashes.SHA256() ) print(f"Signature: {base64.b64encode(signature).decode('utf-8')}")
权限要求
确保你的身份凭证拥有Key Vault的Secret Get权限。
内容的提问来源于stack exchange,提问作者P3tray
相关产品推荐
相关产品推荐

