iOS下使用HttpDNS进行IP直连避免DNS劫持

kuaidi.ping-jia.net  作者:佚名   更新日期:2024-06-28
IP直连可以避免localDNS解析导致的DNS劫持,但是在iOS中不仅仅是将host直接换成IP地址就可以了,还有以下需要注意的问题。

发送HTTPS请求首先要进行SSL/TLS握手,握手过程大致如下:

上述过程中,和HTTPDNS有关的是第3步,客户端需要验证服务端下发的证书,验证过程有以下两个要点:

如果上述两点都校验通过,就证明当前的服务端是可信任的,否则就是不可信任,应当中断当前连接。 当客户端使用HTTPDNS解析域名时,请求URL中的host会被替换成HTTPDNS解析出来的IP,所以在证书验证的第2步,会出现domain不匹配的情况,导致SSL/TLS握手不成功 。

针对 domain不匹配 问题,可以采用如下方案解决:hook证书校验过程中第2步,将IP直接替换成原来的域名,再执行证书验证。

方法为在客户端收到服务器的质询请求代理方法 -URLSession:task:didReceiveChallenge:completionHandler: 中,首先从header中获取host(第一点注意事项:HTTP请求头HOST字段设置),从header中如果没有取到host,就去URL中获取host(降级为LocalDNS解析时不进行替换),然后拿着host在自己的方法-evaluateServerTrust:forDomain:中创建SSL Policy证书校验策略,然后对证书进行校验。

SNI(Server Name Indication)是为了解决一个服务器使用多个域名和证书的SSL/TLS扩展。它的工作原理如下:
在连接到服务器建立SSL链接之前先发送要访问站点的域名(Hostname),服务器根据这个域名返回一个合适的证书。
目前,大多数操作系统和浏览器都已经很好地支持SNI扩展,OpenSSL 0.9.8也已经内置这一功能。
上述过程中,当客户端使用HTTPDNS解析域名时,请求URL中的host会被替换成HttpDNS解析出来的IP,导致SSL/TLS握手中服务器接收到的客户端发出的clientHello中的SNI为host解析后的IP,从而无法找到匹配的证书,只能返回默认的证书或者不返回,所以会出现SSL/TLS握手不成功的错误。

比如当你需要通过HTTPS访问CDN资源时,CDN的站点往往服务了很多的域名,所以需要通过SNI指定具体的域名证书进行通信。

SNI(单IP多HTTPS证书)场景下,iOS上层网络库 NSURLConnection/NSURLSession 没有提供接口进行 SNI 字段 配置,因此需要 Socket 层级的底层网络库例如 CFNetwork,来实现 IP 直连网络请求适配方案。苹果提供的一些指导,在 Networking Programming Topics 中,可以通过如下方式指定一个TLS hostname:

我们使用CFNetwork进行HTTP网络请求的方法,详见 [2] 。

Apple - Communicating with HTTP Servers
Apple - HTTPS Server Trust Evaluation - Server Name Failures
Apple - HTTPS Server Trust Evaluation - Trusting One Specific Certificate

