前言
最近爱上了研究第三方框架,感觉需要用框架来虐虐自己以涨涨姿势,导致最近老是感觉脑子不够用,哈哈哈,不过每次从懵懂到烧脑直到最后的理解,让人又爱又恨,这个过程也被网上的一些文章所误导,所以希望写下此文章帮助小伙伴更容易地去理解,哈哈哈!!
简述
HTTPS(全称:Hypertext Transfer Protocol over Secure Socket Layer
),是以安全为目标的HTTP通道,简单讲是HTTP的安全版。 即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL。
- HTTPS的优点:
- 安全性:内容加密建立一个信息安全通道,来保证数据传输的安全;
- 真实性:身份认证确认网站的真实性;
- 防篡改性:数据完整性防止内容被第三方冒充或者篡改;
- HTTPS的缺点:
- HTTPS的处理比HTTP慢;
- 申购CA证书需要支付必要的费用;
- HTTPS禁用了缓存;
概念预热
- 数字摘要
将需要传送的明文通过hash函数算法加密成“摘要”成一串固定长度(128位)的密文。它有固定的长度,而且不同的明文摘要成不同的密文,相同的明文摘要的密文结果相同。数字摘要等会再下面的验证数据完整性起到关键作用,可防止数据在传输过程中被篡改!
- 数字签名
数字签名技术就是对“非对称密钥加解密”和“数字摘要“两项技术的实践应用。发送方通过自己的私钥对已进行hash加密的报文即数字摘要1进行加密,再把加密的数据摘要1和报文一起发送给接收方,接收方拿到发送的数据,通过发送方的公钥进行解密,获取到数字摘要1和相应的报文,此时,通过双方之前约定好的hash函数,接收方对报文进行hash加密成新的数字摘要2,比较数字摘要1和数字摘要2是否相等,相等则数据是完整地,未被篡改;反之,则说明在传输的过程中被篡改过!
数字签名大致流程:
明文 ----> hash运算 ----> 摘要 ----> 私钥加密 ----> 数字签名
- HTTPS证书
1、为什么需要HTTPS证书?
通过工具,我们可以很容易的创建公钥和私钥,那么黑客也是可以创建的,为了确保公钥在传输过程的安全性,我们需要第三方的安全认证机构来充当中间人,帮我们生出数字证书,好让公钥能准确无误地发送给客户端。
2、HTTPS证书的颁发过程
用户首先产生自己的公钥和私钥,并将公共密钥及部分个人身份信息传送给认证中心。认证中心在核实身份后,将执行一些必要的步骤,以确信请求确实由用户发送而来,然后,认证中心将发给用户一个数字证书,该证书内包含用户的个人信息和他的公钥信息,同时还附有认证中心的签名信息。用户就可以使用自己的数字证书进行相关的各种活动。假设在此过程中公钥被篡改或更换,则在权威机构CA( Certificate Authority)中认证时将会出问题!
3、HTTPS证书包含内容
- 公钥:给发送方加密的公钥,用于发送方在握手过程中加密报文中的随机数,随机数在后续生成对称秘钥中使用;
- 所有者:说明证书是属于谁的,就像户口本上的姓名和身份证号,来证明这个户口本是你的;
- 证书发布机构:看看你的户口本上有没有某某公安局的字样?
- 证书有效时间:这个和咱们身份证有效期是一个意思。
- ......
HTTPS的工作模式
- 客户端首次发出请求
客户端发送服务器提供的信息:
- 支持的协议版本,比如TLS 1.0版
- 客户端生成第一个随机数,稍后用于生成”对话密钥”
- 支持的加密算法,比如RSA公钥加密
- 支持的压缩方法
- 报文信息
- 服务端首次回应
服务端在接收到客户端的client_hello之后,服务端需要确定加密协议的版本,以及加密的算法,然后也生成一个随机数, 以及将自己的证书发送给客户端,这里的随机数是整个过程的第二个随机数。通过上图我们假设当前用户正在叫外卖,此时如果客户端为了获取到外卖服务器的公钥,但是呢,我们又不能让公钥直接进行传输,这样很容易被黑客截取。所以我们使用了数字证书的形式来实现。
- 当我们用浏览器或者客户端时,其实系统已经帮我们内置了CA权威机构证书的公钥;
- 当我们访问请求外卖网站时,外卖服务器将会去申请认证证书。这个过程是这样的,服务器将外卖网站生成的公钥及信息发送到CA权威机构进行认证,机构会对服务器请求的公钥及信息进行认证检测,确认是外卖网站的真实信息时,则用权威机构的私钥对服务器发来的公钥及信息进行签名加密,生成认证证书,发送给服务器,若在此过程中公钥被篡改过,则认证检测将不会通过!
服务端发送客户端提供的信息:
- 协议的版本
- 加密算法
- 第二个随机数
- 服务器证书
- 报文信息
- 客户端再次回应
客户端获取到服务器发来的信息,首先会用内置的机构证书公钥对证书进行解密,若解密成功,则取出证书中外卖网站的公钥和用hash签名加密的报文信息hash后的值1。此时,客户端会将收到的报文信息也用相同的hash算法进去计算得到的hash值2与hash值1进行比较,若结果相等,则证明数据是完整的!用获取到的公钥对第三个随机数进行加密,并发送给服务器!
- 服务器再次响应
服务器对客户端发送过来的数据用自身的私钥进行解密得到了第三个随机数,通过之前获得的两个随机数一起,总共将三个随机数,并根据妥协好的对称加密算法,一起生成加密秘钥,以后就用这个秘钥进行数据传输过程的加密!服务器通过使用秘钥加密给客户端发送信息,以验证之前通过握手建立起来的加解密通道是否成功。
- 握手成功后进行通信
确定秘钥之后,服务器与客户端之间就会通过商定的秘钥 Session Secret
加密消息进行通讯了,整个握手过程也就基本完成了。
- iOS实现HTTPS请求认证授权
- (void)viewDidLoad {
[super viewDidLoad];
NSURLSessionConfiguration* configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
NSURLSession* session = [NSURLSession sessionWithConfiguration:configuration delegate:self delegateQueue:nil];
NSURL* url = [NSURL URLWithString:@"https://cdn.tutsplus.com/mobile/uploads/2013/12/sample.jpg"];
NSURLSessionDownloadTask* dataTask = [session downloadTaskWithURL:url];
[dataTask resume];
}
- (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition disposition, NSURLCredential *credential))completionHandler {
// 默认处理模式
NSURLSessionAuthChallengeDisposition disposition = NSURLSessionAuthChallengePerformDefaultHandling;
__block NSURLCredential *credential = nil;
if ([challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust]) { // 不允许授权访问时credential传NULL
if (!(self.options & SDWebImageDownloaderAllowInvalidSSLCertificates)) {
disposition = NSURLSessionAuthChallengePerformDefaultHandling;
} else { // 传credential证书信任 允许失效证书 访问
credential = [NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust];
disposition = NSURLSessionAuthChallengeUseCredential;
}
} else {
if (challenge.previousFailureCount == 0) {
if (self.credential) { // 传credential允许 自定义证书 访问
credential = self.credential;
disposition = NSURLSessionAuthChallengeUseCredential;
} else { // 不允许授权访问时credential传NULL
disposition = NSURLSessionAuthChallengeCancelAuthenticationChallenge;
}
} else {
disposition = NSURLSessionAuthChallengeCancelAuthenticationChallenge;
}
}
if (completionHandler) {
completionHandler(disposition, credential);
}
}
- 当允许授权访问时,我们生成一个证书和一个认证处理模式回调给服务器认证处理;
- 当不允许授权访问时,可设置处理模式为取消或拒绝,回调时也不上传认证证书即可;
总结
- 相比 HTTP 协议,HTTPS 协议增加了很多握手、加密解密等流程,虽然过程很复杂,但其可以保证数据传输的安全;
- 当然,安全复杂的加密也使得HTTPS处理效率相对较慢;
- 申购证书这一块是整个加密过程中最复杂难懂的模块;