美文网首页
HTTPS IP直连存在的问题

HTTPS IP直连存在的问题

作者: 游侠_6fb7 | 来源:发表于2019-09-26 21:00 被阅读0次

IP直连的好处

  1. 省去DNS解析过程,减少耗时;
  2. 就近接入,减少耗时;
  3. 避免DNS劫持;
  4. 终端有多个IP接入时,有容灾能力;

回顾网络请求握手过程

HTTP TCP三次握手流程
20190917164025.jpg
握手目的:

为了保证通讯双方建立的连接是可靠的。
同时,为了保证性能,握手的次数要求尽可能少。
  那么什么才算是连接可靠?
通讯双方建立的连接可靠”就是要确保双方的发送和接收功能都正常。
  在握手前,双方的发送和接收能力尚未确认。三次最可靠;
握手过程

  • 第一次握手:
      客户端向服务端发送信息。当服务端接收到信息后,服务端可以明确接收功能是正常的。

  • 第二次握手:
      服务端向客户端发送信息作为应答。当客户端接收到信息后,客户端可以明确发送和接受功能都正常。

  • 第三次握手:
      客户端向服务端发送信息,当服务端接收到信息后,服务端可以明确发送功能是正常的。

  • 通过三次握手,就能明确双方的收发功能均正常,也就是说,保证了建立的连接是可靠的。而且,由上可见,三次是确保连接可靠的最3少次数,再就多余。

HTTPS连接过程

三次握手之后,连接请求ca证书


Https连接过程.png
  • 第一步:
    客户端向服务端发送请求,表明客户端支持的加密协议及版本SSL,TLS;
  • 第二步:
    服务端返回公钥和证书要客户端;
  • 第三步:
    客户端接收后验证证书的安全性如果通过则会生成一个随机数,用公钥加密,发送到服务端;
  • 第四步:
    服务端接收到加密后的随机数,用私钥解密得到解密后的随机数,再用这个随机数当做私钥,对需要发送的数据进行对称加密;
  • 第五步:
    客户端收到加密后的数据,使用私钥(生成的随机数)对数据进行解密,并解析数据呈现;
    SSL加密建立

问题

  1. 证书HOST校验问题;
    证书校验用的是域名校验,而不是iP地址,OkHostnameVerifier替换为域名;
  2. SNI问题;
    一个域名对应多个iP地址,证书校验时没有找到自己设置的IP地址,报错,在SSLSocketFactory的实现类中设置自己的域名;
  3. 连接复用问题;
    具体判断是否可复用问题在RealConnection#isEligible();
boolean equalsNonHost(Address that) {
    return this.dns.equals(that.dns)
        && this.proxyAuthenticator.equals(that.proxyAuthenticator)
        && this.protocols.equals(that.protocols)
        && this.connectionSpecs.equals(that.connectionSpecs)
        && this.proxySelector.equals(that.proxySelector)
        && equal(this.proxy, that.proxy)
        && equal(this.sslSocketFactory, that.sslSocketFactory)
        && equal(this.hostnameVerifier, that.hostnameVerifier)
        && equal(this.certificatePinner, that.certificatePinner)
        && this.url().port() == that.url().port();
  }

&& equal(this.sslSocketFactory, that.sslSocketFactory)
&& equal(this.hostnameVerifier, that.hostnameVerifier)
修改equals方法

  1. 兼容性问题;
  2. Session复用问题
    参考文档:
    HTTPS IP直连问题小结
    HTTPS和TCP协议三次握手设计

相关文章

网友评论

      本文标题:HTTPS IP直连存在的问题

      本文链接:https://www.haomeiwen.com/subject/vucfuctx.html