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

Azure APIM与Azure Function双向认证:能否替换API密钥为证书验证?

当然可以!把APIM到Azure Function的认证方式从API密钥换成客户端证书验证完全可行,下面是一步步的实现方案:

1. 配置Azure Function App接受客户端证书

首先得让你的Function App开启客户端证书验证的能力:

  • 登录Azure门户,找到目标Function App,进入配置 > 常规设置
  • 找到「客户端证书模式」选项,设置为需要(强制所有请求携带有效证书)或者可选(允许不带证书的请求,但后续可以在Function代码里做针对性验证)
  • 保存设置,Function App会自动重启生效
2. 在APIM中配置发送客户端证书

接下来要让APIM在转发请求到Function时携带指定的客户端证书:

  • 进入你的APIM实例,找到对应的API和具体操作
  • 打开策略编辑器,在<outbound>代码块中添加认证证书的策略:
<authentication-certificate thumbprint="你的证书指纹" />
  • 注意:这里的证书需要先上传到APIM的证书库中——在APIM左侧菜单的证书选项里,上传你用来做认证的客户端证书(支持PFX格式,若有密码需一并提供)
3. 在Function中添加证书验证逻辑(可选但推荐)

如果你的Function App设置的是「可选」模式,或者需要更精细的证书校验(比如验证指纹、颁发者、有效期等),可以在Function代码里添加验证逻辑:

C# 示例

public static async Task<IActionResult> Run(
    [HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)] HttpRequest req,
    ILogger log)
{
    var clientCert = req.HttpContext.Connection.ClientCertificate;
    
    // 检查证书是否存在且有效
    if (clientCert == null || !clientCert.Verify())
    {
        return new UnauthorizedResult();
    }
    
    // 验证证书指纹是否符合预期
    if (!clientCert.Thumbprint.Equals("预期的证书指纹", StringComparison.OrdinalIgnoreCase))
    {
        return new UnauthorizedResult();
    }
    
    // 后续业务逻辑
    return new OkObjectResult("认证通过");
}

Python 示例

import azure.functions as func

def main(req: func.HttpRequest) -> func.HttpResponse:
    client_cert = req.context.client_certificate
    
    # 检查证书是否存在
    if not client_cert:
        return func.HttpResponse("未授权", status_code=401)
    
    # 验证证书指纹
    if not client_cert.thumbprint or client_cert.thumbprint.upper() != "预期的证书指纹".upper():
        return func.HttpResponse("证书无效", status_code=401)
    
    # 后续业务逻辑
    return func.HttpResponse("认证通过")
4. 移除原API密钥传递策略(可选)

如果你不再需要API密钥认证,可以在APIM的策略中删除之前添加的API密钥传递逻辑,比如移除类似这样的代码:

<set-header name="x-functions-key" exists-action="override">
    <value>你的Function API密钥</value>
</set-header>

注意事项

  • 如果使用自签名证书,需要把根证书添加到Function App的信任存储中,否则Function可能会认为证书无效
  • 证书指纹的大小写要注意,部分环境要求大写,建议统一转换为大写后再做比对
  • 测试时可以用APIM的测试功能,或者用curl命令携带证书请求Function,确认认证流程正常

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 04:08:15