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"模式,在代码中手动验证证书:
- 在Azure Portal的Function App -> 配置 -> 常规设置,将"客户端证书模式"改为
Allow。 - 在函数代码中添加证书验证逻辑:
[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
相关产品推荐
相关产品推荐

