WAF案例:为什么curl可以wget不行?
案例背景
随着https的普及,越来越多的客户重视Web访问的安全性,都纷纷接入https,但https是Web服务中的一个难点,用户经常会遇到各种各样奇怪的问题,比如为什么curl可以访问但浏览器不行,为什么有的用户可以访问但是有的不行?
问题说明
本次案例的用户,遇到的情况是域名testwww.xxx.com使用curl可以访问下载,但是wget不能访问,提示证书过期。
原因分析
首先遇到这种情况,第一时间会考虑客户的不支持SNI(Server Name Indication,用于用户告知服务器我访问的域名是什么),使用客户相同的weget版本1.14抓网络包查看客户端发送的消息是否有这个extension,确认支持SNI,排除这种可能。
接下来排查是否是源站证书的问题,分别将域名解析到WAF VIP和源站(绑定hosts的方式)测试。
绑定到源站:
解析到VIP和解析到源站,证书过期时间都是一样的,这里基本可以确认是证书有问题,继续往下查。
还没找到问题的原因,抓网络包对比,发现交互的认证方式有2种,session ticket和session cache,看到网络包认证方式不一样,经过深入排查,这两种方式是客户的与服务器协商选择的,不存在问题。
接下来开始怀疑是否证书不受信任
使用
wget -d https://testwww.xxx.cn --ca-directory=/etc/ssl/certs
访问,证书还是过期。怀疑可能是本地受信任列表中不存在这个证书,更新一下:
yum install ca-certificates -y
update-ca-trust
再重复执行,发现正常,到这里,找到临时解决的办法了。
但是使用命令执行certs的方式,访问起来比较麻烦,还得继续往下查,来看下证书链是否有问题
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证书验证需要证书链上每一个证书都正常,才能验证成功。
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- RecyclerView+PagerSnapHelper实现抖音首页翻页的Viewpager效果
- android中使用react-native设置应用启动页过程详解
- 面试官问我单例模式真的安全吗?我懵逼了
- 详解Android使用CoordinatorLayout+AppBarLayout实现拉伸顶部图片功能
- Android自定义控制条效果
- Android使用MediaPlayer和TextureView实现视频无缝切换
- Android实现静默拍照功能
- Android实现动态体温计
- Android实现倾斜角标样式
- 浅谈Flutter 中渐变的高级用法(3种)
- Android实现左上角(其他边角)倾斜的标签(环绕效果)效果
- Android开发中Button组件的使用
- Android开发之基于RecycleView实现的头部悬浮控件
- Android如何通过命令行操作Sqlite3数据库的方法
- Android实现沉浸式状态栏功能