前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >WAF案例:为什么curl可以wget不行?

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

原创
作者头像
缪应厅
修改2020-12-10 11:53:42
2.4K0
修改2020-12-10 11:53:42
举报

案例背景

随着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证书验证需要证书链上每一个证书都正常,才能验证成功。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 案例背景
  • 问题说明
  • 原因分析
  • 解决办法:
  • 扩展说明:
相关产品与服务
Web 应用防火墙
腾讯云 Web 应用防火墙(Web Application Firewall,WAF)帮助腾讯云内及云外用户应对 Web 攻击、入侵、漏洞利用、挂马、篡改、后门、爬虫等网站及 Web 业务安全防护问题。企业通过部署腾讯云 WAF 服务,将 Web 攻击威胁压力转移到腾讯云 WAF 防护集群节点,分钟级获取腾讯 Web 业务防护能力,为网站及 Web 业务安全运营保驾护航。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档