You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 02:16:24