WAF案例:为什么curl可以wget不行?

2020-12-10 11:53:42 浏览数 (2)

案例背景

随着https的普及,越来越多的客户重视Web访问的安全性,都纷纷接入https,但https是Web服务中的一个难点,用户经常会遇到各种各样奇怪的问题,比如为什么curl可以访问但浏览器不行,为什么有的用户可以访问但是有的不行?

问题说明

本次案例的用户,遇到的情况是域名testwww.xxx.com使用curl可以访问下载,但是wget不能访问,提示证书过期。

原因分析

首先遇到这种情况,第一时间会考虑客户的不支持SNI(Server Name Indication,用于用户告知服务器我访问的域名是什么),使用客户相同的weget版本1.14抓网络包查看客户端发送的消息是否有这个extension,确认支持SNI,排除这种可能。

抓包查看SNI抓包查看SNI

接下来排查是否是源站证书的问题,分别将域名解析到WAF VIP和源站(绑定hosts的方式)测试。

绑定到VIP绑定到VIP

绑定到源站:

绑定到源站绑定到源站

解析到VIP和解析到源站,证书过期时间都是一样的,这里基本可以确认是证书有问题,继续往下查。

还没找到问题的原因,抓网络包对比,发现交互的认证方式有2种,session ticket和session cache,看到网络包认证方式不一样,经过深入排查,这两种方式是客户的与服务器协商选择的,不存在问题。

接下来开始怀疑是否证书不受信任

使用

代码语言:javascript复制
wget -d https://testwww.xxx.cn --ca-directory=/etc/ssl/certs

访问,证书还是过期。怀疑可能是本地受信任列表中不存在这个证书,更新一下:

代码语言:javascript复制
yum install ca-certificates -y 
update-ca-trust 

再重复执行,发现正常,到这里,找到临时解决的办法了。

但是使用命令执行certs的方式,访问起来比较麻烦,还得继续往下查,来看下证书链是否有问题

代码语言:javascript复制
yum -y install gnutls-utils
gnutls-cli testwww.xxx.cn -p 443

看到使用了3个证书,其中1个证书已经过期

到这里可以确认,用户使用了多个证书,但是其中有1个证书的根证书已经过期,域名匹配到到了这个根证书。

另外,这里curl可以的原因是因为读取的CA本地信任列表与wget不一样,因此wget指定certs地址也可以额访问

解决办法:

1、更新本地信任列表,并指定wget的受信任列表文件

2、更新过期的根证书

扩展说明:

1、SNI:只有支持SNI的客户端,才能够使用WAF的https功能,常见的不支持SNI的客户端主要是低版本的IE,或者一些用户自己实现的工具,可以在https://myssl.com/进行检测。

2、session ticket需要服务器和客户端都支持,属于一个扩展字段,支持范围约60%(无可靠统计与来源),将协商的通信信息加密之后发送给客户端保存,密钥只有服务器知道,占用服务器资源很少。

3、https证书验证需要证书链上每一个证书都正常,才能验证成功。

0 人点赞