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

使用Azure Key Vault证书认证Web请求时遇本地颁发者获取失败错误

问题:Azure ML笔记本中使用PFX证书访问CyberArk服务时出现“Unable to get local issuer”错误

在Azure ML笔记本中,我尝试从Azure Key Vault提取存储的.pfx证书,用于认证CyberArk Web服务以获取用户名和密码。已成功从Azure Key Vault提取证书并拆分为证书和密钥,但向CyberArk发起Web请求时返回错误“Unable to get local issuer”。

现有代码

from requests import Session
import certifi
import base64
import tempfile
import os
from azure.identity import DefaultAzureCredential,AzureCliCredential
from azure.keyvault.secrets import SecretClient
from cryptography.hazmat.primitives.serialization import pkcs12
from cryptography.hazmat.primitives import serialization

#credential = DefaultAzureCredential()
credential = AzureCliCredential()

secret_client = SecretClient(vault_url="https://xxxxxxxxx.vault.azure.net/", credential=credential)

certificate = secret_client.get_secret("xxxxxxxx")

URL = 'https://xxxxxxxxx/AIMWebService/api/Accounts?AppID=xxxxxx&Query=Safe=xxxxxx;Object=xxxxxxx'

headers = {'Content-Type': 'application/json'}

cert_bytes = base64.b64decode(certificate.value)

private_key, public_certificate, additional_certificates = serialization.pkcs12.load_key_and_certificates(
    data=cert_bytes,
    password=None
)

key = tempfile.NamedTemporaryFile(dir="xxxxxxx",delete=False)
cert = tempfile.NamedTemporaryFile(dir="xxxxxxxx",delete=False)

key.write(
    private_key.private_bytes(
        encoding=serialization.Encoding.PEM,
        format=serialization.PrivateFormat.PKCS8,
        encryption_algorithm=serialization.NoEncryption(),
    )
)
key.flush()
cert.write(
    public_certificate.public_bytes(serialization.Encoding.PEM),
)
cert.flush()
session = Session()
session.cert = (cert.name, key.name)
response = session.get(URL)
print(response)

已尝试的操作

  • 尝试指定verify=certifi.where()发起请求,但仍出现相同错误:
    response = session.get(URL,verify=certifi.where())
    
  • 能从PFX文件中提取additional_certificates列表,但不知道如何将其转换为requests可使用的验证.pem文件。

解决方案

出现“Unable to get local issuer”错误的核心原因是:requests无法找到CyberArk服务证书的根/中间颁发机构证书,导致SSL验证失败。可以通过以下步骤解决:

  1. 合并PFX中的所有证书到验证链
    将public_certificate和additional_certificates中的所有证书写入一个临时PEM文件,作为请求的验证证书链:

    # 创建临时文件存储完整证书链
    ca_chain = tempfile.NamedTemporaryFile(dir="xxxxxxx", delete=False, suffix=".pem")
    # 写入当前证书
    ca_chain.write(public_certificate.public_bytes(serialization.Encoding.PEM))
    # 写入所有附加证书
    for cert in additional_certificates:
        ca_chain.write(cert.public_bytes(serialization.Encoding.PEM))
    ca_chain.flush()
    
  2. 发起请求时指定验证证书链
    修改请求代码,将verify参数指向刚才创建的证书链文件:

    session = Session()
    session.cert = (cert.name, key.name)
    # 使用合并后的证书链进行验证
    response = session.get(URL, verify=ca_chain.name)
    print(response)
    
  3. 清理临时文件(可选)
    请求完成后,记得删除临时文件避免残留:

    os.unlink(key.name)
    os.unlink(cert.name)
    os.unlink(ca_chain.name)
    

补充说明

  • 如果PFX中不包含完整的颁发机构证书链,需要单独获取CyberArk服务对应的根CA和中间CA证书,将它们追加到上述的证书链文件中。
  • Azure ML环境中默认的CA证书存储可能不包含CyberArk的私有CA证书,因此必须显式指定完整的验证链。

内容的提问来源于stack exchange,提问作者user22504721

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 11:12:03