目录
HTTP 和 HTTPS 简介
SSL 协议
SSL 协议的主要功能
SSL 协议加密数据的原理
用户和服务器的认证流程
TLS
参考
HTTP 和 HTTPS 简介
1. HTTP 协议为什么是不安全的
http 协议属于明文传输协议, 交互过程以及数据传输都没有进行加密, 通信双方也没有进行任何认证, 通信过程非常容易遭遇劫持, 监听, 篡改, 严重情况下, 会造成恶意的流量劫持等问题, 甚至造成个人隐私泄露 (比如银行卡卡号和密码泄露) 等严重的安全问题.
可以把 http 通信比喻成寄送信件一样, A 给 B 寄信, 信件在寄送过程中, 会经过很多的邮递员之手, 他们可以拆开信读取里面的内容 (因为 http 是明文传输的).A 的信件里面的任何内容(包括各类账号和密码) 都会被轻易窃取. 除此之外, 邮递员们还可以伪造或者修改信件的内容, 导致 B 接收到的信件内容是假的.
比如常见的, 在 http 通信过程中,"中间人" 将广告链接嵌入到服务器发给用户的 http 报文里, 导致用户界面出现很多不良链接; 或者是修改用户的请求头 URL, 导致用户的请求被劫持到另外一个网站, 用户的请求永远到不了真正的服务器. 这些都会导致用户得不到正确的服务, 甚至是损失惨重.
2. HTTPS 如何保证安全
我们都知道 HTTPS 是安全的 HTTP, 那么 HTTPS 是如何保证通信过程的安全的呢?
如果服务器给客户端的消息是密文的, 只有服务器和客户端才能读懂, 就可以保证数据的保密性. 同时, 在交换数据之前, 验证一下对方的合法身份, 就可以保证通信双方的安全.(和我们平时开发中 RSA 加签验签, 加密解密的过程比较像).HTTPS 就是利用了类似的原理来保证通信的安全性. 下面我们来看下具体的实现流程.
SSL 协议
HTTPS 实现安全通信的基础是 SSL 协议.
SSL:(Secure Socket Layer, 安全套接字层), 为 Netscape 所研发, 用以保障在 Internet 上数据传输之安全, 利用数据加密 (Encryption) 技术, 可确保数据在网络上之传输过程中不会被截取. 当前版本为 3.0. 它已被广泛地用于 web 浏览器与服务器之间的身份认证和加密数据传输.
SSL 协议位于 TCP/IP 协议与各种应用层协议之间, 为数据通讯提供安全支持. SSL 协议可分为两层: SSL 记录协议 (SSL Record Protocol): 它建立在可靠的传输协议(如 TCP) 之上, 为高层协议提供数据封装, 压缩, 加密等基本功能的支持. SSL 握手协议(SSL Handshake Protocol): 它建立在 SSL 记录协议之上, 用于在实际的数据传输开始前, 通讯双方进行身份认证, 协商加密算法, 交换加密密钥等.
SSL 协议的主要功能
认证用户和服务器, 确保数据发送到正确的客户机和服务器;
加密数据以防止数据中途被窃取;
维护数据的完整性, 确保数据在传输过程中不被改变.
下面我们就具体来看看 SSL 协议是怎么来实现上面三个功能的.
SSL 协议加密数据的原理
上面提到 SSL 协议会把通信的报文进行加密, 那么服务器把数据加密后, 客户端如何读懂这些数据呢? 服务器必须要把加密的密钥 (SSL 中报文加密使用了对称加密技术, 比如 DES,3DES,AES 等) 告诉客户端, 客户端才能利用对称密钥解开密文的内容. 但是, 服务器如果将这个对称密钥以明文的方式给客户端, 还是会被中间人截获, 中间人也会知道对称密钥, 依然无法保证通信的保密性. 但是, 如果服务器以密文的方式将对称密钥发给客户端, 客户端又如何解开这个密文, 得到其中的对称密钥呢? 下面请看 SSL 的骚操作.
用户和服务器的认证流程
中间人劫持
上面的加密流程似乎很完美, 也的确能将报文加密传输, 但是这种方式还是不能抵御 "中间人接触". 三次握手或者客户端发起 HTTP 请求过程中, 客户端的请求被中间人劫持, 那么中间人就可以伪装成 "假冒客户端" 和服务器通信:
中间人在收到服务器发送给客户端的公钥 (这里是 "正确的公钥") 后, 并没有发给客户端, 而是中间人将自己的公钥 (这里中间人也会有一对公钥和私钥, 这里称呼为 "伪造公钥") 发给客户端. 之后, 客户端把对称密钥用这个 "伪造公钥" 加密后, 发送过程中经过了中间人, 中间人就可以用自己的私钥解密数据并拿到对称密钥, 此时中间人再把对称密钥用 "正确的公钥" 加密发回给服务器. 此时, 客户端, 中间人, 服务器都拥有了一样的对称密钥, 后续客户端和服务器的所有加密数据, 中间人都可以通过对称密钥解密出来.
为了解决此问题, 我们引入了数字证书的概念. 服务器首先生成公私钥, 将公钥提供给相关机构(CA),CA 将公钥放入数字证书并将数字证书颁布给服务器, 此时服务器就不是简单的把公钥给客户端, 而是给客户端一个数字证书, 数字证书中加入了一些数字签名的机制, 保证了数字证书一定是服务器给客户端的. 中间人发送的伪造证书, 不能够获得 CA 的认证, 此时, 客户端和服务器就知道通信被劫持了.
CA 证书简介
数字证书就是通过数字签名实现的数字化的证书, 证书颁发时会包括证书的内容和证书的签名. 我们验证证书是否被篡改的方法是: 通过对证书的内容加签名, 然后将获得的签名和随证书一同发布的签名做对比, 如果两者一致那么证书没有被篡改.
数字证书也有很多的签发机构, 不同的签发机构签发的证书, 用途也是不一样的, 比如 iOS 开发中, 使用到的 ipa 文件签名证书, 需要到苹果申请. 而在 Web 访问中为了防止 Web 内容在网络中安全传输, 需要用到的 SSL 证书则需要向几家公认的机构签发. 这些签发机构统称为 CA(Certificate Authority).
数字证书的一般功能如下:
身份授权: 确保浏览器访问的网站是经过 CA 验证的可信任的网站.
分发公钥: 每个数字证书都包含了注册者生成的公钥(验证确保是合法的, 非伪造的公钥). 在 SSL 握手时会通过 certificate 消息传输给客户端.
验证证书合法性: 客户端接收到数字证书后, 会对证书合法性进行验证. 只有验证通过后的证书, 才能够进行后续通信过程.
TLS
TLS:(Transport Layer Security, 传输层安全协议), 用于两个应用程序之间提供保密性和数据完整性.
TLS 1.0 是 IETF(Internet Engineering Task Force,Internet 工程任务组)制定的一种新的协议, 它建立在 SSL 3.0 协议规范之上, 是 SSL 3.0 的后续版本, 可以理解为 SSL 3.1, 它是写入了 RFC http://tools.ietf.org/html/rfc5246 的. 该协议由两层组成: TLS 记录协议 (TLS Record) 和 TLS 握手协议 (TLS Handshake). 较低的层为 TLS 记录协议, 位于某个可靠的传输协议(例如 TCP) 上面.
我们可以简单地将 TLS 理解为 SSL 的加强版本.
参考
来源: https://www.cnblogs.com/54chensongxia/p/11772752.html