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

Azure Function遇tls: no renegotiation错误,无法接收支付服务Webhook回调

解决Azure Function双向TLS下Webhook回调的"tls: no renegotiation"错误

可能的原因与解决方案

1. 调整Azure Function的TLS版本与加密套件

  • 确保Azure Function启用了TLS 1.2或更高版本:进入Azure Portal的Function App -> 配置 -> 常规设置,找到"TLS版本"选项,设置为1.2或1.3。旧版TLS(如1.0/1.1)可能不兼容支付服务的握手协商逻辑。
  • 检查加密套件兼容性:Azure Function默认加密套件可能与支付服务不匹配。若支付服务依赖特定套件,可通过Azure CLI或ARM模板自定义Function的加密套件配置(注意:消耗计划可能限制部分自定义操作,隔离计划灵活性更高)。

2. 处理TLS重协商问题

错误提示"tls: no renegotiation"说明支付服务尝试发起TLS重协商,但Azure Function底层环境(如Kestrel/IIS)默认禁用了该操作。可尝试两种方向:

  • 联系支付服务关闭重协商:确认支付服务是否可以调整逻辑,改为在初始握手阶段就传递客户端证书,避免后续重协商。
  • 调整Azure Function重协商配置:在Function App的应用设置中添加WEBSITE_DISABLE_TLS_RENEGOTIATION并设为true,强制关闭重协商(仅适用于支付服务无需重协商的场景)。若支付服务必须使用重协商,需将Function切换至隔离计划,并通过host.json自定义Kestrel配置开启重协商。

3. 修改客户端证书验证模式

当前设置的"Require"模式会强制在初始握手阶段要求客户端证书,部分服务可能先建立连接再通过重协商传递证书,从而触发错误。可改为"Allow"模式,在代码中手动验证证书:

  1. 在Azure Portal的Function App -> 配置 -> 常规设置,将"客户端证书模式"改为Allow。
  2. 在函数代码中添加证书验证逻辑:
[FunctionName("Callback")]
public async Task<IActionResult> Callback([HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", "put")] HttpRequest req, ILogger log)
{   
    // 验证客户端证书
    var clientCert = req.HttpContext.Connection.ClientCertificate;
    if (clientCert == null || !clientCert.Verify())
    {
        log.LogError("无效或缺失客户端证书");
        return new UnauthorizedResult();
    }
    // 可进一步验证证书的颁发者、主题等信息
    if (!clientCert.Issuer.Equals("支付服务证书的颁发者信息", StringComparison.OrdinalIgnoreCase))
    {
        log.LogError("证书颁发者未被信任");
        return new UnauthorizedResult();
    }

    string requestBody = await new StreamReader(req.Body).ReadToEndAsync();

    try
    {
        var objeto = JsonConvert.DeserializeObject<object>(requestBody);

        ServiceBusClient client = new(Environment.GetEnvironmentVariable("ServiceBusConnectionString"));
        ServiceBusSender Sender = client.CreateSender(Environment.GetEnvironmentVariable("QueueName"));

        ServiceBusMessage message = new(objeto.ToString());
        await Sender.SendMessageAsync(message);
    }
    catch (Exception e)
    {
        log.LogError(e, e.Message);
    }

    return new OkResult();
}

4. 检查前端网关配置(若有)

如果Function前端部署了Azure Front Door、APIM等网关服务:

  • 确保网关的双向TLS配置正确,已将客户端证书透传至Function,而非在网关层终止TLS后重新发起请求。
  • 检查网关是否禁用了TLS重协商,若有需调整对应配置以匹配支付服务的要求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 02:50:26