在项目中我们需要调用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),它的攻击过程如下:

  1. 服务器向客户端发送公钥。
  2. 攻击者截获公钥,保留在自己手上。
    然后攻击者自己生成一个【伪造的】公钥,发给客户端。
  3. 客户端收到伪造的公钥后,生成加密hash值发给服务器。
  4. 攻击者获得加密hash值,用自己的私钥解密获得真秘钥。
    同时生成假的加密hash值,发给服务器。
  5. 服务器用私钥解密获得假秘钥。

FIddler就是通过这种方式截获HTTPS信息。

上面问题的根源是因为“缺乏身份认证机制”,需要验证【伪造的】公钥是否是网站服务器的,我们客户端httpClient可以通过验证公钥中的host,防止被中间人攻击。

参考资料:

https://blog.csdn.net/fanjint/article/details/81985004

https://www.jianshu.com/p/ad4c7ce94518

关于HostnameVerifier接口的解读的更多相关文章

  1. Spring源码解析 - BeanFactory接口体系解读

    不知道为什么看着Spring的源码,感触最深的是Spring对概念的抽象,所以我就先学接口了. BeanFactory是Spring IOC实现的基础,这边定义了一系列的接口,我们通过这些接口的学习, ...

  2. Spring源码解析 - AbstractBeanFactory 实现接口与父类分析

    我们先来看类图吧: 除了BeanFactory这一支的接口,AbstractBeanFactory主要实现了AliasRegistry和SingletonBeanRegistry接口. 这边主要提供了 ...

  3. I.MX6 AT24Cxx eeprom Linux i2c-gpio

    /************************************************************************** * I.MX6 AT24Cxx eeprom L ...

  4. java security

    安全性是Java应用程序的非功能性需求的重要组成部分,如同其它的非功能性需求一样,安全性很容易被开发人员所忽略.当然,对于Java EE的开发人员来说,安全性的话题可能没那么陌生,用户认证和授权可能是 ...

  5. Android 网络优化,使用 HTTPDNS 优化 DNS,从原理到 OkHttp 集成

    一.前言 谈到优化,首先第一步,肯定是把一个大功能,拆分成一个个细小的环节,再单个拎出来找到可以优化的点,App 的网络优化也是如此. 在 App 访问网络的时候,DNS 解析是网络请求的第一步,默认 ...

  6. spring security 实践 + 源码分析

    前言 本文将从示例.原理.应用3个方面介绍 spring data jpa. 以下分析基于spring boot 2.0 + spring 5.0.4版本源码 概述 Spring Security 是 ...

  7. 读QT5.7源码(三)Q_OBJECT 和QMetaObject

    Qt meta-object系统基于三个方面:  1.QObject提供一个基类,方便派生类使用meta-object系统的功能:  2.Q_OBJECT宏,在类的声明体内激活meta-object功 ...

  8. 7、Qt MetaObject System详解

    网上的资源比较乱,该文章整理自地址:http://www.xuebuyuan.com/735789.html Qt meta-object系统基于三个方面: 1.QObject提供一个基类,方便派生类 ...

  9. httpClient 连接池问题出现403.9

    困扰了半个月时间终于找到连接池的问题,由于调用第三方有异常导致连接不能及时释放 所以写了一个定时扫描释放连接 监控连接池释放连接: public static class IdleConnection ...

随机推荐

  1. MyBatis从入门到精通(五):MyBatis 注解方式的基本用法

    最近在读刘增辉老师所著的<MyBatis从入门到精通>一书,很有收获,于是将自己学习的过程以博客形式输出,如有错误,欢迎指正,如帮助到你,不胜荣幸! 1. @Select 注解 1.1 使 ...

  2. 自己挖的坑跪着也要填完---mapper配置文件和java源文件在同一包下

    本来准备研究下mybatis源码执行流程的,就随意搭建了个项目,所有配置如下: 一切看似都是那么的正常,然而执行的时候:Exception in thread "main" org ...

  3. 如何安装xenserver

    xenserver安装 选择键盘 是否同意协议 清理磁盘 选择本地磁盘安装 选择本地镜像文件 输入管理密码 配置IP地址 配置DNS服务器地址 选择地点 配置NTP服务器地址 开始安装 安装完成

  4. php如何定义数组常量

    是这样吗?<?php define('BEST_PHPER',array('name'=>'巩文','address'=>'china')); My God,明确告诉你不可以:原因是 ...

  5. Go - Map 集合

    目录 概述 声明 Map 生成 JSON 编辑和删除 推荐阅读 概述 Map 集合是无序的 key-value 数据结构. Map 集合中的 key / value 可以是任意类型,但所有的 key ...

  6. 在CentOS7下搭建Hadoop2.9.0集群

    系统环境:CentOS 7 JDK版本:jdk-8u191-linux-x64 MYSQL版本:5.7.26 Hadoop版本:2.9.0 Hive版本:2.3.4 Host Name Ip User ...

  7. 在SpringBoot中使用RabbitMQ

    目录 RabbitMQ简介 RabbitMQ在CentOS上安装 配置文件 实践 概述 Demo 遇到的BUG 启动异常 无法自动创建队列 RabbitMQ简介 wikipedia RabbitMQ在 ...

  8. 关系型数据库MySql简介

    什么是关系型数据库? 数据库就是用来存储数据的仓库,是一种特殊的文件. 根据存储的数据不同,划分为关系型数据库和非关系型数据库. 关系型数据库就是指 建立在关系模型基础上的数据库,通俗来讲这种数据库就 ...

  9. STM32F4xx系列_独立看门狗配置

    看门狗由内部LSI驱动,LSI是一个内部RC时钟,并不是准确的32kHz,然而看门狗对时间的要求不精确,因此可以接收: 关键字寄存器IWDG_KR: 写入0xCCCCH开启独立看门狗,此时计数器开始从 ...

  10. Java编程思想:擦除的补偿(数组泛型处,我有很多细节没有研究)

    import sun.net.www.content.text.Generic; import java.lang.reflect.Array; import java.util.ArrayList; ...