博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
关于HostnameVerifier接口的解读
阅读量:5302 次
发布时间:2019-06-14

本文共 1317 字,大约阅读时间需要 4 分钟。

在项目中我们需要调用https接口请求。我们使用httpClient,构建HttpClient对象时涉及到使用HostnameVerifier接口实例。

HostnameVerifier接口定义如下:

1 public abstract interface HostnameVerifier2 {3   public abstract boolean verify(String paramString, SSLSession paramSSLSession);4 }

仅一个方法,参数paramString为请求地址host;参数paramSSLSession是当前请求的SSLSession,可以获取到证书列表,默认实现类DefaultHostnameVerifier的实现如下:

1     @Override 2     public boolean verify(final String host, final SSLSession session) { 3         try { 4             final Certificate[] certs = session.getPeerCertificates(); 5             final X509Certificate x509 = (X509Certificate) certs[0]; 6             verify(host, x509); 7             return true; 8         } catch (final SSLException ex) { 9             if (log.isDebugEnabled()) {10                 log.debug(ex.getMessage(), ex);11             }12             return false;13         }14     }

接口是用于主机名验证,准确说是验证服务器ca证书中的host是否和请求地址host一致,为什么要进行主机名验证呢?其实目的是加强一层安全防护,防止恶意程序利用中间人攻击。

什么是中间人攻击?

假设有一个攻击者处于“浏览器”和“网站服务器”的通讯线路之间(比如公共WIFI),它的攻击过程如下:

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

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

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

参考资料:

转载于:https://www.cnblogs.com/yufecheng/p/10968045.html

你可能感兴趣的文章
CF1157D N Problems During K Days
查看>>
BZOJ4419: [Shoi2013]发微博
查看>>
【POJ】3090 Visible Lattice Points(欧拉函数)
查看>>
使用Ruby DBI模块
查看>>
[讨论]“传递式”的攻击思想<转LN>
查看>>
ABP理论学习之N层架构
查看>>
Python 常用代码片段
查看>>
【Python实战】使用Python连接Teradata数据库???未完成
查看>>
权限系统设计概述
查看>>
sharepoint list 文档上传和删除
查看>>
Standard deviation
查看>>
sql 查出一张表中重复的所有记录数据
查看>>
linux密码破解
查看>>
【COGS-2638】数列操作ψ 线段树
查看>>
委托和接口的逆变 和协变
查看>>
(一)Vmware搭建DPDK测试平台
查看>>
JAVA笔记16-生产者消费者问题
查看>>
回调函数
查看>>
ACM题目————滑雪
查看>>
谈谈国外网络干扰那些事
查看>>