AFNetworking 原作者都无法解决的问题: 如何使用ip直接访问https网站?

news/2024/4/29 0:57:01/文章来源:https://blog.csdn.net/weixin_34236497/article/details/89432743

背景

最近App似乎有报异常是DNS无法解析,尝试解决此问题.搜集到的资料很少,甚至连AFN原作者都判定这可能是一个无解的问题,参见: https://github.com/AFNetworking/AFNetworking/issues/2954,不过最终还是靠着stackoverflow上的一丁点提示,顺利找到并汇集成了一个可用的解决方案.大喜,与君共享!

问题描述

通过IP直接访问网站,可以解决DNS劫持问题.DNS劫持,可以通过修改电脑的host文件模拟.如果是HTTP请求,使用ip地址直接访问接口,配合header中Host字段带上原来的域名信息即可;如果是 https请求,会很麻烦,需要 Overriding TLS Chain Validation Correctly;curl 中有一个 -resolve 方法可以实现使用指定ip访问https网站,iOS中集成curl库应该也可以,不过改动太大,未验证;对于服务器IP经常变的情况,可能需要使用httpDNS服务,参见:https://www.dnspod.cn/httpdns.

解决方案讨论

1. 最直接的方式是允许无效的SSL证书,生产环境不建议使用;

2.一个需要部分重写AFN源码的方法.

  • 在Info.plist中添加NSAppTransportSecurity类型Dictionary,在NSAppTransportSecurity下添加NSAllowsArbitraryLoads类型Boolean,值设为YES.这些本来是用来解决iOS9下,允许HTTP请求访问网络的,当然作用不止这些.具体原因感兴趣的自行google.

  • 给 AFURLConnectionOperation 类添加新属性:

/** 可信任的域名,用于支持通过ip访问此域名下的https链接.Trusted domain, this domain for support via IP access HTTPS links.*/
@property(nonatomic, strong) NSMutableArray * trustHostnames;
  • 给 AFURLConnectionOperation 实现的代理方法: - (void)connection:(NSURLConnection *)connection
    willSendRequestForAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge 添加添加可信任的域名的相关逻辑代码:

