Synapse中如何从KeyVault获取证书实现Kusto证书认证?
在Synapse中通过KeyVault链接服务获取证书用于Kusto认证
可以通过KeyVault链接服务获取存储在KeyVault中的证书,用于KustoConnectionStringBuilder的应用证书认证,以下是具体实现方案:
前提准备
- 已在Synapse工作区配置KeyVault链接服务,且该链接服务对应的托管标识在KeyVault访问策略中拥有证书获取和机密获取权限(证书的私钥会以同名机密存储在KeyVault中,需读取该机密)。
- KeyVault中已存入包含私钥的证书(上传时需选择允许导出私钥)。
实现步骤(Python,Synapse Spark)
1. 安装依赖库
在Synapse Spark notebook中先安装所需依赖:
%pip install pyopenssl azure-keyvault-certificates azure-keyvault-secrets azure-synapse-artifacts azure-identity
2. 读取并转换证书为PEM格式
from azure.synapse.artifacts import ArtifactsClient from azure.identity import ManagedIdentityCredential from azure.keyvault.certificates import CertificateClient from azure.keyvault.secrets import SecretClient import base64 import OpenSSL from azure.kusto.data import KustoConnectionStringBuilder # 配置参数 SYNAPSE_ENDPOINT = "https://<你的Synapse工作区>.dev.azuresynapse.net" LINKED_SERVICE_NAME = "<你的KeyVault链接服务名称>" CERT_NAME = "<KeyVault中的证书名称>" KUSTO_CLUSTER = "<你的Kusto集群URL>" AAD_CLIENT_ID = "<你的AAD应用客户端ID>" TENANT_ID = "<你的租户ID>" # 初始化Synapse Artifacts客户端(使用托管标识认证) credential = ManagedIdentityCredential() artifacts_client = ArtifactsClient( endpoint=SYNAPSE_ENDPOINT, credential=credential ) # 获取KeyVault链接服务的基础URL linked_service = artifacts_client.linked_service.get_linked_service(LINKED_SERVICE_NAME) keyvault_url = linked_service.properties.type_properties.base_url # 从KeyVault获取证书元数据(用于获取指纹) cert_client = CertificateClient(vault_url=keyvault_url, credential=credential) cert = cert_client.get_certificate(CERT_NAME) thumbprint = cert.properties.x509_thumbprint.hex() # 从KeyVault获取证书私钥(以机密形式存储) secret_client = SecretClient(vault_url=keyvault_url, credential=credential) cert_secret = secret_client.get_secret(CERT_NAME) pfx_data = base64.b64decode(cert_secret.value) # 将PFX格式转换为PEM格式(包含私钥和证书) p12 = OpenSSL.crypto.load_pkcs12(pfx_data) pem_private = OpenSSL.crypto.dump_privatekey(OpenSSL.crypto.FILETYPE_PEM, p12.get_privatekey()).decode() pem_cert = OpenSSL.crypto.dump_certificate(OpenSSL.crypto.FILETYPE_PEM, p12.get_certificate()).decode() full_pem = pem_private + pem_cert # 构建Kusto连接字符串 kcsb = KustoConnectionStringBuilder.with_aad_application_certificate_authentication( KUSTO_CLUSTER, AAD_CLIENT_ID, full_pem, thumbprint, TENANT_ID )
关键注意事项
- 确保Synapse托管标识(或链接服务使用的托管标识)在KeyVault访问策略中配置正确权限,否则会出现权限不足错误。
- 如果证书上传到KeyVault时未选择允许导出私钥,将无法获取到私钥,需重新上传证书并勾选导出选项。
- 所有敏感配置参数建议通过Synapse的工作区配置或KeyVault引用传入,避免硬编码。
内容的提问来源于stack exchange,提问作者s528060
相关产品推荐
相关产品推荐

