百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术资源 > 正文

从Nginx迁移APISIX中的API网关TLS问题排查实录

off999 2025-03-01 15:06 30 浏览 0 评论

作者介绍

卞弘智,研发工程师,具有10多年SRE经验,工作经历涵盖DevOps、WAF和网关、监控和告警系统研发、日志处理系统等基础架构领域,致力于通过优秀的开源软件推动自动化和智能化基础架构平台的演进。


一、TLS问题背景


Nginx作为我们团队主要的反向代理工具,已经使用了十多年,可靠和高效的特性极大的减少了运维的工作量。但是,随着部署系统数量增加,以及分流、流控等场景的需求,nginx的配置越来越复杂,可读性越来越低。并且高可用、大流量意味着副本数成倍增加,nginx的配置变更工作量越来越大,人工操作的风险也越来越高。经过筛选,最终选定用apisix替换nginx。


APISIX是一款国产开源的顶级Apache网关项目,底层基于Nginx和Openresty,它兼具动态、实时、高性能等特点,提供了负载均衡、动态上游、灰度发布、服务熔断、身份认证、可观测性等丰富的流量管理功能。APISIX的上游、路由、插件全都是动态,修改也不用重启,而且APISIX插件也是热加载,可以随时插拔、修改。


我们从Nginx向Apisix的迁移过程中,主要遇到的问题都集中在SSL方面,以其中一个困扰我们最久的问题为例,记录一下问题的排查过程。该问题从现象来看,在我们迁移了测试环境的网关从Nginx到Apisix后,部分的内部和外部的用户向我们反馈java应用客户端在请求https链接的时候,出现握手失败,客户端的报错如下:


javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure


该问题不太好排查,仅有部分应用存在这个问题,而且应用都部署在K8S中,不方便进行调试。简单的使用CURL进行调用没办法重现问题,找java后端的同事一起进行了联合调试,即使开启debug,也并没有发现任何有用的信息。


二、TLS基本概念


在更进一步深入排查这个问题之前,我们先去了解下TLS协议,首先它在协议栈中处于HTTP之下:



这次排查问题的重点在于TLS客户端和服务端的握手流程:



简单来说握手的过程就是client和server端互say hello,确定TLS版本,加密套件等信息后,然后交换证书,秘钥等信息,最后生成了后面应用层会使用到的秘钥。这个图实际上是一个最完整的握手流程,实际生产环境中比这个流程要简单的多,比如说大多数情况下,服务端并不会去验证客户端证书,有些java 客户端的默认配置甚至都不会去验证服务端的证书。下图将可选的步骤标记了*。



三、HTTPS的请求链路


进一步动手排查问题之前,我们还需要先梳理清楚这次出问题的Https的请求链路,请求从客户端经过网关再到服务端后台的过程, 可以看做2段链路, client -> apisix(nginx), apisix(nginx) -> upstream servers。



如上图所示,我们在之前使用Nginx的时候采用nginx做的SSL/TLS Offloading, 也就是说HTTPS请求到达了Nginx这里由Nginx完成TLS握手,加解密等相关操作,Nginx发送给后台服务器是解码后的http请求。在迁移到Apisix之后,为了避免影响到后台应用端,我们采用了同样的逻辑,在apisix这里做了tls offload。出问题就是这一段client -> apisix的请求,apisix网关和客户端的握手请求失败了,那么我们排查问题的重点就放在Apisix这里,包括后文提到的基于wireshark进行抓包,都是在Apisix网关这里进行的。


四、SNI 问题初步排查


经过初步排查,我们和开发的怀疑可能和这篇文章描述的问题相似:

https://blog.csdn.net/xiao__jia__jia/article/details/123752327


是因为在客户端没有传递SNI信息导致的,开发那边同事采用了强制关闭SNI的方式配合我们调试来模拟生产环境遇到的问题。


System.setProperty("jsse.enableSNIExtension", "false");


我们在Apisix服务端抓包来看看。



果然是在Client Hello的请求中没有SNI字段,在APISIX服务端直接返回了Fatal Internal error


五、SNI基础知识


SNI(Server Name Indication)是TLS协议的扩展,允许客户端在发起SSL握手请求时, 具体说来,是客户端发出SSL请求中的ClientHello阶段, 提交请求的Host信息,使得服务器能够切换到正确的域并返回相应的证书。这样网关服务器就可以在相同的IP地址和TCP端口号上支持不同的HTTPS域名和证书了。


