「转载」为什么不推荐在移动设备上使用hosts

原文:思起,侵删

这篇文章讲了手机上hosts不适用的原因。

简单的说是Android应用程序不支持SNI,所以不能像访问网页(Web服务)那样使用大量非证书对应的IP(如运营商的加速服务器),导致证书错误无法加载。而Google 自身的IP 能用的很稀少且易失效,所以就不太好用。

顺带提一下:Android hosts 比Shadowsocks的优先级高,试了一下,好像是会向ss服务器请求hosts所指向的ip,导致这两个很难同时使用(一部分用hosts,一部分用ss),所以还是老实用ss吧,另外PAC也是基本没法用的。

下面是原文。


1年前 (2016-01-08) 2,300

首先需要介绍一些SSL/TLS的知识。当你以https的方式访问某个域名时,客户端(浏览器、App等)会向服务器请求证书,这时服务器会返回与域名一样的证书验证连接 比如你访问 www.google.com ,则返回 www.google.com 的证书来进行验证,验证通过之后才客户端才会继续建立加密连接

如果你访问 www.google.com ,而服务器给你返回 *.googleusercontent.com 的证书,那么只要是个客户端都不会继续建立连接了(360这种无视证书错误的奇葩除外)。

一般来说,一个IP的一个端口只能使用一个证书,而网站却可以有无限多个,如果是这样的话IP枯竭会提前到来的。聪明的人们想到了一个方法来改变现状:服务器名称指示(SNI)——在建立SSL握手请求时的加一个Host信息来标记要访问的域名,以便服务器解析Host信息后返回了正确的证书,这让一个 IP地址一个端口 得以使用 多个证书 。这也正是为什么可以在hosts里大量使用同一IP的原因。

当然,这需要服务端和客户端同时支持SNI。如果服务器支持了SNI而客户端不支持SNI,那么 以上技术均是白瞎 ,依旧只能获取到默认的证书,当证书错误时就不会继续建立SSL握手连接了。

以下是支持SNI的浏览器

Internet Explorer 8 及以上 (XP SP2及以下均不支持,SP3需安装补丁)
Internet Explorer 7 及以上 (Vista或更高级的系统)
Mozilla Firefox 2.0 及以上
Opera 8.0 及以上 (the TLS 1.1 protocol must be enabled)
Google Chrome 6.0 及以上
Safari 3.0 及以上 (Mac OS X 10.5.6 以上)
MobileSafari(iOS 4.0以上)
Android 自带的浏览器 (Android 3.0 以上)

接下来回到正题,为什么不推荐在移动端使用hosts呢,这就和上面提及的SNI 有关了。咱们举个简单的例子吧

原本你使用VPN可以在 GooglePlay 上下载App,但修改hosts之后不但不能下App,连预览图都无法加载了,就算再用VPN也无法正常工作

这是因为GooglePlay这个App不支持SNI,应用预览图的地址是

lh*.googleusercontent.com

因为封锁太紧的原因,无法找到默认证书为 *.googleusercontent.com (泛域名) 的IP,在修改hosts后因为证书错误的原因,应用便无法正常加载图片。

嗯,这就是hosts的局限性所在了,如果你只是使用Web服务的话,可以无视这篇文章,如果你需要使用各种Google服务(例如play﹑hangouts)的话,那么不推荐使用hosts这种方法。

0%