一、HTTPS简介
HTTPS其实是有两部分组成:HTTP + SSL / TLS,也就是在HTTP上又加了一层处理加密信息的模块。服务端和客户端的信息传输都会通过TLS进行加密,所以传输的数据都是加密后的数据。
SSL:Secure Socket Layer,安全套接字层。用以保障在Internet上数据传输之安全,利用数据加密(Encryption)技术,可确保数据在网络上之传输过程中不会被截取。
TLS:(Transport Layer Security,传输层安全协议),用于两个应用程序之间提供保密性和数据完整性。
SSL/TLS协议提供的服务主要有:
1. 认证用户和服务器,确保数据发送到正确的客户机和服务器;
2. 加密数据以防止数据中途被窃取;
3. 维护数据的完整性,确保数据在传输过程中不被改变。
二、HTTPS和HTTP的区别
1)https协议需要到CA申请证书,一般免费证书很少,需要交费。
2)http是超文本传输协议,信息是明文传输,https则是具有安全性的SSL加密传输协议。
3)http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
4)http的连接很简单,是无状态的;HTTPS协议是由SSL(Secure Sockets Layer)+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。
http为什么不安全
http协议没有任何的加密以及身份验证的机制,非常容易遭遇窃听、劫持、篡改,因此会造成个人隐私泄露,恶意的流量劫持等严重的安全问题。
就像寄信一样,我给你寄信,中间可能会经过很多的邮递员,他们可以拆开信读取里面的内容,因为是明文的。如果你的信里涉及到了你们银行账号等敏感信息,可能就会被窃取。除此之外,邮递员们还可以给你伪造信的内容,导致你遭到欺骗。
三、HTTPS的加密原理
首先服务器端用非对称加密(RSA)产生公钥和私钥。然后把公钥发给客 户端,路径或许有人会截取,但是没有用,因为用公钥加密的文件只有私钥可以解密,而私钥永远都不会离开服务器的。当公钥到达客户端之后,客户端会用对称加密产生一个秘钥并且用公钥来加密发送给服务器端,这个秘钥就是以后用来通信的钥匙。这样服务器端收到公钥加密的秘钥时就可以用私钥来解公钥从而获得秘钥。这样的话客户端和服务器端都获得了秘钥,信息交流相对是安全的。
四、HTTPS请求数据Demo
1.不用第三方的代码如下:
/**
用NSURLSession请求https的数据
*/
- (void)NSURLSessionHttps
{
//该地址是自制的证书,用自制证书需要在plist添加ATS
NSString *urlString = @"https://kyfw.12306.cn/otn/leftTicket/init";
NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration];
NSURLSession *session = [NSURLSession sessionWithConfiguration:config delegate:self delegateQueue:[NSOperationQueue mainQueue]];
NSURLSessionDataTask *task = [session dataTaskWithURL:[NSURL URLWithString:urlString] completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
NSLog(@"请求完成:%@",[[NSString alloc] initWithData:data encoding:4]);
}];
[task resume];
}
/**
收到了https,该方法就会触发
@param session <#session description#>
@param challenge <#challenge description#>
@param completionHandler <#completionHandler description#>
*/
- (void)URLSession:(NSURLSession *)session didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge
completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition disposition, NSURLCredential * _Nullable credential))completionHandler
{
//先确保服务器证书的可信任
//protectionSpace 受保护的空间
if (challenge.protectionSpace.authenticationMethod == NSURLAuthenticationMethodServerTrust)
{
NSURLCredential *credential = [[NSURLCredential alloc] initWithTrust:challenge.protectionSpace.serverTrust];
/*
NSURLSessionAuthChallengeUseCredential 安装证书
NSURLSessionAuthChallengePerformDefaultHandling 默认方式,忽略证书
NSURLSessionAuthChallengeCancelAuthenticationChallenge 请求被取消,忽略证书
NSURLSessionAuthChallengeRejectProtectionSpace 拒绝,忽略证书
*/
//安装证书
completionHandler(NSURLSessionAuthChallengeUseCredential, credential);
}
}
2.用AFNetworking的代码如下:
/**
用AFNetWorking请求https的数据
*/
- (void)AFNetWorkingHttps
{
AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
//是否允许是无效的
manager.securityPolicy.allowInvalidCertificates = YES;
//不允许验证域名
manager.securityPolicy.validatesDomainName = NO;
manager.responseSerializer = [AFHTTPResponseSerializer serializer];
[manager GET:@"https://kyfw.12306.cn/otn/leftTicket/init" parameters:nil progress:nil success:^(NSURLSessionDataTask * _Nonnull task, id _Nullable responseObject) {
NSLog(@"请求完成:%@",[[NSString alloc] initWithData:responseObject encoding:4]);
} failure:^(NSURLSessionDataTask * _Nullable task, NSError * _Nonnull error) {
NSLog(@"请求失败:%@",[error description]);
}];
}