资讯专栏INFORMATION COLUMN

iOS Error Domain=NSURLErrorDomain Code=-999 "

荆兆峰 / 1512人阅读

摘要:若证书是信任机构签发的就会通过,若是自己服务器生成的证书,这里是不会通过的。只要公钥是正确的,就能保证通信不会被窃听,因为中间人没有私钥,无法解开通过公钥加密的数据。

先上我这儿成功的代码

- (void)testATS {
    //先导入证书,找到证书的路径
    NSString *cerPath = [[NSBundle mainBundle] pathForResource:@"cert" ofType:@"cer"];
    NSData *certData = [NSData dataWithContentsOfFile:cerPath];
    
    //AFSSLPinningModeNone 这个模式表示不做 SSL pinning,只跟浏览器一样在系统的信任机构列表里验证服务端返回的证书。若证书是信任机构签发的就会通过,若是自己服务器生成的证书,这里是不会通过的。
    //AFSSLPinningModeCertificate 这个模式表示用证书绑定方式验证证书,需要客户端保存有服务端的证书拷贝,这里验证分两步,第一步验证证书的域名/有效期等信息,第二步是对比服务端返回的证书跟客户端返回的是否一致。
    //AFSSLPinningModePublicKey 这个模式同样是用证书绑定方式验证,客户端要有服务端的证书拷贝,只是验证时只验证证书里的公钥,不验证证书的有效期等信息。只要公钥是正确的,就能保证通信不会被窃听,因为中间人没有私钥,无法解开通过公钥加密的数据。
    
    AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeNone];
    if (certData) {
        securityPolicy.pinnedCertificates = @[certData];
    }
    AFHTTPSessionManager *sessionManager = [AFHTTPSessionManager manager];
    [sessionManager setSecurityPolicy:securityPolicy];
    sessionManager.responseSerializer = [AFJSONResponseSerializer serializer];
    sessionManager.responseSerializer.acceptableContentTypes = [sessionManager.responseSerializer.acceptableContentTypes setByAddingObject:@"text/html"];

    NSString *urlStr = @"https://huifang.tech/info.php";
    [sessionManager GET:urlStr parameters:nil success:^(NSURLSessionDataTask *task, id responseObject) {
DDLog(@"responseObject = %@", responseObject);
    } failure:^(NSURLSessionDataTask *task, NSError *error) {
        DDLog(@"error = %@", error);
    }];
}

因为之前使用了 AFSSLPinningModeCertificate 模式
AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate];
改成现在的 AFSSLPinningModeNone 模式,解决问题。
因为我的证书是 Symantec 的 DV SSL 证书,所以 securityPolicy 的 allowInvalidCertificates 和 validatesDomainName 属性都是默认值?。自签的还没试过。
参考链接:

AFNetworking源码解析<三>

stackoverflow

蛋疼的自己的 hexo 搭建的博客很久没弄,今天给弄成 404 了= =。。。先放这儿存个档吧。

2016-12-07 10:59:52更新:
博客好了Y(^o^)Y链接

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/16568.html

相关文章

  • IOS出现 code: 18446744073709550594错误问题

    问题:IOS开发出现如下错误: NSError NSError domain: @NSURLErrorDomain - code: 18446744073709550594 解决: 找到info.plist文件,然后添加如下信息 showImg(https://segmentfault.com/img/bVbqW8v?w=1204&h=248); OK!

    paraller 评论0 收藏0
  • k8s动态准入控制

    准入控制是k8s中用来提供安全控制的一个控制器,而动态控制则是用户定制的安全策略种类动态准入控制分为两种,分别为Mutating,ValidatingMutatingMutating主要为修改性质的,在api调用完成之后k8s会根据ValidatingWebhookConfiguration中的条件发送给配置的webhook服务,webhook服务根据业务逻辑进行修改,比如说大名鼎鼎的istio的...

    社区管理员 评论0 收藏0
  • 用 NSURProtocol 注入测试数据

    摘要:在之前的几篇博文中,笔者介绍过访问异步网络的单元测试方法及如何使用模拟对象来进一步控制单元测试的范围。准备单元测试变量包含下代码的一个实例,包含了用作测试的部分对象,是异步调用结束的信号。 在之前的几篇博文中,笔者介绍过访问异步网络的单元测试方法及如何使用模拟对象来进一步控制单元测试的范围。在今天的教程中,笔者将展示另一种方法,即:通过自定义 NSURProtocol 类来获取静态测试...

    Tamic 评论0 收藏0
  • Restful API 中的错误处理

    简介 随着移动开发和前端开发的崛起,越来越多的 Web 后端应用都倾向于实现 Restful API。Restful API 是一个简单易用的前后端分离方案,它只需要对客户端请求进行处理,然后返回结果即可, 无需考虑页面渲染,一定程度上减轻了后端开发人员的负担。然而,正是由于 Restful API 不需要考虑页面渲染,导致它不能在页面上展示错误信息。那就意着当出现错误的时候,它只能通过返回一个错...

    NotFound 评论0 收藏0
  • kubevirt安装使用方法

    kubevirt是一个可以在k8s上管理虚拟机的应用可以通过cr的方式创建虚拟机,是k8s具备提供虚拟化服务安装安装资源发布在官方仓库,这里提供快捷安装方法kubevirt更新也是一样的#定义版本 exportRELEASE=v0.51.0 #部署operator kubectlapply-fhttps://github.com/kubevirt/kubevirt/releases/do...

    社区管理员 评论0 收藏0

发表评论

0条评论

荆兆峰

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<