<强> IOS开发支持https请求以及ssl证书配置详解强>
<强>前言:强>
众所周知,苹果有言,从2017年开始,将屏蔽http的资源,强推https
楼主正好近日将http转为https,给还没动手的朋友分享一二
<强>一、证书准备强>
1,证书转换
在服务器人员,给你发送的crt证书后,进到证书路径,执行下面语句
//openssl x509——你的证书。crt治疗你的证书。cer -outform der
这样你就可以得到cer类型的证书了。双击,导入电脑。
2,证书放入工程
1,可以直接把转换好的cer文件拖动到工程中。
2,可以在钥匙串内,找到你导入的证书,单击右键,导出项目,就可以导出c文件的证书了
<强>二、代码准备强>
& lt; key> NSAppTransportSecurity & lt; dict> & lt; key> NSAllowsArbitraryLoads & lt;真实/比; & lt;/dict> >之前1.1 NSURLConnection设置支持https。
在2015年iOS9的更新中,NSURLConnection被废弃由NSURLSession取代,所以本身是不建议大家继续用这个类做网络请求的(同样也有AFNetWorking 2. x版本),但是考虑到一些旧程序,也不能说改就改,说替换就替换的,所以还是需要普及一下,如果用到了NSURLConnection你需要怎么做。
代码如下:
- (void)连接:(NSURLConnection *)连接willSendRequestForAuthenticationChallenge: {(NSURLAuthenticationChallenge *)挑战 如果(challenge.protectionSpace。authenticationMethod==NSURLAuthenticationMethodServerTrust) {//告诉服务器,客户端信任证书//创建凭据对象 NSURLCredential * credntial=[NSURLCredential credentialForTrust challenge.protectionSpace.serverTrust):;//告诉服务器信任证书 (挑战。发送方useCredential: credntial forAuthenticationChallenge:挑战); } } >之前你只需要简单的,添加上如上的代理方法,就可以在不影响你原有请求的基础上,增加了https请求的支持了。
<强> 1.2 NSURLSession设置支持https。强>
现在推荐使用的就是NSURLSession来处理相关的网络请求了,如果使用系统自带的类,可以参考如下代码:
- (void) URLSession: (NSURLSession *)会话任务:(NSURLSessionTask *)任务didReceiveChallenge: completionHandler (NSURLAuthenticationChallenge *)挑战:(空白(^)(NSURLSessionAuthChallengeDisposition性格,NSURLCredential * __nullable凭据)completionHandler {//判断是否是信任服务器证书 如果(challenge.protectionSpace。authenticationMethod==NSURLAuthenticationMethodServerTrust) {//告诉服务器,客户端信任证书//创建凭据对象 NSURLCredential * credntial=[NSURLCredential credentialForTrust challenge.protectionSpace.serverTrust):;//通过completionHandler告诉服务器信任证书 completionHandler (NSURLSessionAuthChallengeUseCredential credntial); } NSLog (@“protectionSpace=% @”challenge.protectionSpace); } >之前<强> 2。使用AFNetWorking发送网络请求篇强>
AFNetworking是一个讨人喜欢的网络库,适用于iOS以及Mac OS x它构建于在NSURLConnection, NSOperation,以及其他熟悉的基础技术之上。它拥有良好的架构,丰富的api,以及模块化构建方式,使得使用起来非常轻松. .
2.1 AFNetWorking 2. x版本
考虑到这个版本,我们还可以使用AFHTTPRequestOperationManager这个类来处理网络请求,所以我们要做的就是给这个类,设置一些参数,让它可以支持https的请求,代码如下:
支持https(校验证书,不可以抓包):
//1 .初始化单例类 AFHTTPRequestOperationManager *经理=(AFHTTPRequestOperationManager经理); mgr.securityPolicy。SSLPinningMode=AFSSLPinningModeCertificate;//2 .设置证书模式 NSString * cerPath=[[NSBundle mainBundle] pathForResource: @减低:“xxx”@“陶瓷”); NSData * cerData=https://www.yisu.com/zixun/[NSData dataWithContentsOfFile cerPath):; mgr.securityPolicy。pinnedCertificates=[[NSArray alloc] initWithObjects: cerData, nil);//客户端是否信任非法证书 mgr.securityPolicy。allowInvalidCertificates=是的;//是否在证书域字段中验证域名 (经理securityPolicy setValidatesDomainName:没有); >之前支持https(不校验证书,可以抓包查看):
//1 .初始化单例类 AFHTTPRequestOperationManager *经理=(AFHTTPRequestOperationManager经理); mgr.securityPolicy。SSLPinningMode=AFSSLPinningModeCertificate;//2 .设置非校验证书模式 经理securityPolicy=[AFSecurityPolicy policyWithPinningMode AFSSLPinningModeNone):; mgr.securityPolicy。allowInvalidCertificates=是的; (经理securityPolicy setValidatesDomainName:没有);IOS开发支持https请求以及ssl证书配置详解