苹果默认只允许https认证的网站,而且证书过期的网站也不允许访问,下面介绍一种通过代理来修改信任的方式让它能够跳过验证去访问.
1.建立一个下载任务
-(void)httpsWith12306
{
NSURL *url = [NSURL URLWithString:@"https://kyfw.12306.cn/otn/"];
// NSURL*url = [NSURL URLWithString:@"https://www.taobao.com/"];
NSURLSessionDataTask*dataTask = [self.seesion dataTaskWithURL:url completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
NSString*string = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"%@",string);
}];
[dataTask resume];
}
正常情况下是可以访问的,只要是 https的网站,这个拿的是12306举例.
它比较特殊,它的证书已经过期,苹果是不允许低版本证书的,所以运行的话控制台会打印出现这种结果:
网上查阅了一下,意思是说:
原因是苹果的官方资料说首先必须要基于TLS 1.2版本协议。然后证书的加密的算法还需要达到SHA256或者更高位的RSA密钥或ECC密钥,如果不符合,请求将被中断并返回nil.
这个时候要怎么去解决呢?
我们可以通过代理去解决这个问题:
1、先遵循代理
2、代理方法
- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition disposition, NSURLCredential * _Nullable credential))completionHandler
{
/*
1.challenge 包含了公钥等需要校验的信息
2.completionHandler 把验证的结果告诉外部的block
*/
//判断认证方式 验证是否需要信任服务器
if (challenge.protectionSpace.authenticationMethod == NSURLAuthenticationMethodServerTrust)
{
//当前选择信任服务器,并且12306的证书是自己生成的,没有在权威机构认证(CA)
//调用外部传来的completionHandler,2个参数,第一个参数枚举,包含了使用正是,取消,拒绝认证,第二个参数,日过选择信任,那么需要客户端生成一个NSURLCredential给block使用
//12306由于使用了过期的加密处理,所以apple还是认为不安全,SSL版本低,期待12306升级
NSURLCredential *credential = [NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust];
//高度外部校验的结果
completionHandler(0,credential);
}
}
这样的话再次运行就能通过了:
楼主在整理笔记,有不足之处请大家指出来,一起交流~.