- (void)connection:(NSURLConnection *)connection
willSendRequestForAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge
{if (self.authenticationChallenge) {self.authenticationChallenge(connection, challenge);return;}if ([challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust]) {SecTrustRef serverTrust = challenge.protectionSpace.serverTrust;/* 添加可信任的域名,以支持:直接使用ip访问特定https服务器.Add trusted domain name to support: direct use of IP access specific HTTPS server.*/for (NSString * trustHostname  in [self trustHostnames]) {serverTrust = AFChangeHostForTrust(serverTrust, trustHostname);}....
  • 参考Apple官方文档,实现自定义的添加可信域名的函数: AFChangeHostForTrust

static inline SecTrustRef AFChangeHostForTrust(SecTrustRef trust, NSString * trustHostname)
{if ( ! trustHostname || [trustHostname isEqualToString:@""]) {return trust;}CFMutableArrayRef newTrustPolicies = CFArrayCreateMutable(kCFAllocatorDefault, 0, &kCFTypeArrayCallBacks);SecPolicyRef sslPolicy = SecPolicyCreateSSL(true, (CFStringRef)trustHostname);CFArrayAppendValue(newTrustPolicies, sslPolicy);#ifdef MAC_BACKWARDS_COMPATIBILITY/* This technique works in OS X (v10.5 and later) */SecTrustSetPolicies(trust, newTrustPolicies);CFRelease(oldTrustPolicies);return trust;
#else/* This technique works in iOS 2 and later, orOS X v10.7 and later */CFMutableArrayRef certificates = CFArrayCreateMutable(kCFAllocatorDefault, 0, &kCFTypeArrayCallBacks);/* Copy the certificates from the original trust object */CFIndex count = SecTrustGetCertificateCount(trust);CFIndex i=0;for (i = 0; i < count; i++) {SecCertificateRef item = SecTrustGetCertificateAtIndex(trust, i);CFArrayAppendValue(certificates, item);}/* Create a new trust object */SecTrustRef newtrust = NULL;if (SecTrustCreateWithCertificates(certificates, newTrustPolicies, &newtrust) != errSecSuccess) {/* Probably a good spot to log something. */return NULL;}return newtrust;
#endif
}
  • 使用AOP方法,重写 AFURLConnectionOperation 的trustHostnames属性:

    /* 使用AOP方式,指定可信任的域名, 以支持:直接使用ip访问特定https服务器.*/[AFURLConnectionOperation aspect_hookSelector:@selector(trustHostnames) withOptions:AspectPositionInstead usingBlock: ^(id<AspectInfo> info){__autoreleasing NSArray * trustHostnames = @[@"www.example.com"];NSInvocation *invocation = info.originalInvocation;[invocation setReturnValue:&trustHostnames];}error:NULL];

此处用到的是一个 iOS AOP库,不熟悉的点这里: http://www.ios122.com/2015/08/aspects/.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_803035.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

网站指纹识别工具——WhatWeb v0.4.7发布

2019独角兽企业重金招聘Python工程师标准>>> WhatWeb是一款网站指纹识别工具&#xff0c;主要针对的问题是&#xff1a;“这个网站使用的什么技术&#xff1f;”WhatWeb可以告诉你网站搭建使用的程序&#xff0c;包括何种CMS系统、什么博客系统、Javascript库、web服…

Wordpress 网站搭建及性能监控方法详解!

前言 说到 Wordpress&#xff0c;大家往往想到的是博客&#xff0c;其实&#xff0c;如今的 WordPress 已经成为全球使用量最多的开源 CMS 系统。并且&#xff0c;如果你有一定的技术基础稍加改动&#xff0c;就可以搭建出新闻网站、企业网站、电影网站&#xff0c;甚至是商城系…

转:大型网站架构系列:负载均衡详解(2)

一、软件负载均衡概述 硬件负载均衡性能优越&#xff0c;功能全面&#xff0c;但是价格昂贵&#xff0c;一般适合初期或者土豪级公司长期使用。因此软件负载均衡在互联网领域大量使用。常用的软件负载均衡软件有Nginx&#xff0c;Lvs&#xff0c;HaProxy等。本文参考大量文档&a…

SSH 网站制作之文件上传

2019独角兽企业重金招聘Python工程师标准>>> 最近学习用SSH做网页&#xff0c;遇到了文件上传的一些知识&#xff0c;下面就总结总结。 1.下面是一个文件上传的JSP页面 其中&#xff0c;表单中enctype"multipart/form-data"的意思&#xff0c;是设置表单的…

程序员面试过关必备网站,你用过几个?

对于程序员而言&#xff0c;面试所谓是人生重要的一件事情&#xff0c;在这之前&#xff0c;还是有必要刷一些编程面试题&#xff0c;为面试做好充足的准备&#xff01; 今天小编给大家分享一些面试相关网站&#xff0c;给大家面试来一波神助攻噢&#xff01; 在Reddit网站上&a…

程序员常用网站:让代码更简单

说起程序员&#xff0c;总有那么几个网站是程序员不可或缺的&#xff0c;小编办公室的程序员就常常用这几款网站&#xff0c;你用过么&#xff1f; Stack Overflow 这个网站&#xff0c;就算不常用&#xff0c;每次搜索编程相关都能看见它。当你遇到任何编程问题&#xff0c;…

找工作的网站有哪些好

2015年的时候&#xff0c;市场调查报告显示财务管理和计算机科学与技术专业的就业率最高。因此15年就会有很多人报考会计和计算机专业。据现在的市场来看&#xff0c;计算机专业的很吃香。15年报考计算机专业的相对就会比财务专业的会好很多。三顾人才是一家专业做人才招聘的平…

找工作什么网站最好

一般来说&#xff0c;程序员 比较木讷&#xff0c;很多程序员写代码很厉害&#xff0c;但是一到面试就什么都说不粗来了&#xff0c;即使说粗来了 &#xff0c;面试官也没有了解到你那非常牛掰的技术水平。最后应聘不上也是自然的。 三顾人才根据自己在人才市场的经验&#xff…

找工作有哪些网站?

很多人都在找工作上花了近两个月的时间&#xff0c;效率低。但是也有人在一个星期之内就找到工作的。那么如何高效精准的找工作? 1.首先要分析自己的性格特点和能力的优劣势(劣势有时比优势多考虑&#xff0c;可以使用SWOT或者职业锚测试等) 性格外向&#xff0c;热情洋溢&…

程序员在在哪个网站上找工作?

一、网上投简历巧用职位搜索 职位搜索功能是在招聘网站上具备的基本功能&#xff0c;也是最重要的一个功能&#xff0c;求职者可以按照职位搜索功能的提示&#xff0c;选择工作的地点&#xff0c;工作的时间&#xff0c;工资的范围&#xff0c;还有你想从事什么行业&#xff0c…

网站优化:测试网站速度的8款免费工具推荐

网站的加载速度是决定网站成败的重要因素&#xff0c;值得站长特别关注。原因很简单&#xff0c;没有人愿意为了打开一个网页而等老半天&#xff0c;换句话说&#xff0c;如果你的网站打开速度很慢&#xff0c;将流失大量的访客&#xff0c;甚至出现多米诺效应的不良影响&#…

《网站设计 开发 维护 推广 从入门到精通》—— 导读

前言 网站设计 开发 维护 推广 从入门到精通互联网信息技术彻底改变了人们的生活和工作。越来越多的企业和个人建立起网站来宣传自己。人才市场上对网页制作和网站建设人员的需求大大增加&#xff0c;但是网站建设是一项综合性技能&#xff0c;包括网站策划、网页设计和动态网站…

全球一半网站已用上 HTTPS:HTTP 加速淘汰

早年&#xff0c;HTTP 协议传输的数据都是未加密的&#xff0c;也就是明文的&#xff0c;因此使用 HTTP 协议传输隐私信息非常不安全。为了保证这些隐私数据能加密传输&#xff0c;网景公司设计了 SSL&#xff08;Secure Sockets Layer&#xff09;协议用于对 HTTP 协议传输的数…

从中国互联网安全报告看网站部署SSL证书的紧急性

2019独角兽企业重金招聘Python工程师标准>>> SSL加密协议是网络信息传输的保障&#xff0c; 对客户端与服务端之间的信息传递进行高强度的加密&#xff0c;防止信息被监听、窃取以及篡改。独特的辨识度、网络“身份证”特征可防被钓鱼。高强度保护个人隐私。虽然SSL…

网站设计的思考 (转)

1、定位你的网站主题和名称2、定位你的网站CI形象3、确定网站的栏目和版块4、确定网站的目录结构和链接结构5、确定网站的整体风格和创意设计6、首页的设计7、版面布局的原理8、网页色彩搭配的原理9、字体的设定10、网页中表格的运用网站设计&#xff0c;包含的内容非常多。大体…

网站安全测试之支付漏洞检测与修复

前几篇的网站安全检测的文章&#xff0c;介绍的都是跟验证码以及用户逻辑功能方面的安全测试与防攻击方法&#xff0c;今天给大家深度的来剖析一下关于网站里含有支付接口的安全漏洞。许多商城网站&#xff0c;以及微信支付网站&#xff0c;在线游戏平台&#xff0c;发卡商&…

使用chrome开发者工具中的network面板测量网站网络性能

前面的话 Chrome 开发者工具是一套内置于Google Chrome中的Web开发和调试工具&#xff0c;可用来对网站进行迭代、调试和分析。使用 Network 面板测量网站网络性能。本文将详细介绍chrome开发者工具中网络面板network的使用 概述 【打开方式】 打开方式有以下三种 1、在Chrome菜…

省钱秘笈☞将静态网站迁移至阿里云OSS(教你如何利用OSS低成本建站)...

所需&#xff1a; 1、开通阿里云OSS并创建Bucket 2、购买域名并通过备案 步骤&#xff1a; 1、在“Bucket属性”中的“静态网站”页面&#xff0c;直接写一个默认首页的文件名就可以了。 2、由于OSS的网站功能不支持子目录下的默认首页&#xff0c;只能讲所有页面放置在根目…

网站被黑被劫持跳转到其他网站该如何解决

2019独角兽企业重金招聘Python工程师标准>>> 2019年元旦很多公司遇到网站被黑的问题,因为大多数网站用的都是一些主流&#xff0c;开源的cms系统开发的程序,还有的公司找的当地网站建设公司去做的网站,而网站天天被黑的遭遇找到网站建设公司也只能解决一时,没过多久…

Linux中什么是动态网站环境及如何部署

当谈论起网站时&#xff0c;我们可能听说过静态和动态这两个词&#xff0c;但却不知道它们的含义&#xff0c;或者从字面意思了解一些却不知道它们的区别。这一切可以追溯到网站和网络应用程序&#xff0c;Web应用程序是一个网站&#xff0c;但很多网站不是Web应用程序&#xf…