iOS http转换https网络访问的配置

本文介绍了在iOS应用中实现从http到https网络访问的配置过程,包括后台配置CA证书、前端证书导入及代码设置。遇到的问题包括TLS版本不达标和证书缺少域名信息,解决方案是后台升级TLS至1.2版本以及确保证书包含正确域名。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  1. 后台配置一个CA证书,包含域名信息等,保存后给前端使用,前端把cer文件拖入工程中。(必须保证前后端使用的证书一致)
  2. info.plist 文件中原本设置NSAllowsArbitraryLoads 设置为NO,NSAllowsArbitraryLoads若设置为YES,则表示禁用ATS功能,NO为开启 ATS功能,默认为NO
  3. 苹果硬性要求服务端的TLS版本必须>= 1.2
  4. 服务端配置OK后,前端把cer文件拖入工程中,copy ,然后进行代码设置

如下代码片段:
NSString *cerPath = [[NSBundle mainBundle] pathForResource:@”server” ofType:@”cer”];
NSData * certData =[NSData dataWithContentsOfFile:cerPath];
NSSet * certSet = [[NSSet alloc] initWithObjects:certData, nil];
AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate];
// 是否允许,NO– 不允许无效的证书(如果是自建证书相当于无效证书,此处若是自建证书,必须设置为YES)
[securityPolicy setAllowInvalidCertificates:YES];
// 设置证书
[securityPolicy setPinnedCertificates:certSet];
manager.securityPolicy = securityPolicy;
……..继续执行正常AF请求即可。

我们曾遇到的问题:
1.网络请求直接失败,错误信息如下:
Error Domain=NSURLErrorDomain Code=-1200 “发生了 SSL 错误,无法建立与该服务器的安全连接。” UserInfo={_kCFStreamErrorCodeKey=-9847, NSLocalizedRecoverySuggestion=您仍要连接此服务器吗?, NSUnderlyingError=0x7fbc09cd58c0 {Error Domain=kCFErrorDomainCFNetwork Code=-1200 “(null)” UserInfo={_kCFStreamPropertySSLClientCertificateState=0, _kCFNetworkCFStreamSSLErrorOriginalValue=-9847, _kCFStreamErrorDomainKey=3, _kCFStreamErrorCodeKey=-9847}}, NSLocalizedDescription=发生了 SSL 错误,无法建立与该服务器的安全连接。, NSErrorFailingURLKey=https://192.168.100.22:8011/interfaces/index.ashx?action=get_date_now, NSErrorFailingURLStringKey=https://192.168.100.22:8011/interfaces/index.ashx?action=get_date_now, _kCFStreamErrorDomainKey=3}

1.检查发现是服务端的TLS版本是1.1,没满足1.2版本配置
2.解决方式:后台升级TLS版本
3,运行程序,依然网络请求失败,但不是这个错误了,发现证书错误,制作证书的时候没加入域名地址。解决后网络正常。

iOS开发中,如果你需要在应用程序中加载网络图片,特别是从HTTP协议切换到HTTPS,可以利用URLSession或者第三方库如SDWebImage等来处理这种跨协议的转换。以下是一个基本的过程: 1. **NSURLSession**: 使用`NSURLSessionDataTask`发起网络请求时,你可以创建一个代理(如NSURLSessionDelegate),当接收到服务器返回的状态码为403 (禁止访问) 或者其他明确表示需要升级到安全协议的情况时,动态修改URL为 HTTPS。 ```swift let task = URLSession.shared.dataTask(with: URL(string: "http://example.com/image.jpg")!) { ... } task.resume() ``` 在完成数据任务的回调中检查响应并相应地更新URL: ```swift if let response = task.response as? HTTPURLResponse { if response.statusCode == 301 || response.statusCode == 302 && response.url?.scheme == "http" { let httpsUrl = response.url!.absoluteString.replacingOccurrences(of: "http:", with: "https:") task.cancel() return URLSession.shared.dataTask(with: URL(string: httpsUrl)) { ... }.resume() } } ``` 2. **SDWebImage**: 如果你在使用SDWebImage库,它通常会处理这类转换。只需在配置SDWebImageOptions时开启 `SDWebImageHandleRedirects`,SDWebImage就会自动处理从HTTPHTTPS的跳转。 ```swift let imageUrl = URL(string: "http://example.com/image.jpg") imageView.sd_setImage(with: imageUrl, options: .handleRedirects) ``` **相关问题--:** 1. SDWebImage库是什么时候引入对HTTPHTTPS自动转换的支持的? 2. 使用NSURLSession手动处理这种转换有哪些局限性? 3. 有没有其他的第三方库也支持这种特性?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值