大纲
image
一, 前言
今天又像打了鸡血一样, 想好好学习了. 正好看到一篇介绍 http 和 https 的文章, 想到以前面试的时候也被问过这个知识点以及 https 的加解密过程, 于是就想总结一下.
二, HTTP 和 HTTPS 发展
1. 什么是 HTTP?
http 的全称是 Hypertext Transfer Protocol Vertion (超文本传输协议), 是一个基于请求与响应, 无状态的, 应用层的协议, 常基于 TCP/IP 协议传输数据, 互联网上应用最为广泛的一种网络协议, 所有的 WWW 文件都必须遵守这个标准. 设计 HTTP 的初衷是为了提供一种发布和接收 html 页面的方法.
2. 什么是 HTTPS?
HTTPS 的全称是 Secure Hypertext Transfer Protocol(安全超文本传输协议), 是在 http 协议基础上增加了 SSL 加密传送信息的协议. HTTPS 协议经由 HTTP 进行通信, 利用 SSL/TLS 建立全信道, 加密数据包. HTTPS 使用的主要目的是提供对网站服务器的身份认证, 同时保护交换数据的隐私与完整性.
PS:TLS 是传输层加密协议, 前身是 SSL 协议, 由网景公司 1995 年发布, 有时候两者不区分.
三, HTTP VS HTTPS
1.HTTP 特点
1. 无状态: 协议对客户端没有状态存储, 对事物处理没有 "记忆" 能力, 比如访问一个网站需要反复进行登录操作
2. 无连接: HTTP/1.1 之前, 由于无状态特点, 每次请求需要通过 TCP 三次握手四次挥手, 和服务器重新建立连接. 比如某个客户机在短时间多次请求同一个资源, 服务器并不能区别是否已经响应过用户的请求, 所以每次需要重新响应请求, 需要耗费不必要的时间和流量.
3. 简单快速: 客户向服务器请求服务时, 只需传送请求方法和路径. 请求方法常用的有 GET,HEAD,POST. 每种方法规定了客户与服务器联系的类型不同. 由于 HTTP 协议简单, 使得 HTTP 服务器的程序规模小, 因而通信速度很快.
4. 灵活: HTTP 允许传输任意类型的数据对象. 正在传输的类型由 Content-Type 加以标记.
5. 通信使用明文, 请求和响应不会对通信方进行确认, 无法保护数据的完整性
针对无状态的一些解决策略:
场景: 逛电商商场用户需要使用的时间比较长, 需要对用户一段时间的 HTTP 通信状态进行保存, 比如执行一次登陆操作, 在 30 分钟内所有的请求都不需要再次登陆.
1. 通过 Cookie/Session 技术
2.HTTP/1.1 持久连接 (HTTP keep-alive) 方法, 只要任意一端没有明确提出断开连接, 则保持 TCP 连接状态, 在请求首部字段中的 Connection: keep-alive 即为表明使用了持久连接
2.HTTPS 特点
基于 HTTP 协议, 通过 SSL 或 TLS 提供加密处理数据, 验证对方身份以及数据完整性保护. 除了数据不是明文传输外, HTTPS 还有如下特点:
1. 内容加密: 采用混合加密技术, 中间者无法直接查看明文内容
2. 验证身份: 通过证书认证客户端访问的是自己的服务器
3. 保护数据完整性: 防止传输的内容被中间人冒充或者篡改
混合加密: 结合非对称加密和对称加密技术. 客户端使用对称加密生成密钥对传输数据进行加密, 然后使用非对称加密的公钥再对秘钥进行加密, 所以网络上传输的数据是被秘钥加密的密文和用公钥加密后的秘密秘钥, 因此即使被黑客截取, 由于没有私钥, 无法获取到加密明文的秘钥, 便无法获取到明文数据.
数字摘要: 通过单向 hash 函数对原文进行哈希, 将需加密的明文 "摘要" 成一串固定长度 (如 128bit) 的密文, 不同的明文摘要成的密文其结果总是不相同, 同样的明文其摘要必定一致, 并且即使知道了摘要也不能反推出明文.
数字签名技术: 数字签名建立在公钥加密体制基础上, 是公钥加密技术的另一类应用. 它把公钥加密技术和数字摘要结合起来, 形成了实用的数字签名技术.
收方能够证实发送方的真实身份;
发送方事后不能否认所发送过的报文;
收方或非法者不能伪造, 篡改报文.
image
非对称加密过程需要用到公钥进行加密, 那么公钥从何而来? 其实公钥就被包含在数字证书中, 数字证书通常来说是由受信任的数字证书颁发机构 CA, 在验证服务器身份后颁发, 证书中包含了一个密钥对 (公钥和私钥) 和所有者识别信息. 数字证书被放到服务端, 具有服务器身份验证和数据传输加密功能.
总结一下, HTTPS 和 HTTP 的区别:
1.https 协议需要到 ca 申请证书, 一般免费证书很少, 需要交费.
2.http 是超文本传输协议, 信息是明文传输, https 则是具有安全性的由 ssl 加密的传输协议.
3.http 和 https 使用的端口不一样, 前者是 80, 后者是 443.
4.http 的连接很简单, 是无状态的.
5.HTTPS 协议是由 SSL+HTTP 协议构建的可进行加密传输, 身份认证的网络协议, 要比 http 协议安全.
四, HTTP 工作流程
image
客户端输入 URL 回车, DNS 解析域名得到服务器的 IP 地址, 服务器在 80 端口监听客户端请求, 端口通过 TCP/IP 协议 (可以通过 Socket 实现) 建立连接. HTTP 属于 TCP/IP 模型中的应用层协议, 所以通信的过程其实是对应数据的入栈和出栈.
image
报文从应用层传送到传输层, 传输层通过 TCP 三次握手和服务器建立连接, 四次挥手释放连接.
image
为什么需要三次握手呢? 为了防止已失效的连接请求报文段突然又传送到了服务端, 因而产生错误.
比如: client 发出的第一个连接请求报文段并没有丢失, 而是在某个网络结点长时间的滞留了, 以致延误到连接释放以后的某个时间才到达 server. 本来这是一个早已失效的报文段, 但是 server 收到此失效的连接请求报文段后, 就误认为是 client 再次发出的一个新的连接请求, 于是就向 client 发出确认报文段, 同意建立连接. 假设不采用 "三次握手", 那么只要 server 发出确认, 新的连接就建立了, 由于 client 并没有发出建立连接的请求, 因此不会理睬 server 的确认, 也不会向 server 发送数据, 但 server 却以为新的运输连接已经建立, 并一直等待 client 发来数据. 所以没有采用 "三次握手", 这种情况下 server 的很多资源就白白浪费掉了.
image
为什么需要四次挥手呢? TCP 是全双工模式, 当 client 发出 FIN 报文段时, 只是表示 client 已经没有数据要发送了, client 告诉 server, 它的数据已经全部发送完毕了; 但是, 这个时候 client 还是可以接受来 server 的数据; 当 server 返回 ACK 报文段时, 表示它已经知道 client 没有数据发送了, 但是 server 还是可以发送数据到 client 的; 当 server 也发送了 FIN 报文段时, 这个时候就表示 server 也没有数据要发送了, 就会告诉 client, 我也没有数据要发送了, 如果收到 client 确认报文段, 之后彼此就会愉快的中断这次 TCP 连接.
五, HTTPS 工作流程
image
1.client 向 server 发送请求 https://baidu.com, 然后连接到 server 的 443 端口.
2. 服务端必须要有一套数字证书, 可以自己制作, 也可以向组织申请. 区别就是自己颁发的证书需要客户端验证通过, 才可以继续访问, 而使用受信任的公司申请的证书则不会弹出提示页面, 这套证书其实就是一对公钥和私钥.
3. 传送证书, 这个证书其实就是公钥, 只是包含了很多信息, 如证书的颁发机构, 过期时间, 服务端的公钥, 第三方证书认证机构 (CA) 的签名, 服务端的域名信息等内容.
4. 客户端解析证书, 这部分工作是由客户端的 TLS 来完成的, 首先会验证公钥是否有效, 比如颁发机构, 过期时间等等, 如果发现异常, 则会弹出一个警告框, 提示证书存在问题. 如果证书没有问题, 那么就生成一个随机值(秘钥). 然后用证书对该随机值进行加密.
5. 传送加密信息, 这部分传送的是用证书加密后的秘钥, 目的就是让服务端得到这个秘钥, 以后客户端和服务端的通信就可以通过这个随机值来进行加密解密了.
6. 服务端加密信息, 服务端用私钥解密秘密秘钥, 得到了客户端传过来的私钥, 然后把内容通过该值进行对称加密.
7. 传输加密后的信息, 这部分信息是服务端用私钥加密后的信息, 可以在客户端被还原.
8. 客户端解密信息, 客户端用之前生成的私钥解密服务端传过来的信息, 于是获取了解密后的内容.
问题: 1. 怎么保证保证服务器给客户端下发的公钥是真正的公钥, 而不是中间人伪造的公钥呢?
image
image
2. 证书如何安全传输, 被掉包了怎么办?
数字证书包括了加密后服务器的公钥, 权威机构的信息, 服务器域名, 还有经过 CA 私钥签名之后的证书内容(经过先通过 Hash 函数计算得到证书数字摘要, 然后用权威机构私钥加密数字摘要得到数字签名), 签名计算方法以及证书对应的域名. 当客户端收到这个证书之后, 使用本地配置的权威机构的公钥对证书进行解密得到服务端的公钥和证书的数字签名, 数字签名经过 CA 公钥解密得到证书信息摘要, 然后根据证书上描述的计算证书的方法计算一下当前证书的信息摘要, 与收到的信息摘要作对比, 如果一样, 表示证书一定是服务器下发的, 没有被中间人篡改过. 因为中间人虽然有权威机构的公钥, 能够解析证书内容并篡改, 但是篡改完成之后中间人需要将证书重新加密, 但是中间人没有权威机构的私钥, 无法加密, 强行加密只会导致客户端无法解密, 如果中间人强行乱修改证书, 就会导致证书内容和证书签名不匹配.
那第三方攻击者能否让自己的证书显示出来的信息也是服务端呢?(伪装服务端一样的配置)显然这个是不行的, 因为当第三方攻击者去 CA 那边寻求认证的时候 CA 会要求其提供例如域名的 whois 信息, 域名管理邮箱等证明你是服务端域名的拥有者, 而第三方攻击者是无法提供这些信息所以他就是无法骗 CA 他拥有属于服务端的域名.
六, 运用与总结
安全性考虑:
1.HTTPS 协议的加密范围也比较有限, 在黑客攻击, 拒绝服务攻击, 服务器劫持等方面几乎起不到什么作用
2.SSL 证书的信用链体系并不安全, 特别是在某些国家可以控制 CA 根证书的情况下, 中间人攻击一样可行
中间人攻击 (MITM 攻击) 是指, 黑客拦截并篡改网络中的通信数据. 又分为被动 MITM 和主动 MITM, 被动 MITM 只窃取通信数据而不修改, 而主动 MITM 不但能窃取数据, 还会篡改通信数据. 最常见的中间人攻击常常发生在公共 Wi-Fi 或者公共路由上.
成本考虑:
1.SSL 证书需要购买申请, 功能越强大的证书费用越高
2.SSL 证书通常需要绑定 IP, 不能在同一 IP 上绑定多个域名, IPv4 资源不可能支撑这个消耗(SSL 有扩展可以部分解决这个问题, 但是比较麻烦, 而且要求浏览器, 操作系统支持, Windows XP 就不支持这个扩展, 考虑到 XP 的装机量, 这个特性几乎没用).
3. 根据 ACM CoNEXT 数据显示, 使用 HTTPS 协议会使页面的加载时间延长近 50%, 增加 10% 到 20% 的耗电.
4.HTTPS 连接缓存不如 HTTP 高效, 流量成本高.
5.HTTPS 连接服务器端资源占用高很多, 支持访客多的网站需要投入更大的成本.
6.HTTPS 协议握手阶段比较费时, 对网站的响应速度有影响, 影响用户体验. 比较好的方式是采用分而治之, 类似 12306 网站的主页使用 HTTP 协议, 有关于用户信息等方面使用 HTTPS.
来源: http://www.jianshu.com/p/2102b32e9237