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

在Azure Function中用证书发HTTPS请求遇UntrustedRoot信任问题

解决方案:Azure Function PowerShell 调用HTTPS API 解决UntrustedRoot 证书问题

一、替代方案:通过Azure Key Vault 托管信任链证书并验证

Azure Function无服务器环境无法直接使用本地证书存储,但可通过Key Vault托管根证书与中间证书,在运行时加载完整证书链完成验证:

  1. 将根证书、中间证书导入Azure Key Vault(推荐以Certificate类型存储,便于生命周期管理)
  2. 为Function App的系统分配身份配置Key Vault的Certificate User权限,确保能读取证书
  3. 修改PowerShell代码,加载完整证书链并构建安全验证逻辑:
# 从Key Vault获取客户端证书、根证书及中间证书
$clientCert = Get-AzKeyVaultCertificate -VaultName $keyVaultName -Name $clientCertName
$rootCert = Get-AzKeyVaultCertificate -VaultName $keyVaultName -Name $rootCertName
$intermediateCert = Get-AzKeyVaultCertificate -VaultName $keyVaultName -Name $intermediateCertName

# 构建自定义证书验证回调,仅信任指定根证书与中间证书
Add-Type @"
using System.Net;
using System.Security.Cryptography.X509Certificates;
public class CustomCertPolicy : ICertificatePolicy {
    public bool CheckValidationResult(
        ServicePoint srvPoint, X509Certificate cert,
        WebRequest request, int certProblem) {
        X509Chain chain = new X509Chain();
        chain.ChainPolicy.ExtraStore.Add(new X509Certificate2($([byte[]]$rootCert.Certificate.RawData)));
        chain.ChainPolicy.ExtraStore.Add(new X509Certificate2($([byte[]]$intermediateCert.Certificate.RawData)));
        chain.ChainPolicy.VerificationFlags = X509VerificationFlags.NoFlag;
        // 仅当证书链验证通过时返回true
        return chain.Build(new X509Certificate2(cert));
    }
}
"@

# 保存原始验证策略,请求完成后恢复
$originalPolicy = [System.Net.ServicePointManager]::CertificatePolicy
try {
    [System.Net.ServicePointManager]::CertificatePolicy = New-Object CustomCertPolicy
    # 发起带客户端证书的请求
    $response = Invoke-RestMethod -Method 'GET' -URI $URI -Certificate $clientCert.Certificate
}
finally {
    # 恢复默认验证策略,避免影响后续请求
    [System.Net.ServicePointManager]::CertificatePolicy = $originalPolicy
}

二、生产环境安全的自定义SSL验证回调规范

若使用自定义回调,需严格规避安全风险,遵循以下规则:

  • 拒绝全信任逻辑:绝不使用跳过所有验证的代码,仅验证目标API证书链是否匹配你托管的根/中间证书
  • 验证核心属性:在回调中额外检查证书的Subject、Validity Period、Thumbprint等关键字段,防止中间人攻击
  • 动态加载证书:始终从Key Vault等安全存储读取证书,禁止硬编码证书数据
  • 及时恢复策略:必须在finally块中恢复原始证书验证规则,避免污染后续请求的验证逻辑

三、其他可选方案

  • 确认公共CA信任:若目标API使用公共CA签发的证书,检查Azure Function运行环境是否已信任该CA(多数主流公共CA已被Azure托管环境默认信任)
  • 切换至隔离计划(Isolated SKU):隔离计划的Function App运行在专用App Service Environment(ASE)中,可通过虚拟机扩展将根证书上传至本地证书存储,实现传统证书信任机制,但成本较高

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 20:33:16