关于HostnameVerifier接口的解读
在项目中我们需要调用https接口请求。我们使用httpClient,构建HttpClient对象时涉及到使用HostnameVerifier接口实例。
HostnameVerifier接口定义如下:
public abstract interface HostnameVerifier
{
public abstract boolean verify(String paramString, SSLSession paramSSLSession);
}
仅一个方法,参数paramString为请求地址host;参数paramSSLSession是当前请求的SSLSession,可以获取到证书列表,默认实现类DefaultHostnameVerifier的实现如下:
@Override
public boolean verify(final String host, final SSLSession session) {
try {
final Certificate[] certs = session.getPeerCertificates();
final X509Certificate x509 = (X509Certificate) certs[0];
verify(host, x509);
return true;
} catch (final SSLException ex) {
if (log.isDebugEnabled()) {
log.debug(ex.getMessage(), ex);
}
return false;
}
}
接口是用于主机名验证,准确说是验证服务器ca证书中的host是否和请求地址host一致,为什么要进行主机名验证呢?其实目的是加强一层安全防护,防止恶意程序利用中间人攻击。
什么是中间人攻击?
假设有一个攻击者处于“浏览器”和“网站服务器”的通讯线路之间(比如公共WIFI),它的攻击过程如下:
- 服务器向客户端发送公钥。
- 攻击者截获公钥,保留在自己手上。
然后攻击者自己生成一个【伪造的】公钥,发给客户端。 - 客户端收到伪造的公钥后,生成加密hash值发给服务器。
- 攻击者获得加密hash值,用自己的私钥解密获得真秘钥。
同时生成假的加密hash值,发给服务器。 - 服务器用私钥解密获得假秘钥。
FIddler就是通过这种方式截获HTTPS信息。
上面问题的根源是因为“缺乏身份认证机制”,需要验证【伪造的】公钥是否是网站服务器的,我们客户端httpClient可以通过验证公钥中的host,防止被中间人攻击。
参考资料:
https://blog.csdn.net/fanjint/article/details/81985004
https://www.jianshu.com/p/ad4c7ce94518
关于HostnameVerifier接口的解读的更多相关文章
- Spring源码解析 - BeanFactory接口体系解读
不知道为什么看着Spring的源码,感触最深的是Spring对概念的抽象,所以我就先学接口了. BeanFactory是Spring IOC实现的基础,这边定义了一系列的接口,我们通过这些接口的学习, ...
- Spring源码解析 - AbstractBeanFactory 实现接口与父类分析
我们先来看类图吧: 除了BeanFactory这一支的接口,AbstractBeanFactory主要实现了AliasRegistry和SingletonBeanRegistry接口. 这边主要提供了 ...
- I.MX6 AT24Cxx eeprom Linux i2c-gpio
/************************************************************************** * I.MX6 AT24Cxx eeprom L ...
- java security
安全性是Java应用程序的非功能性需求的重要组成部分,如同其它的非功能性需求一样,安全性很容易被开发人员所忽略.当然,对于Java EE的开发人员来说,安全性的话题可能没那么陌生,用户认证和授权可能是 ...
- Android 网络优化,使用 HTTPDNS 优化 DNS,从原理到 OkHttp 集成
一.前言 谈到优化,首先第一步,肯定是把一个大功能,拆分成一个个细小的环节,再单个拎出来找到可以优化的点,App 的网络优化也是如此. 在 App 访问网络的时候,DNS 解析是网络请求的第一步,默认 ...
- spring security 实践 + 源码分析
前言 本文将从示例.原理.应用3个方面介绍 spring data jpa. 以下分析基于spring boot 2.0 + spring 5.0.4版本源码 概述 Spring Security 是 ...
- 读QT5.7源码(三)Q_OBJECT 和QMetaObject
Qt meta-object系统基于三个方面: 1.QObject提供一个基类,方便派生类使用meta-object系统的功能: 2.Q_OBJECT宏,在类的声明体内激活meta-object功 ...
- 7、Qt MetaObject System详解
网上的资源比较乱,该文章整理自地址:http://www.xuebuyuan.com/735789.html Qt meta-object系统基于三个方面: 1.QObject提供一个基类,方便派生类 ...
- httpClient 连接池问题出现403.9
困扰了半个月时间终于找到连接池的问题,由于调用第三方有异常导致连接不能及时释放 所以写了一个定时扫描释放连接 监控连接池释放连接: public static class IdleConnection ...
随机推荐
- springboot-redis-crda example
springboot-redis-crda example 1. 从 https://github.com/XLuffyStory/springboot-redis-crdu 拿到源码之后,导入到ST ...
- Java类库的源码
Java类库中的类,包括System.String.Scanner.Math.Random等:这些类也是用Java编写的. Java类库中包含数千个文件,其中的很多文件都包含数千行代码:因为Java类 ...
- 设计模式-责任链模式(responsibility)
责任链模式是行为模式的一种,该模式构造一系列的分别担当不同职责的类的对象(HeaderCar.BodyCar.FooterCar)来共同完成一个任务,这些类的对象之间像链条一样紧密相连. 角色和职责: ...
- Codeforces 782B:The Meeting Place Cannot Be Changed(三分搜索)
http://codeforces.com/contest/782/problem/B 题意:有n个人,每个人有一个位置和速度,现在要让这n个人都走到同一个位置,问最少需要的时间是多少. 思路:看上去 ...
- blast2go本地化 mysql_study
mysql yum -y install mysql mysqladmin -uroot -passwd "oebiotech" mysql -uroot -poebiotech ...
- 如果通过脚本来关闭程序-linux
正常情况下在linux关闭一个程序最好是走正常的关闭流程,不要直接杀死进程,这样程序的稳定性确实会收到影响,但是如果想通过脚本来关闭程序正常情况下比较困难的,我便采取了这种暴力的方法-直接杀死进程. ...
- USACO-修理牛棚
#include<cstdio> #include<algorithm> using namespace std; int a[201],b[201]; int main() ...
- ForkJoinPool分支/合并框架工程使用的工作窃取
ForkJoinPool分支/合并框架 在必要的情况下,讲一个大任务,进行拆分(fork)成若干个小任务(拆到不可拆为止),再将一个个小的任务运算的结果进行join汇总. 工作窃取的背景 分支/合并框 ...
- 个人永久性免费-Excel催化剂功能第72波-序列规则下的数据验证有效性好帮手:快速录入窗体辅助录入
Excel作为最好用的数据录入工具,没有之一,如果能够充分利用好Excel的灵活性和规范性,将带来极大的生产力提升,前面的几波功能也有做了几大数据录入的辅助功能,今天再次给大家带来一个特定的使用场景, ...
- .NetCore下ES查询驱动 PlainElastic .Net 升级官方驱动 Elasticsearch .Net
1.背景 由于历史原因,笔者所在的公司原有的ES查询驱动采用的是 PlainElastic.Net, 经过询问原来是之前PlainElastic.Net在园子里文档较多,上手比较容易,所以最初作者选用 ...