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
相关产品推荐
相关产品推荐