SNI需要客户端和服务端都进行支持,在服务端我们可以很容易的基于Openresty指令进行确认:


[root@38163 ~]# /usr/bin/openresty -V|grep SNI
nginx version: openresty/1.21.4.1
built by gcc 9.3.1 20200408 (Red Hat 9.3.1-2) (GCC) 
built with OpenSSL 1.1.1s  1 Nov 2022
TLS SNI support enabled


这里还需要注意的是,有的同学问到我们在https 请求的URL中已经有了需要请求的服务器名在请求的Header中也有设置,为什么这里还需要设置, 这里需要理解2个点:


  • TLS协议是在HTTPS层下面的是没办法获取到https层面的相关信息的。
  • 我们看看client和server建立Https连接的过程: 先建立tcp连接 -->经过TLS握手-->实现https通信-->进而发送HTTP请求 , 从请求过程来看在TLS握手阶段, server端'也没有办法获取七层HTTP报文的信息。


六、Apisix SNI缺失的问题解决方案


针对SNI缺失的问题,最简单的解决方案就是修改客户端,升级JDK版本,httpclient的版本等,但我们希望是在网关层面解决这个问题,客户端不需要修改代码。我们找到了一篇雪球写的相关文章


https://blog.csdn.net/singgel/article/details/122701839


通过配置fallback_sni的域名,在客户端没有传递SNI的情况下使用这个作为默认SNI:


fallback_sni: "my.default.domain"      # If set this, when the client doesn't send SNI during handshake, the fallback SNI will be used instead


设置之后,经测试, 在TLS1.2的情况下,客户端不设置SNI也是可以完成握手的。


这里顺便研究一下,我们的Nginx之前并没有单独设置过fallback sni, 为什么没有问题呢?因为对于Nginx,如果客户端在ssl握手阶段未携带server_name Nginx就会去找默认server,然后使用默认server的ssl证书来响应, 因为我们使用的泛域名证书,默认server的ssl证书也是可以匹配上的。


七、SSLV2 未解决的问题


SNI的问题解决之后,我们仍有部分客户端调用有问题,通过抓包发现:


客户端在进行client hello握手的时候使用的是SSLV2,通过和开发同事一起调试发现代码中是这样设置的协议


 supportedProtocols = {"SSLv2Hello", "SSLv3", "TLSv1", "TLSv1.1", "TLSv1.2"};


SSLv2 hello仅仅是用来发送hello 信息的,也就是我们截图中的这个包,我们在Apisix中协议层面配置了相应的协议


ssl_protocols: SSLv2 SSLv3 TLSv1 TLSv1.1 TLSv1.2 TLSv1.3


测试以后,结果仍然一样。


这个问题暂时没有在Apisix端找到解决方案,和开发同学联调确定的解决方案是在代码中移除过于老的协议的支持,仅保留TLSv1.1, TLS v1.2。


supportedProtocols = {"TLSv1.1", "TLSv1.2"};


小结


网关作为我们整个系统的入口,承担着越来越多的作用,其主要目的还是将一些业务应用通用功能提取出来放在一起进行统一处理,比如TLS、跨域、限流、分流等,让后端专注于业务逻辑的处理。


网关的很多问题,既涉及前端又涉及到后端,这次TLS问题的就比较曲折,TLS问题本身涉及到安全、网络协议,在后端能够提供信息有限的情况下,还需要我们自己去抓包去定位问题。


更多干货内容及开源工具下载获取方式:添加群秘dbayuqing,备注开源工具

相关推荐

免费cad制图软件(电脑版cad免费怎么下载)

迅捷cad编辑器永久免费版全面支持图纸的编辑功能,软件体积小巧功能强大,他支持几乎所有主流的图片格式,让用户不会出现无法打开图纸的困扰,也不会让用户收到领域的困扰,包括电气、机械、建筑等等领域的cad...

笔记本电脑没声音是什么原因

笔记本电脑没有声音的原因是:1.声音是否被调到最小了。2.音频是否被禁用了。3.声卡驱动是不是有问题。4.如果电脑既没有声音也没有小喇叭的图标,则表示电脑的音频设备未启用。笔记本电脑没有声音的原因是:...

melogin路由器设置登录入口(192.168.1.1直接进入)

