AFNetworking访问https出现"NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9813"

使用AFNetworking来访问http请求非常方便快捷,最简单的请求代码如下:

#import "HSTestHTTPSViewController.h"
#import <AFNetworking/AFNetworking.h>

@interface HSTestHTTPSViewController ()

@end

@implementation HSTestHTTPSViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    NSString *URLString = @"http://localhost:8000";

    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
    manager.requestSerializer = [AFHTTPRequestSerializer serializer];
    manager.responseSerializer = [AFHTTPResponseSerializer serializer];

    [manager GET:URLString parameters:nil progress:nil
          success:^(NSURLSessionDataTask *task, id responseObject) {
              //返回NSData,转化为String输出
              NSString *JSONString = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding];
              NSLog(@"%@", JSONString);
          }
          failure:^(NSURLSessionDataTask *task, NSError *error) {
              NSLog(@"%@", error);
          }];
}

@end

当然,使用上述代码来请求http能够成功,但是当我们要访问https的时候,如果仅仅是把上述的请求URL修改成对应的https,那么很有可能会出现如下报错:

NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9813)
Error Domain=NSURLErrorDomain Code=-1202 "The certificate for this server is invalid. 
You might be connecting to a server that is pretending to be “localhost” which could put your confidential information at risk." UserInfo={NSURLErrorFailingURLPeerTrustErrorKey=<SecTrustRef: 0x600000108820>, NSLocalizedRecoverySuggestion=Would you like to connect to the server anyway?, _kCFStreamErrorDomainKey=3, _kCFStreamErrorCodeKey=-9813, NSErrorPeerCertificateChainKey=
(
    "<cert(0x7f9bcd84ea00) s: chenyufeng i: chenyufeng>"
), NSUnderlyingError=0x600000057730 {Error Domain=kCFErrorDomainCFNetwork Code=-1202 "(null)" UserInfo={_kCFStreamPropertySSLClientCertificateState=0, kCFStreamPropertySSLPeerTrust=<SecTrustRef: 0x600000108820>, _kCFNetworkCFStreamSSLErrorOriginalValue=-9813, _kCFStreamErrorDomainKey=3, _kCFStreamErrorCodeKey=-9813, kCFStreamPropertySSLPeerCertificates=
(
    "<cert(0x7f9bcd84ea00) s: chenyufeng i: chenyufeng>"
)}}, NSLocalizedDescription=The certificate for this server is invalid. You might be connecting to a server that is pretending to be “localhost” which could put your confidential information at risk., NSErrorFailingURLKey=https://localhost:8001/, NSErrorFailingURLStringKey=https://localhost:8001/, NSErrorClientCertificateStateKey=0}

出现以上问题的主要原因是https证书是自签名证书,没有经过第三方机构认证(关于生成自签名证书和nodejs配置自签名证书可以了解《nodejs开发——express配置自签名https服务器》这篇博客)。一个经过认证的证书一般不会出现以上问题。那么在服务端https证书不变的情况下,如何在iOS客户端修复该问题呢?

(1)从服务端那里拿到证书crt后缀文件,我这里的文件名为“file.crt”. (建议看下《nodejs开发——express配置自签名https服务器》)。然后使用该crt文件生成用于iOS的.cer文件,我这里的文件名为“client.cer”.  生成命令如下:

openssl x509 -in file.crt -out client.cer -outform der

生成前与生成后的crt文件如下:

(2)然后把client.crt文件复制到iOS项目目录下,然后在Build Phases中的Copy Bundle Resources中选中crt文件进行添加:

(3)然后把AFN的网络请求代码修改如下:主要增加Security设置

#import "HSTestHTTPSViewController.h"
#import <AFNetworking/AFNetworking.h>

@interface HSTestHTTPSViewController ()

@end

@implementation HSTestHTTPSViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    NSString *URLString = @"https://localhost:8001";

    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
    manager.requestSerializer = [AFHTTPRequestSerializer serializer];
    manager.responseSerializer = [AFHTTPResponseSerializer serializer];

    //增加AFSecurityPolicy设置
    AFSecurityPolicy * securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate];
    securityPolicy.allowInvalidCertificates = YES;
    securityPolicy.validatesDomainName = NO;
    manager.securityPolicy = securityPolicy;

    [manager GET:URLString parameters:nil progress:nil
          success:^(NSURLSessionDataTask *task, id responseObject) {
              //返回NSData,转化为String输出
              NSString *JSONString = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding];
              NSLog(@"%@", JSONString);
          }
          failure:^(NSURLSessionDataTask *task, NSError *error) {
              NSLog(@"%@", error);
          }];
}

