众所周知,苹果有言,从2017年开始,将屏蔽http的资源,强推https。
1 HTTPS以及SSL/TSL概念
SSL(Secure Sockets Layer, 安全套接字层),因为原先互联网上使用的HTTP协议是明文的,存在很多缺点,比如传输内容会被偷窥和篡改。SSL协议的作用就是在传输层对网络连接进行加密。
到了1999年,SSL 因为应用广泛,已经成为互联网上的事实标准。IETF就在那年把SSL标准化。标准化之后的名称改为 TLS(Transport Layer Security,传输层安全协议)。SSL与TLS可以视作同一个东西的不同阶段。
简单来说,HTTPS = HTTP + SSL/TLS, 也就是HTTP over SSL或HTTP over TLS,这是后面加S的由来。
HTTPS和HTTP异同:HTTP和HTTPS使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。HTTP的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比HTTP协议安全。
2 证书准备
- 证书转换
在服务器人员,给你发送的crt证书后,进到证书路径,执行下面语句。这样你就可以得到cer类型的证书了。双击,导入电脑。
// openssl x509 -in 你的证书.crt -out 你的证书.cer -outform der
- 证书放入工程
- 可以直接把转换好的cer文件拖动到工程中。
- 可以在钥匙串内,找到你导入的证书,单击右键,导出项目,就可以导出.cer文件的证书了
3 代码准备
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
3 AFNetWorking 3.x版本支持HTTPS
- 支持https(校验证书,不可以抓包):
// 1.初始化
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
manager.securityPolicy.SSLPinningMode = AFSSLPinningModeCertificate;
// 2.设置证书模式
NSString * cerPath = [[NSBundle mainBundle] pathForResource:@"xxx" ofType:@"cer"];
NSData * cerData = [NSData dataWithContentsOfFile:cerPath];
manager.securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate withPinnedCertificates:[[NSSet alloc] initWithObjects:cerData, nil]];
// 客户端是否信任非法证书
mgr.securityPolicy.allowInvalidCertificates = YES;
// 是否在证书域字段中验证域名
[mgr.securityPolicy setValidatesDomainName:NO];
- 支持https(不校验证书,可以抓包查看):
// 1.初始化
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
// 2.设置非校验证书模式
manager.securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeNone];
manager.securityPolicy.allowInvalidCertificates = YES;
[manager.securityPolicy setValidatesDomainName:NO];