如果项目使用的是AF做的网络请求,那么代码不用改
- 客户端向服务器发送网络请求,服务器收到之后,不会立马给你返回数据,因为没有安全协议
- 服务器向客户端下发安全证书
- 客户端拿到证书之后,要做一件事情,就是信任证书
- 证书中包含了非常重要的东西,就是公钥,那么信任证书的过程就是保存公钥,把公钥保存在本机
- 那么再次发送信息的时候,服务器就认为你是一个安全的客户端,那么服务器会建立一个安全通道
- 那么下次数据传输,就是通过公钥加密之后来进行传输的
- 服务器拿到通过公钥加密之后的通过私钥加密
- 客户端拿到服务器私钥加密之后的数据之后,通过公钥解密
作为开发者?
- 证书拿到手之后呢?选择信任还是不信任证书
- 密码还是做一次加密比较好,虽然这个密码是公钥
- 因为私钥在服务器上,那么私钥被泄露的可能性非常低
p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo; color: #d12f1b}p.p2 {margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo; color: #000000; min-height: 21.0px}p.p3 {margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo; color: #703daa}p.p4 {margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo; color: #ba2da2}p.p5 {margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo; color: #000000}p.p6 {margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo; color: #3e1e81}p.p7 {margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo; color: #008400}p.p8 {margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px 'PingFang SC'; color: #008400}p.p9 {margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo; color: #78492a}p.p10 {margin: 0.0px 0.0px 0.0px 0.0px; font: 18.0px Menlo; color: #008400; min-height: 21.0px}span.s1 {font-variant-ligatures: no-common-ligatures; color: #78492a}span.s2 {font-variant-ligatures: no-common-ligatures}span.s3 {font-variant-ligatures: no-common-ligatures; color: #ba2da2}span.s4 {font-variant-ligatures: no-common-ligatures; color: #000000}span.s5 {font-variant-ligatures: no-common-ligatures; color: #4f8187}span.s6 {font: 18.0px Menlo; font-variant-ligatures: no-common-ligatures; color: #000000}span.s7 {font: 18.0px Menlo; font-variant-ligatures: no-common-ligatures}span.s8 {font-variant-ligatures: no-common-ligatures; color: #1337ff}span.s9 {font-variant-ligatures: no-common-ligatures; color: #703daa}span.s10 {font-variant-ligatures: no-common-ligatures; color: #3e1e81}span.s11 {font-variant-ligatures: no-common-ligatures; color: #d12f1b}span.s12 {font: 18.0px 'PingFang SC'; font-variant-ligatures: no-common-ligatures}span.s13 {font: 18.0px 'PingFang SC'; font-variant-ligatures: no-common-ligatures; color: #d12f1b}
#import "ViewController.h"
@interface ViewController ()<NSURLSessionDelegate>
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
// 有的时候Https访问我们可以直接拿到数据
// 因为有的公司财大气粗 哥们有钱 可以认证
// 但是很多公司的Https访问你这样是拿不到数据的 需要自己手动去信任
// 认证过的HTTPS访问是强制安装证书的
// NSURLSessionDataTask *task = [[NSURLSession sharedSession] dataTaskWithURL:[NSURL URLWithString:@"https://www.apple.com"] completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
// NSLog(@"%@",[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);
// }];
NSURLSession *session = [NSURLSession sessionWithConfiguration:[NSURLSessionConfiguration defaultSessionConfiguration] delegate:self delegateQueue:[NSOperationQueue mainQueue]];
NSURLSessionDataTask *task = [session dataTaskWithURL:[NSURL URLWithString:@"https://www.apple.com"] completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
NSLog(@"%@",[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]);
}];
[task resume];
}
#pragma mark -- 协议
/**
证书回调
@param session session
@param challenge 询问客户端是否信任来自服务器的证书
属性:protectionSpace(受保护的空间)
Auth-Scheme:NSURLAuthenticationMethosServerTrust 服务器返回的授权模式,要求信任我们的服务器证书
@param completionHandler 成功的回调 通过这个代码块回调决定对我们证书的处理
NSURLSessionAuthChallengeDisposition
NSURLSessionAuthChallengeUseCredential 使用服务器发回证书(保存在challenge里面)
NSURLSessionAuthChallengePerformDefaultHandling 默认处理方式 会忽略证书
NSURLSessionAuthChallengeCancelAuthenticationChallenge 取消整个证书 忽略证书
NSURLSessionAuthChallengeRejectProtectionSpace 本次拒绝 下次再试
NSURLCredential 证书本身
*/
- (void)URLSession:(NSURLSession *)session didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition, NSURLCredential * _Nullable))completionHandler{
NSLog(@"%s",__FUNCTION__);
// 1.判断服务器的身份验证方法是否是服务器信任的证书
NSLog(@"%@",challenge.protectionSpace.authenticationMethod);
if ([challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust]) {
NSLog(@"是服务器信任");
// 2.获得证书
NSURLCredential *credential = [NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust];
// 3.对服务器的证书做出“处理”
completionHandler(NSURLSessionAuthChallengeUseCredential,credential);
}
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end```
- 发现已经可以拿到数据了
###那么如果我们的项目中没有使用系统的NSURLSession来自己写网络请求呢?
AFNetworking中已经帮我们做了,具体可以看AFNetworking源码中
AFHTTPSessionManager
网友评论