HTTPS IP直连问题小结

背景

任何一个移动APP项目都离不开网络接入功能,提升网络接入的质量几乎是所有移动项目的需求。很多项目都会引入HTTP DNS作为网络接入最基础也是最重要的优化之一。HTTP DNS的核心是后台下发某个域名对应的最优IP,基础点的可做到就近接入,即下发该域名终端就近地同运营商的IP,好一点的则根据线上用户实际测速数据下发最优的IP。而终端只需在HTTP接入时,将URL中的HOST从域名直接替换为后台下发的IP即可。
IP直连相对于域名接入的好处有:

  • 省去DNS解析这一步,减少耗时
  • 就近接入甚至就快接入,减少耗时
  • 避免DNS劫持
  • 当终端有多个IP接入选择时,有一定容灾能力

接入时后端常常都会存在转发层做一些诸如负载均衡的工作,由转发层将请求分发到真实服务器。HTTP接入的转发层一般是根据请求头中的HOST字段来转发到各个RS。所以对于HTTP接入,使用IP直连时需要设置一个HOST请求头,值为请求域名,在绝大部分情况下就可以获得上面提到的IP直连的好处。
但是对于HTTPS接入,情况会变得稍微复杂一些。本文主要是对Android平台使用HttpURLConnection(SDK开发由于包大小的限制,HTTP接入基本只能用这个了…)进行HTTPS IP直连时,遇到的一些问题及其解决方法的小结。


HTTPS IP直连问题与解决

首先先用一张图回顾下HTTPS接入的大致流程
这里写图片描述
本文描述的问题都发生在服务端公钥证书的校验这一步。

问题1. 证书HOST校验问题

终端在SSL握手过程会校验当前请求URL的HOST是否在服务端证书的可选域名列表里。举个例子,假设原本想要请求的URL为https://v.html5.qq.com,而使用IP直连后实际请求的URL为:https://183.61.38.230:443。此时服务端返回的证书可选域名列表如下
这里写图片描述
由于请求的HOST被替换成了IP,导致底层在进行证书的HOST校验时失败,最终请求失败。

这个问题的解决还比较简单。系统提供了接口,允许终端设置证书HOST校验实现。所以直接将底层默认实现中取终端传入URL的HOST(此处即IP)替换回,IP直连替换前的域名即可。
这里写图片描述

问题2. SNI问题

解决了问题1后,请求可以成功是“纯属意外”。事实上,183.61.38.230:443这个转发层部署了多个域名的证书,除了问题1中的v.html5.qq.com,还有https://ag.qq.com等域名。此时如果用https://ag.qq.com进行IP直连,请求会失败,因为当终端使用IP直连时,服务端SSL握手阶段获取到的域名为调度后的IP,服务端无法找到匹配的证书,只能返回默认的证书或者不返回。喵喵问题1中的图,默认返回的证书的拓展域名列表是不包含ag.qq.com的,所以证书的HOST校验还是会失败,导致请求失败。

这个问题的解决也并不复杂:

  1. 系统提供接口,允许终端传入自定义SSLSocketFactory。SSLSocketFactory是创建SSLSocket的工厂,SSLSocket是Socket拓展,有SSL握手功能。
  2. 系统提供解决SNI问题的实现类SSLCertificateSocketFactory

所以设置一个自定义SSLSocketFactory并代理SSLCertificateSocketFactory即可解决SNI问题:
这里写图片描述

SSLSocketFactory接口有很多个创建Socket的方法,但是底层回调的就是Socket createSocket(Socket s, String host, int port, boolean autoClose),后文也会提到。