[1]:HTTPS场景IP直连方案说明
[2]:使用CFNetwork进行HTTP请求

  • iOS下使用HttpDNS进行IP直连避免DNS劫持
    答:SNI(单IP多HTTPS证书)场景下,iOS上层网络库 NSURLConnection/NSURLSession 没有提供接口进行 SNI 字段 配置,因此需要 Socket 层级的底层网络库例如 CFNetwork,来实现 IP 直连网络请求适配方案。苹果提供的一些指导,在 Networking Programming Topics 中,可以通过如下方式指定一个TLS hostname:我们使用...
  • 你知道什么是HTTPDNS吗?
    答:HTTPDNS和上面说的DNS有什么差别呢 细心的tx已经发现HTTP这个关键字 是的,差别就在传输协议上 DNS基于UDP协议 HTTPDNS基于HTTP协议 HTTPDNS: HTTPDNS使用HTTP协议进行域名解析,代替现有基于UDP的DNS协议 使用HTTPDNS有什么好处呢 防劫持 精准调度 0ms解析延迟 使用HTTPDNS的场景 App使用的比较多,因为...
  • HttpDNS功能说明及实现
    答:服务端提供API接口,app端直接通过ip地址访问,ip地址可以有多个 请求方式:HTTP GET URL参数说明:请求示例:考虑到服务IP防攻击之类的安全风险,为保障服务可用性,HTTPDNS同时提供多个服务IP,当某个服务IP在异常情况下不可用时,可以使用其它服务IP进行重试。错误码列表如下:异常下的出错兼容逻辑,主要包括...
  • 聊聊DNS,HTTPDNS
    答:而使用HTTPDNS的往往是手机应用,需要在手机端嵌入支持HTTPDNS的客户端SDK。 在客户端的SDK里动态请求服务端,获取HTTPDNS的服务器列表。缓存到本地,随着不断域名解析,SDK也会在本地缓存DNS域名解析的结果。 当应用要访问一个地址时,先看下是否有缓存(这个缓存时手机应用自己做的,不走运营商...
  • 苹果设备DNS怎么设置,网速更快
    答:可以通过修改dns,达到快速解析网址的目的,来提高网速。具体操作步骤如下:1、打开iPhone手机桌面,找到手机桌面上的设置图标,点击进入。2、进入到设置界面后,选择无线局域网,此刻无线网是连接的状态。3、接着进入无线局域网的设置界面,无线局域网开关处于开启状态,下面就是连接无线网的名称,然后点击...
  • TCP/IP协议
    答:    寻址功能就是原地址和目标地址之间建立连接,需要使用ARP协议(Address Resolution Protocol),IP协议就是找到一条连接两台电脑的路径,从而完成数据的交互。    地址解析协议,ARP协议,是根据IP地址获取物理地址的一个TCP/IP协议。IP间的通信依赖MAC地址。在进行中转时,会...
  • 【HttpDns】解决 APP 无法找到主机问题
    答:这种改造方案非常简单,后端 Web Server 将 IP 地址直接绑定到目标站点,APP 在发起请求前,直接将所有 URL 中自己域名的部分换为通过 HTTP DNS 获得目标 IP 即可。当然如果后端有针对域名的逻辑也需要处理下,比如防盗链用的 Referer 校验等。另外有的第三方库(比如支付宝)需要 APP 传入 Server 回调...
  • 将自己的苹果手机DNS改了。也是变IP地址。有什么影响?
    答:改手机DNS可以加快上网速度或者是原本无线连不上APP Store只要换了DNS就可以连上。域名系统(DNS)是因特网的一项核心服务,它作为可以将域名和IP地址相互映射的一个分布式数据库,能够使人更方便的访问互联网,而不用去记住能够被机器直接读取的IP数串。虽然因特网上的节点都可以用IP地址惟一标识,并且...
  • 基于OkHttp3 加入HttpDns功能
    答:HttpDns是通过网络请求的方式,获取即将发送的业务请求所需要的ip地址。在使用HttpDns时,android发送网络请求时会请求本地dns或本地运营商 的dns服务获取目标ip,但是一旦你使用的这个默认的dns不靠谱,不受信任,则请求稳定性将会降低,甚至可能被劫持。因此,如果能够使用自己信任的dns服务器做dns域名...
  • 5分钟教你搞懂 DNS
    答:我们用netstat-ntlp,来检查一下服务是否启动,53端口已启动,那么我们测试一下效果,用dig解析一下域名,使用127.0.0.1作为递归解析服务器。 我们看到dig的结果跟我们配置文件中配置的一样是1.2.3.4,DNS完成了它的使命,根据域名获取到IP。用DNS实现负载均衡,一个域名添加多条A记录,解析时使用轮询的方式返回随机一条,流...