证书过期问题之IPV6协议

琉璃2年前技术文章1343

1、首先了解情况:客户的SSL/TLS证书要过期了,所以进行了证书替换工作,但是替换之后,有一部分客户端还是提示证书已过期,如图所示:

image.png


2、看这个报错是非常的清晰的,就是证书过期的问题,但是为什么同事没找到过期证书配置在哪里?是不是存在WAF或者CDN之类的中间层?


我们通过DNS可以看到确实是解析到阿里云对应是SLB上面,跟小伙伴的说法也是对得上的。我们已经详细的排查了SLB以及对应的NGINX-ingress后端服务,发现证书确实已经替换为新证书了。

3、这个时候阿里云的售后工程师反馈说:可能是ingress的一个bug,因为我们替换证书的时候,不是新建一个新的secret,而是在老的secret上面进行修改,有可能触发了NGINX的bug,导致有部分站点的证书并没有被替换掉

image.png

4、我们新建了一个secret,并全部执行了替换操作,但是结果移动端还是一样的报错信息。这就说明不是这个问题

image.png

5、客户怀疑我们之前升级k8s的时候,由于阿里云ACK的限制,我们把SLB由7层监听改为4层监听,证书也由SLB层下放到了ingress层,是不是ingress层存在某种限制?我们测试了7层监听,发现确实没有证书报错了。但这只是简单的测试,我们也不能确定,并且现在系统只是部分用户不能正常使用,我们无法无损的情况下把4层监听切换到7层监听


6、我们通过浏览器控制台上面看到: 所有页面里面存在部分是使用http协议,是不是这里存在https/http协议混用的问题?

image.png

 

7、把情况反馈给客户之后,客户进行了排查,最终反馈是:PC端的页面就是这样的,移动端不存在此问题。到此问题没有太多的思路,由于大部分用户还是正常访问的,我们跟客户商定在业务低谷尝试SLB 4层监听切换为7层监听。

8、在不影响业务的情况下,我们还是想再进行一次确认操作。我们通过kubectl krew ns 和 kubectl krew mtail 插件,对NGINX ingress 所有pod进行log跟踪,结果如图所示:


image.png



我的公网ip是 36.28.223.82,通过vim进行搜索,结果非常意外:我们通过日志确定请求没有落到NGINX ingress上面。由此我们得出两个可能: 1、请求没有到nginx-ingress;2、TLS或者TCP握手失败。

9、通过上面的日志,我们得出两个可能。但是我们还要再次确认,到底是怎么回事。我们通过tcpdump进行抓包分析,结果如图所示

image.png 

我们通过wireshark分析了我们抓取到的数据包,跟我们在第8步跟踪日志得出的结论是相对应的。不过这里更近一步,连TCP的连接都没有建立

10、客户跟我们反馈过:他们前段时间开通了对ipv6协议栈的支持,并且我们步骤1通过nslookup也查询到了相关的解析,那么是不是用户通过ipv6协议进行的访问,我们没有配置ipv6相关的证书。之前我一直无法复现问题,客户告知我,通过移动端4G/5G 可以稳定触发。我通过4G确实触发了此问题,我建议客户关闭ipv6的DNS解析,我们再进行尝试。结果如图:

 image.png


我们停止了ipv6的DNS解析,但是访问还是异常。这时候确实不确定问题的根源,但是肯定不是 SLB 7层监听跟4层监听的问题。我们在手机上面抓包又非常的麻烦。

11、最终客户反馈:确实是ipv6证书的问题,他们的ipv6是通过电信做的。他们把证书交给电信之后,访问就恢复正常了。我们之所以暂停ipv6解析之后,还是存在问题,估计是 LDNS缓存导致的。我们通过电信云官网了解

image.png

确实是支持https加密传输,说明问题确实是在ipv6这里。

12、我们通过抓包可以看到电信适配ipv6到底是怎么做到的,如图所示:

 

 image.png

 

其中240e:390:e78:ce0:cbb9:49e:fa14:faa7 这个ipv6的地址是我家的ipv6地址,101.226.7.210这个Ipv4的地址是上海电信的IP地址,由此可见电信实现ipv6支持是使用反向代理的方式来做的。这说明我们确实需要在电信云上面配置SSL证书。

总结:经历了这么多波折,最终才定位到是ipv6的问题,主要原因是我自己无法复现问题。在国家大力推广ipv6的大环境下,ipv6可能会越来越普及。大家需要尽快熟悉ipv6,我自己是连夜调整了自己的网络适配了ipv6。



引用1: https://en.wikipedia.org/wiki/IPv6

引用2: https://www.ctyun.cn/document/10018847/10018856


相关文章

K8S中 CNI 插件的解读

K8S中 CNI 插件的解读

一.CNI是什么首先我们介绍一下什么是 CNI,它的全称是 Container Network Interface,即容器网络的 API 接口。它是 K8s 中标准的一个调用网络实现的接口。Kubel...

Java-API-MapReduce的操作WordCount篇

Java-API-MapReduce的操作WordCount篇

首先就是pom文件<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/...

oracle跟踪会话级别的10046事件

1.开启10046跟踪事件alter session set events '10046 trace name context forever, level 12';2.执行要跟踪的sql语句sele...

oracle手工完全恢复

一)基本概念1)完全恢复的步骤1)restore: OS拷贝命令还原所有或部分datafile2)recover:SQL*PLUS利用归档日志和当前的redo日志做恢复2)完全恢复可以基于三个级别re...

MS SQL Server partition by 函数实战二 编排考场人员

需求假设有若干已分配准考证号的考生,准考证号示例(01010001)共计8位,前4位为分类号,后4位为分类下的总排序号。现提供考场分配信息EXCEL文件(包括考场编号 、考场名称、考场容纳人数等),希...

gitlab的备份和还原

由于gitlab中存放的都是开发人员的工作成果,所以为了保证数据安全,我们会定期对数据进行备份,对gitlab进行备份将会创建一个包含所有库和附件的归档文件。对备份的恢复只能恢复到与备份时的gitla...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。