进行了这一步操作后,对

  • 8
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
目录: 第1章 Visual C#2008与窗体界面 案例1 飘动动画窗体 案例2 透明动画窗体 案例3 利用API函数实现动画窗体 案例4 闪烁动画窗体 案例5 滚动字幕动画窗体 案例6 超女卡通窗体 案例7 总在最前的登录窗体 案例8 在屏幕中央的圓形窗体 案例9 半透明的T形窗体 案例10 多文档MDI窗体 案例11 渐变色窗体 案例12 笑脸窗体 案例13 八边形图形窗体 本章小结 第2章 Visual C#2008与图形图像 案例1 动态绘制直线和曲线 案例2 动态绘制验证码 案例3 椭圓及椭圆弧的绘制 案例4 移动鼠标复制坐标区域图像 案例5 动态获取当前程序的图标 案例6 动态获取系统图标 案例7 动态打开、显示和缩放图像 案例8 在图像上动态加载文字 案例9 水平和垂直遮罩图像动画效果 案例10 图像拉伸动画效果 案例11 百叶窗图像动画效果 案例12 翻转和扩展图像动画效果 案例13 图像的纹理和浮雕效果 案例14 图像的马赛克效果 本章小结 第3章 Visual C#2008与多媒体 案例1 抛物线动画效果 案例2 图像滚动动画效果 案例3 飞舞的雪花 案例4 电子时钟 案例5 Flash动画播放器 案例6 AvI动画播放器 案例7 GⅣ动画播放器 案例8 MP3音乐播放器 案例9 肥皂泡泡屏幕保护程序 案例1O 图像随机显示屏幕保护程序 案例11 滚动字幕屏幕保护程序 案例12 带有背景音乐的随机字幕屏幕保护程序 案例13 托盘动画图标程序 本章小结 第4章 Visual C#2006与数据库 案例1 利用DataGridView控件显示数据库信息 案例2 数据库数据记录单 案例3 利用下拉列表框动态查询数据库信息 案例4 利用ListView控件导航数据库信息 案例5 带有数据库的会员登录系统 案例6 动态添加数据库数据信息 案例7 动态修改数据库数据信息 案例8 动态删除数据库数据信息 案例9 带有图像信息的数据库数据记录单 案例10 分页显示数据库中的记录数据信息 案例11 连接Excel 2008表格 案例12 连接SQL Server数据库 本章小结 第5章 Visual C#2008的SQL查询与图表技朮 案例1 多表连接条件查询 案例2 分组条件查询 案例3 排序查询 案例4 嵌套查询 案例5 视图在Select查询语句中的应用 案例6 存储过程在Select查询语句中的应用 案例7 动态获取数据库中所有视图和存储过程 案例8 柱状图表分析图 案例9 柱状图表的升序和降序 案例10 折线图表分析图 案例11 多折线图表分析图 案例12 饼形图表分析图 本章小结 第6章 Visual C#2008的打印与水晶报表技朮 案例1 利用Windows组件打印数据库中的数据 案例2 利用Windows组件打印数据库数据柱状图表 案例3 利用Windows组件打印输出图像 案例4 调用Word软件打印数据库中的数据 案例5 调用Excel软件打印数据库中的数据 案例6 利用水晶报表打印数据库中的数据 案例7 利用水晶报表分组统计数据库中的数据 案例8 利用水晶报表筛选数据库中的数据 案例9 图表在水晶报表中的应用 本章小结 第7章 Visual C#2008与Windows系统设置 案例1 任务栏的显示与隐藏 案例2 开始按钮的显示与隐藏 案例3 动态设置系统输入法 案例4 动态设置桌面颜色 案例5 动态设置鼠标的属性 案例6 动态获取鼠标位置 案例7 声卡的检测及声音、音频设备属性的设置 案例8 只能运行一次的托盘程序 案例9 动态设置程序是否为开机运行 案例10 动态设置注册表是否可运行 案例11 禁止修改IE浏览器的主页 案例12 动态锁定计算机 案例13 计算机的注销、关闭和重新启动 案例14 动态获取计算机系统基本信息 本章小结 第8章 Visual C#2008与文件 案例1 动态创建文件并输入文件内容 案例2 动态打开和保存文件 案例3 动态删除文件及清空回收站 案例4 动态创建和删除文件夹及显示其是否存在 案例5 动态获取文件夹中的文件 案例6 动态搜索文件或文件夹 案例7 动态显示磁盘容量图表 案例8 动态移动文件 案例9 动态复制文件 案例10 动态调用可执行EXE文件 案例11 动态查看和修改文件属性 案例12 动态比较文件 本章小结 第9章 Visual C#2008算法及控件的应用 案例1 利用冒泡算法实现从小到大排序 案例2 利用希尔算法实现从大到小排序 案例3 判断主机Ⅳ合法性算法 案例4 欧几里德最大公因子算法 案例5 字符串的加密算法 案例6 随机生成新身份证算法 案例7 利用ListBox控件实现数据源字段的选择 案例8 利用ListView控件实现图标的管理 案例9 利用TreeView控件浏览图像 案例10 利用ProgressBar控件实现进度控制 案例11 利用Timer控件显示当前时间 章小结 第10章 Visual C#2008与网络开发 案 例1 动态获取本机MAC地址 案例2 动态获取本机IP地址 案例3 动态网络Ping操作 案例4 定时访问互联网 案例5 定制网络浏览器程序 案例6 动态发送电子邮件 案例7 动态读取XML件 本章小结 第11章 Visual C#2008与Web应用程序 案例1 利用AdRotator控件随机显示广告图像 案例2 利用Calendar控件动态查询系统日期 案例3 会员登录系统 案例4 利用Application对象实现网站计数器 案例5 利用Session对象实现留言板 本章小结
第1章 Visual C#2008与窗体界面 案例1 飘动动画窗体 案例2 透明动画窗体 案例3 利用API函数实现动画窗体 案例4 闪烁动画窗体 案例5 滚动字幕动画窗体 案例6 超女卡通窗体 案例7 总在最前的登录窗体 案例8 在屏幕中央的圓形窗体 案例9 半透明的T形窗体 案例10 多文档MDI窗体 案例11 渐变色窗体 案例12 笑脸窗体 案例13 八边形图形窗体 本章小结 第2章 Visual C# 2008与图形图像 案例1 动态绘制直线和曲线 案例2 动态绘制验证码 案例3 椭圓及椭圆弧的绘制 案例4 移动鼠标复制坐标区域图像 案例5 动态获取当前程序的图标 案例6 动态获取系统图标 案例7 动态打开、显示和缩放图像 案例8 在图像上动态加载文字 案例9 水平和垂直遮罩图像动画效果 案例10 图像拉伸动画效果 案例11 百叶窗图像动画效果 案例12 翻转和扩展图像动画效果 案例13 图像的纹理和浮雕效果 案例14 图像的马赛克效果 本章小结 第3章 Visual C#2008与多媒体 案例1 抛物线动画效果 案例2 图像滚动动画效果 案例3 飞舞的雪花 案例4 电子时钟 案例5 Flash动画播放器 案例6 AvI动画播放器 案例7 GⅣ动画播放器 案例8 MP3音乐播放器 案例9 肥皂泡泡屏幕保护程序 案例1O 图像随机显示屏幕保护程序 案例11 滚动字幕屏幕保护程序 案例12 带有背景音乐的随机字幕屏幕保护程序 案例13 托盘动画图标程序 本章小结 第4章 Visual C#2006与数据库 案例1 利用DataGridView控件显示数据库信息 案例2 数据库数据记录单 案例3 利用下拉列表框动态查询数据库信息 案例4 利用ListView控件导航数据库信息 案例5 带有数据库的会员登录系统 案例6 动态添加数据库数据信息 案例7 动态修改数据库数据信息 案例8 动态删除数据库数据信息 案例9 带有图像信息的数据库数据记录单 案例10 分页显示数据库中的记录数据信息 案例11 连接Excel 2008表格 案例12 连接SQL Server数据库 本章小结 第5章 Visual C#2008的SQL查询与图表技朮 案例1 多表连接条件查询 案例2 分组条件查询 案例3 排序查询 案例4 嵌套查询 案例5 视图在Select查询语句中的应用 案例6 存储过程在Select查询语句中的应用 案例7 动态获取数据库中所有视图和存储过程 案例8 柱状图表分析图 案例9 柱状图表的升序和降序 案例10 折线图表分析图 案例11 多折线图表分析图 案例12 饼形图表分析图 本章小结 第6章 Visualc#2008的打印与水晶报表技术 案例1 利用Windows组件打印数据库中的数据 案例2 利用Windows组件打印数据库数据柱状图表 案例3 利用Windows组件打印输出图像 案例4 调用Word软件打印数据库中的数据 案例5 调用Excel软件打印数据库中的数据 案例6 利用水晶报表打印数据库中的数据 案例7 利用水晶报表分组统计数据库中的数据 案例8 利用水晶报表筛选数据库中的数据 案例9 图表在水晶报表中的应用 本章小结 第7章 VisualC#2008与Windows系统设置 案例1 任务栏的显示与隐藏 案例2 开始按钮的显示与隐藏 案例3 动态设置系统输入法 案例4 动态设置桌面颜色 案例5 动态设置鼠标的属性 案例6 动态获取鼠标位置 案例7 声卡的检测及声音,音频设备属性的设置 案例8 只能运行一次的托盘程序 案例9 动态设置程序是否为开机运行 案例10 动态设置注册表是否可运行 案例11 禁止修改IE浏览器的主页 案例12 动态锁定计算机 案例13 计算机的注销、关闭和重新启动 案例14 动态获取计算机系统基本信息 本章小结 第8章 VisualC#2008与文件 案例1 动态创建文件并输入文件内容 案例2 动态打开和保存文件 案例3 动态删除文件及清空回收站 案例4 动态创建和删除文件夹及显示其是否存在 案例5 动态获取文件夹中的文件 案例6 动态搜索文件或文件夹 案例7 动态显示磁盘容量图表 案例8 动态移动文件 案例9 动态复制文件 案例1O 动态调用可执行EXE文件 案例11 动态查看和修改文件属性 案例12 动态比较文件 本章小结 第9章 VisualC#2008算法及控件的应用 案例1 利用冒泡算法实现从小到大排序 案例2 利用希尔算法实现从大到小排序 案例3 判断主机IP合法性算法 案例4 欧几里德最大公因子算法 案例5 字符串的加密算法 案例6 随机生成新身份证算法 案例7 利用ListBox控件实现数据源字段的选择 案例8 利用LislNiew控件实现图标的管理 案

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值