iOS下使用HttpDNS进行IP直连避免DNS劫持
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 098也已经内置这一功能。
上述过程中,当客户端使用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请求
dns服务器用来解析域名为IP,很多国外的服务器不能访问,主要原因就是DNS服务器不能解析那些域名;hosts就是本地用来解析域名为IP
拓展:域名(英语:Domain Name),又称网域,是由一串用点分隔的名字组成的Internet上某一台计算机或计算机组的名称,用于在数据传输时对计算机的定位标识(有时也指地理位置)。
由于IP地址具有不方便记忆并且不能显示地址组织的名称和性质等缺点,人们设计出了域名,并通过网域名称系统(DNS,Domain Name System)来将域名和IP地址相互映射,使人更方便地访问互联网,而不用去记住能够被机器直接读取的IP地址数串。
要实现多个 HTTPS 主机共享一个 IP 地址的 443 端口,可以使用服务器名称指示(SNI)或透明代理来实现。
使用服务器名称指示(SNI):SNI 是一种 TLS 协议的扩展,它允许客户端在握手过程中发送要访问的目标主机名。服务器根据接收到的主机名选择相应的证书进行握手和加密通信。大多数现代浏览器和服务器都支持 SNI。为了配置 SNI,请确保服务器软件和操作系统支持 SNI,并将每个主机的 SSL 证书配置为相应的主机名。
使用透明代理:透明代理是指在代理服务器上进行 SSL/TLS 解密和再加密的过程。当客户端请求到达时,代理服务器会解密传入的 SSL 流量,读取 HTTP 请求头中的目标主机名,并根据该主机名将请求转发到正确的后端主机。然后,代理服务器会对响应进行再加密,并将它发送回客户端。这样,代理服务器可以共享相同的 IP 地址和端口,同时为不同的主机提供 HTTPS 服务。
独享享IP称为专用IP,专享IP或私有IP,就是这个IP只给你用,其他人无法用。
也就意味着你不需要受别人用途的影响,避免因为别人的使用IP被禁导致你无法访问目标网站的问题,更安全的同时也更快速。
将IP视为高速公路,则独享IP代理相当于一条独立的车道,同时只有一辆车在这条车道上行驶,也就是说,同一IP在同一时间内,确保指分配给一位客户,确保业务成功。
此外,独享IP代理还有什么好处?
稳定性高
独享IP代理由于同时只有一位用户在使用,因此稳定性高,不会出现拥堵,业务冲突等问题。
速度快
这很好理解,在相同的带宽条件下,独享的可以享受满速,而共享的如果有10个人在使用,那么你只能享受十分之一的速度,而且还很不稳定。
效率高
相信很多朋友都遇到过。获得一个IP后,我发现这个IP无法访问,速度慢,被网站拒绝,因为在你使用之前,这个IP可能会因为其他用户频繁访问而被关闭,你可以通过使用独家IP代理来完全避免这种情况,因为独家IP代理只有你一个人使用,不会和别人发生冲突。
独家IP代理对高频用户有无可比拟的好处,因为它的速度和效率都比共享IP代理强得多!
在Apache环境下实现一台服务器实现安装多个SSL证书,有2种解决方案:
方案一:SSL证书分类较多,其中有一款证书“多域名SSL证书”,这类证书可以支持一张证书为多个域名提供通信加密服务。但是这类证书也有不好的地方,对于OV SSL证书(企业验证)、EV SSL证书(组织验证)类证书而言只能显示同一个企业信息,如果需要不同的网站显示不同的企业信息就不能适用于此方法了。
方案二:服务器安装SNI ,SNI (Server Name Indication)是用来改善服务器与客户端的一个扩展。解决一台服务器的一个IP只能使用一个证书对应一个域名的缺点。
SSL证书到期或不信任需要进入淘宝找到Gworg重新认证HTTPS证书。
一、ssl证书包含域名与网址不一致
每一个ssl证书所对应的域名都具有唯一性,是一个全域名FQDN。当网站出具的证书所包含的域名和网站域名不一致,系统就会自动发出报告,提示证书域名不匹配。
解决方法:需要重新申请ssl证书。如有相同主域名的多站点,则要申请多域名ssl证书。西部数码网站拥有多种不同品牌的多域名ssl证书,用户可根据自身需求选择。
二、网站证书不是由受信任的机构颁发
这是因为证书不在浏览器厂商的受信任的列表中。可通过手动添加证书安装到浏览器的“信任列表”。
解决方法:浏览器中选项→内容选项卡→证书-→导入即可。
三、网站证书已过期或还未生效
出现这种情况一般是电脑系统日期错误,另一种就是证书过了有效期,则需要续费。
解决方法:可查看该证书信息的有效期止日期,确定证书是否在有效期内,如在的话需查看电脑日期是否正确。否则就是第二种原因,ssl证书不在有效期内,需尽快联系证书颁发厂商,进行续费。
四、页面包含有不安全的内容
目前都提倡每一个页面使用HTTPS,则网站所有内容都必须是HTTPS。如果遇到、JS脚本,FLASH插件是通过HTTP方式去调用的,就会发生这种错误。
解决方法:将调用的元素http改成HTTPS即可,然后刷新测试ssl问题是否已经解决。
五、浏览网页的时候突然弹出ssl连接错误
解决方法:按下“Win+R”组合键打开运行,在运行框中输入:inetcplcpl 点击确定打开“internet 选项”;切换到高级选项卡;在设置框中勾选“使用ssl 30”“使用ssl20””点击应用并点击确定,重启浏览器。
如果您在服务器上为某个站点添加了SSL证书,其他未添加证书的站点仍然可以访问到该站点,这可能是由以下原因导致的:
1 SSL证书未正确配置:请检查您的SSL证书配置是否正确。确保SSL证书已正确安装在服务器上,并且已正确配置到相应的站点。
2 SSL证书未过期:请检查您的SSL证书是否已过期。如果SSL证书已过期,其他未添加证书的站点可能仍然可以访问到该站点。
3 SSL证书未吊销:请检查您的SSL证书是否已被吊销。如果SSL证书已被吊销,其他未添加证书的站点可能仍然可以访问到该站点。
4 服务器配置问题:请检查服务器的配置是否正确。确保服务器已正确配置SSL证书,并且已启用SSL加密。
5 网络问题:请检查网络连接是否正常。如果网络连接不稳定,可能会导致其他未添加证书的站点仍然可以访问到该站点。
为了解决这个问题,您可以尝试以下方法:
1 检查SSL证书配置:确保您的SSL证书配置正确,包括证书文件路径、证书私钥文件路径、证书链等。
2 检查SSL证书有效期:确保您的SSL证书未过期,并且已过期的证书已被正确替换。
3 检查SSL证书吊销状态:确保您的SSL证书未被吊销,并且已被吊销的证书已被正确替换。
4 检查服务器配置:确保服务器已正确配置SSL证书,并且已启用SSL加密。
5 检查网络连接:确保网络连接稳定,以便其他未添加证书的站点仍然可以访问到该站点。
如果问题仍然存在,请联系服务器提供商或技术支持团队,以获取更详细的帮助。
0条评论