一种基于iOS系统的实现IP直连HTTPS服务器的方案

一、引言

HttpDNS:智营解析SDK,基于Http协议向腾讯云的DNS服务器发送域名解析请求,替代了基于DNS协议向运营商Local DNS发起解析请求的传统方式,可以避免Local DNS造成的域名劫持和跨网访问问题,解决移动互联网服务中域名解析异常带来的困扰。

HTTPS:Hyper Text Transfer Protocol over Secure Socket Layer,是安全传输的通信协议,HTTPS有两部分组成:HTTP和SSL/TLS,也就是在HTTP上又加了一层处理加密信息的模块。服务端和客户端的信息传输都会通过TLS进行加密,传输的数据都是加密后的数据。

SSL/TLS:Secure Sockets Layer/ Transport Layer Security,是一种架构于TCP之上的安全通信协议,它可以有效地协助Internet应用软体提升通信时的完整性以及安全性。

SNI:Server Name Indication,是为了解决一个服务器使用多个域名和证书的SSL/TLS扩展。它的工作原理如下:在连接到服务器建立SSL链接之前先发送要访问站点的域名(Hostname),服务器根据这个域名返回一个合适的证书。

CDN:Content Delivery Network,即内容分发网络,通过在网络各处放置节点服务器所构成的在现有的互联网基础之上的一层智能虚拟网络,CDN系统能够实时地根据网络流量和各节点的连接、负载状况以及到用户的距离和响应时间等综合信息将用户的请求重新导向离用户最近的服务节点上。其目的是使用户可就近取得所需内容,解决 Internet网络拥挤的状况,提高用户访问网站的响应速度。

二、本方案概述

        发送HTTPS请求时,首先要进行SSL/TLS握手,握手过程中关键的步骤为服务端下发证书及客户端对此证书进行合法性校验,然而证书是与域名关联的,并非IP,因此在上述过程中,一般解决方案分为以下两种场景:

  1. 单IP单HTTPS证书
  2. 单IP多HTTPS证书。

        在场景1下,服务端可以下发正确的HTTPS证书,客户端在拿到证书后替换为原域名进行校验即可。

        而在场景2下,一般多为请求CDN资源时,因为CDN的节点往往服务了很多的域名,则会存在一个服务器使用多个域名和证书的情况,这种情况下,服务器获取到的域名为IP,无法找到匹配的证书,会出现SSL/TLS握手不成功的错误,从而导致HTTPS请求失败。SNI即为解决这种场景的SSL/TLS扩展,然而iOS上层网络库NSURLConnection/NSURLSession并没有提供接口进行SNI字段的配置。

        因此,为了解决这个问题,需要使用到iOS Socket层级的底层网络库例如CFNetwork,来实现IP直连网络请求适配方案。

        本方案使用NSURLProtocol拦截网络请求,然后使用CFHTTPMessageRef创建NSInputStream实例进行Socket通信,并设置其kCFStreamSSLPeerName的值,有效解决了SNI字段配置问题,并在客户端拿到HTTPS证书时,替换为原域名进行校验。使用该方案后在以上两个场景下均可实现使用IP直连HTTPS服务器的需求。

三、本方案详细说明

        HTTPS请求的过程详细如下:

你可能感兴趣的:(iOS,ios,tcp/ip,https)