HTTPS
HTTPS: Hyper Text Transfer Protocol over Secure Socket Layer
是以安全为目标的HTTP通道,简单讲是HTTP的安全版.即HTTP下加入SSL层,HTTPS的安全基础是SSL.SSL:Secure Sockets Layer,表示安全套接层.
TLS:Transport Layer Security,是SSL的继任者,表示传输层安全.
SSL与TLS是为网络通信提供安全及数据完整性的一种安全协议。TLS与SSL在传输层对网络连接进行加密.
当客户端给服务器发送请求时, 服务器中有一对钥匙(公钥,私钥). 服务器会返回给客户端一个公钥,并把两者的传输通道变为受保护空间(安全证书).
此时 客户端拥有公钥,服务器拥有私钥. 当服务器返回数据给客户端时,数据是使用私钥加密过的. 客户端需要使用 公钥解密. 客户端发请求也是通过公钥加密. 服务器使用私钥来解密.(从某种意义上来说. 安全证书 就是公钥)
HTTPS和HTTP区别
超文本传输协议HTTP被用于在web浏览器和网站服务器之间传递信息。HTTP协议以明文方式发送内容,不提供任何方式的数据加密,如果攻击者截取了web浏览器和网站服务器之间的传输报文,就可以直接读懂其中的信息,因此HTTP协议不适合传输一些敏感的信息,例如银行卡号。密码等。
为了解决HTTP这一缺陷,需要使用另一种协议:
安全套接字层超文本传输协议HTTPS。为了数据的传输安全,HTTPS在http的基础上加入了SSL协议,SSL依靠证书来验证服务器的身份,并为浏览器和服务器之间的通信加密。
HTTPS和HTTP的区别主要为一下四点:
一、https协议需要到ca申请证书,一般免费证书很少,需要交费申请。
二、http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议。
三、http和https使用的是完全不同的链接方式,用的端口也不一样,前者是80,后者是443.
四、http的链接很简单,是无状态的,https协议是有SSL+HTTP协议构建的可进行加密的传输、身份认证的网络协议,比http协议安全。
HTTPS在 iOS中的使用
1.NSURLSession 实现 HTTPS 访问
#import "ViewController.h"
@interface ViewController () <NSURLSessionDataDelegate>
@property (nonatomic, strong) NSURLSession *session;
@end
@implementation ViewController
- (NSURLSession *)session {
if (_session == nil) {
NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration];
_session = [NSURLSession sessionWithConfiguration:config delegate:self delegateQueue:nil];
}
return _session;
}
- (void)viewDidLoad {
[super viewDidLoad];
}
- (void)viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
[self.session finishTasksAndInvalidate];
}
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
[self HTTPSDemo];
}
- (void)HTTPSDemo {
// URL
NSURL *URL = [NSURL URLWithString:@"https://mail.itcast.cn"];
// 自定义session发起任务 (因为我们要在代理方法里面挑战服务器)
NSURLSessionDataTask *dataTask = [self.session dataTaskWithURL:URL
completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
// 处理响应
if (error == nil && data != nil) {
// 反序列化
NSString *html = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
NSLog(@"%@",html);
}else {
NSLog(@"%@",error);
}
}];
// 启动任务
[dataTask resume];
}
#pragma NSURLSessionDataDelegate
- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task
didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge
completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition disposition, NSURLCredential * __nullable credential))completionHandler {
// 1.判断接收服务器挑战的方法是否是信任证书
if ([challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust]) {
// 2.如果你信任证书,就从受保护空间里面拿出证书,回调给服务器,告诉服务,我信任你,你给我发送数据吧.
NSURLCredential *credential = [NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust];
// 3.把证书回调出去
completionHandler(NSURLSessionAuthChallengeUseCredential,credential);
}
}
@end
2.AFNetworking之HTTPS请求
- (void)loadData {
// 创建网络请求mansger
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
// 使AFN支持HTTPS请求 : 2.5.4之前
// manager.securityPolicy.allowInvalidCertificates = YES;
// 使AFN支持HTTPS请求 : 2.6.1以后
manager.securityPolicy.validatesDomainName = NO;
// 修改AFN默认支持接收的文本类型
manager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json", @"text/json", @"text/javascript", @"text/html" ,nil];
// 修改AFN默认处理数据的方式 : 设置成只返回原始的二进制数据,程序猿自己反序列化
manager.responseSerializer = [AFHTTPResponseSerializer serializer];
// 网络请求地址
NSString *URLStr = @"https://mail.itcast.cn";
[manager GET:URLStr parameters:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
// NSLog(@"%@ %@",[responseObject class],responseObject);
// 反序列化
NSString *html = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding];
NSLog(@"%@",html);
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
NSLog(@"出错 %@",error);
}];
}
2.1 AFNetWorking 2.x版本
考虑到这个版本,我们还可以使用AFHTTPRequestOperationManager这个类来处理网络请求。所以我们要做的就是给这个类,设置一些参数,让它可以支持https的请求,代码如下
支持https(校验证书,不可以抓包)
支持https(不校验证书,可以抓包查看):
2.2 AFNetWorking 3.x版本
支持https(校验证书,不可以抓包):
支持https(不校验证书,可以抓包查看):