@end

经过测试,能成功接收到https的返回结果。

时间: 2024-08-05 11:16:57

AFNetworking访问https出现"NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9813"的相关文章

AFNetworking访问https出现&quot;NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9806&quot;

在之前一篇博客中<AFNetworking访问https出现"NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9813">,而在这篇博客中的这个bug也是非常的类似.出现的场景也是服务端使用了自签名的证书,然后客户端按照<AFNetworking访问https出现"NSURLSession/NSURLConnection HTTP load failed (kC

NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9802)

本篇文章由:http://xinpure.com/nsurlsessionnsurlconnection-http-load-failed-kcfstreamerrordomainssl-9802/ 错误描述 环境: iOS9 / Xcode7, Cordova 错误提示: NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9802) 百度/Google之后 不难发现报错的原因 这是因为 iOS9 增

#iOS问题记录#关于NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9801)

响应Apple的号召,将APP里的HTTP请求全部升级为HTTPS,一切配置OK,正常的请求也没问题: 但,当使用SDwebImg缓存图片时,遇到了标题写的问题: 根据资料得: 这个问题的出现是因为ios9里对TLS的版本配置为1.2:而服务器使用Tomcat配置时,默认为1.0: 所以解决方法有两种: 方法1,服务器的配置文件,server.xml里奖TLS版本配置为1.2: 方法2,APP端,工程里的info.list 配置TLS的最低版本为1.0: 以下内容: <key>NSAppTra

NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9802) 解决办法

可能是手机操作系统问题,之前iOS7没有遇到这种问题,iOS9就出现这个问题 在info.plist里面添加如下内容即可:

iOS UIWebView 加载https站点出现NSURLConnection/CFURLConnection HTTP load failed (kCFStreamErrorDomainSSL,

今天在加载https站点的时候遇到如下的错误问题.所以对自己之前写的iOS内嵌webview做了一些修改,可以让它加载http站点也可以让它加载https站点. 下面是我加载https站点的时候出现的错误. error:     NSURLConnection/CFURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9813) HTTPS 超文本传输安全协议(缩写:HTTPS,英语:Hypertext Transfer Protoc

iOS UIWebView 载入https 网站出现NSURLConnection/CFURLConnection HTTP load failed (kCFStreamErrorDomainSSL,

今天在载入https网站的时候遇到例如以下的错误问题.所以对自己之前写的iOS内嵌webview做了一些改动,能够让它载入http网站也能够让它载入https网站. 以下是我载入https网站的时候出现的错误. error:     NSURLConnection/CFURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9813) HTTPS 超文本传输安全协议(缩写:HTTPS,英语:Hypertext Transfer Prot

Java生成证书工具类 InstallCert.java解决httpClient访问https出错:PKIX path building failed

编译:javac InstallCert.java运行:java InstallCert 要访问的网址 最后面会输出: Enter certificate to add to trusted keystore or 'q' to quit: [1] 输入1,然后直接回车,会在相应的目录下产生一个名为'jssecacerts'的证书.将证书copy到$JAVA_HOME/jre/lib/security目录下 InstallCert.java /* * Copyright 2006 Sun Mic

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

背景 最近App似乎有报异常是DNS无法解析,尝试解决此问题.搜集到的资料很少,甚至连AFN原作者都判定这可能是一个无解的问题,参见: https://github.com/AFNetworking/AFNetworking/issues/2954,不过最终还是靠着stackoverflow上的一丁点提示,顺利找到并汇集成了一个可用的解决方案.大喜,与君共享! 问题描述 通过IP直接访问网站,可以解决DNS劫持问题.DNS劫持,可以通过修改电脑的host文件模拟.如果是HTTP请求,使用ip地址

iOS开发 - 用AFNetworking实现https单向验证,双向验证

https相关 自苹果宣布2017年1月1日开始强制使用https以来,htpps慢慢成为大家讨论的对象之一,不是说此前https没有出现,只是这一决策让得开发者始料未及,博主在15年的时候就做过https的接口,深知此坑之深,原因就是自身对这方面知识不了解加上网上的资料少,除此外还有博客不知对错就互相转载,导致当时网上几乎找不到能用的代码,这一点,博主说的毫不夸张. 鉴于此,博主一直想填一下这个坑,多增加一些正确的代码,来供广大开发者使用,后来一直被搁置,经过尝试后,博主现将整理好的代码发布在