免责声明:本文内容来自互联网,用途仅为我的总结参考,若有雷同你来打我啊?html
又到了喜闻乐见的写博客时间了,今天的主角是喧嚣已久的https,知其然要知其因此然,因此先捋一下他究竟是什么json
1,什么是SSL/TLS?跟HTTP和HTTPS有什么关系?安全
2,之前的HTTP不是也能用吗?为何要用SSL/TLS,闲得慌?!Apple是否是又在反人类?服务器
3,如何适配?---弱弱地问下:加班要多久?session
//------------------app
答案:ui
1,HTTP+SSL/TLS+TCP = HTTPS (TLS 是 SSL 新的别称)加密
打个比方:若是原来的 HTTP 是塑料水管,容易被戳破;那么现在新设计的 HTTPS 就像是在原有的塑料水管以外,再包一层金属水管。一来,原有的塑料水管照样运行;二来,用金属加固了以后,不容易被戳破。spa
这里用两张图来介绍二者的区别:.net
2,不使用SSL/TLS的HTTP通讯,就是不加密的通讯!
全部信息明文传播,带来了三大风险:
窃听风险(eavesdropping):第三方能够获知通讯内容。
篡改风险(tampering):第三方能够修改通讯内容。
冒充风险(pretending):第三方能够冒充他人身份参与通讯。
SSL/TLS协议是为了解决这三大风险而设计的,但愿达到:
全部信息都是加密传播,第三方没法窃听。
具备校验机制,一旦被篡改,通讯双方会马上发现。
配备身份证书,防止身份被冒充
3,由于每次通信都用到公钥和密钥,因此证书是必不可少的,通常证书由后台分派给iOS和Android,后台的证书能够自签名(方法:https://www.oschina.net/question/2308078_230138),也能够去各大认证机构购买
(1),当后台派发证书给你的时候,到手的证书多是.crt格式的,这个时候须要把.crt格式的证书转换成.cer(操做方法:进到证书路径,执行下面语句
// openssl x509 -in 你的证书.crt -out 你的证书.cer -outform der
这样你就能够获得cer类型的证书了。双击,导入电脑。)
(2),直接把转换好的cer文件拖动到工程中
(3),infoplist加入如下:<key>NSAppTransportSecurity</key> <dict> <key>NSAllowsArbitraryLoads</key> <true/> </dict>
(4),设置afnetWorking的manager的配置属性便可正常请求:
AFHTTPSessionManager *mgr = [AFHTTPSessionManager manager];
mgr.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json",
@"text/html",
@"image/jpeg",
@"image/png",
@"application/octet-stream",
@"text/json",
nil];
// 设置添加的代码
NSString * cerPath = [[NSBundle mainBundle] pathForResource:@"你拉到工程的cer证书的名称" ofType:@"cer"];
NSData * cerData = [NSData dataWithContentsOfFile:cerPath];
mgr.securityPolicy.pinnedCertificates = [[NSArray alloc] initWithObjects:cerData, nil];
// 客户端是否信任非法证书
mgr.securityPolicy.allowInvalidCertificates = YES;
// 是否在证书域字段中验证域名
[mgr.securityPolicy setValidatesDomainName:NO];
-----------------------附上不用afn的童鞋的福利,原生OC代码配置:
- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition disposition, NSURLCredential * __nullable credential))completionHandler { // 判断是不是信任服务器证书 if(challenge.protectionSpace.authenticationMethod == NSURLAuthenticationMethodServerTrust) { // 告诉服务器,客户端信任证书 // 建立凭据对象 NSURLCredential *credntial = [NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust]; // 经过completionHandler告诉服务器信任证书 completionHandler(NSURLSessionAuthChallengeUseCredential,credntial); } NSLog(@"protectionSpace = %@",challenge.protectionSpace); }