melogincn路由器的设置步骤如下第一、路由器线路连接1、请把你的.水星双频路由器上的WAN接口,用网线连接到猫的网口。如果你家宽带没有用到猫,就把入户的宽带网线,插在路由器的WAN口。2、把你的...

如何优化电脑性能
如何优化电脑性能

可以通过以下几个步骤来提高电脑运行速度和游戏流畅度:1.清理垃圾文件和无用程序,可以使用系统自带的清理工具或第三方软件;2.关闭开机自启动项,只保留必要的程序开机启动;3.升级硬件,比如增加内存、更换硬盘等;4.优化系统设置,如关闭不必要的...

2026-01-02 06:51 off999

ie8以上版本浏览器(ie8及以上版本浏览器)

浏览器IE8版本以上的意思就是当浏览的网页不支持低版本的IE浏览器,就会提示需要版本较高的IE8以上的版本才可以打开浏览网页。IE浏览器是美国微软公司推出的一款网页浏览器,原名MicrosoftIn...

适合电脑的应用商店(电脑最好的应用商店)

1.MicrosoftToDo推荐理由:微软出品,必属精品2.Microsoft便笺推荐理由:又是一款微软官方出品的良心免费应用,相比MicrosoftToDo,Microsoft便笺更加...

家里无线网连上不能用(家里无线网不能使用)

WiFi连上但不能使用可能有多种原因。以下是一些常见问题和解决方法:1.路由器问题:首先要确认路由器是否正常工作。可以尝试重启路由器,等待几分钟后再次连接并测试。2.网络设置问题:检查设备上的网络...

低价香港服务器(香港服务器推荐性价比)

香港最好的服务器是双向cn2+移动+联通三线优化直连的,性能配置都非常高,而且速度还非常稳定。 香港服务器的使用方法:1、首先需要选择一个服务商进行购买服务器;2、购买成功后,可在本地计算机...

免费360清理大师官方版(华为自带清理软件)

挺好用的。它可以清除你手机的里面的垃圾,检测和修复软件安全性。还有一些漏洞垃圾,你可以试着对比和使用,功效和针对性比较强。您杀毒没有效果的原因可能是您的安全软件版本过旧导致的,建议您使用最新版的腾讯手...

万能解压器安卓版(万能解压器官方下载)

是一款手机文件的助手。万能解压器手机版。专注于快速解压和压缩的文件管理工具!支持ZIP,RAR,7Z,TAR,ZIPX,GZIP,JAR等压缩和解压文件格式。是超好用、超便捷的解压软件!支持在手机上将...

cad看图(cad看图王)

以下是一些CAD看图的方法和技巧:1.放大/缩小:使用滚轮或放大镜工具可以方便地放大或缩小绘图。2.平移:使用平移工具可以在不改变视角的情况下将绘图向上、向下、向左或向右移动。3.旋转:使用旋转...

联想笔记本电脑装系统教程(联想笔记本装系统教程win10)
  • 联想笔记本电脑装系统教程(联想笔记本装系统教程win10)
  • 联想笔记本电脑装系统教程(联想笔记本装系统教程win10)
  • 联想笔记本电脑装系统教程(联想笔记本装系统教程win10)
  • 联想笔记本电脑装系统教程(联想笔记本装系统教程win10)
dell笔记本售后服务电话是多少
dell笔记本售后服务电话是多少

以下为dell售后服务点A:戴尔笔记本电脑维修点地址:上海市长宁区长宁路1027号兆丰广场5层 B:戴尔笔记本电脑维修点地址:上海市徐汇区漕溪北路45号 C:戴尔笔记本电脑维修点地址:上海市徐汇区漕溪路250号银海大厦1...

2026-01-02 02:03 off999

如何找回浏览器(如何找回浏览器删除记录)

如果您的浏览器出现了问题,可以尝试以下方法来恢复浏览器:1.重新启动浏览器:关闭浏览器窗口,再重新打开浏览器,看是否能够解决问题。2.清除浏览器缓存:浏览器缓存可能会导致浏览器出现问题,可以尝试清...

应用备份还原app下载(应用备份与恢复下载)

如果您已经将手机上的数据备份到电脑,希望从电脑恢复到手机,建议您:1.电脑中安装Kies软件。注:若使用的是安卓4.3操作系统,电脑中需要安装Kies3软件。2.将手机与电脑通过数据线连接,打开Kie...

取消回复欢迎 发表评论: