一、基本概念

1. HTTP

HTTP—超文本传输协议(Hyper Text Transfer Protocol) 用于在Web浏览器和网站服务器之间传递信息,HTTP协议以明文方式发送内容,不提供任何方式的数据加密,如果攻击者截取了Web浏览器和网站服务器之间的传输报文,就可以直接读懂其中的信息,因此,HTTP协议不适合传输一些敏感信息,比如:信用卡号、密码等支付信息。

2. HTTPS

HTTPS(全称:Hyper Text Transfer Protocol over SecureSocket Layer),是以安全为目标的 HTTP 通道,在HTTP的基础上通过传输加密和身份认证保证了传输过程的安全性。
HTTPS协议的主要作用可以分为两种:一种是建立一个信息安全通道,来保证数据传输的安全;另一种就是确认网站的真实性。

3. SSL&TLS

SSL (Secure Sockets Layer 安全套接层协议), 位于可靠的面向连接的网络层协议和应用层协议之间的一种协议层。SSL通过互相认证、使用数字签名确保完整性、使用加密确保私密性,以实现客户端和服务器之间的安全通讯。该协议由两层组成:SSL记录协议和SSL握手协议。
TLS( Transport Layer Security 安全传输层协议) 用于两个应用程序之间提供保密性和数据完整性。该协议由两层组成:TLS记录协议和TLS握手协议。TLS是HTTP与TCP协议之间的一层,通常TLS发生在TCP三次握手之后,此时进行TLS四次握手,然后再进行HTTP通信。
TLS可以说是SSL的升级版。

二、HTTPS和HTTP的主要区别

  1. https协议需要到CA申请证书,一般免费证书较少,因而需要一定费用。
  2. http是超文本传输协议,信息是明文传输,https则是具有安全性的SSL/TLS加密传输协议。
  3. http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
  4. http的连接很简单,是无状态的;HTTPS协议是由SSL/TLS+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。

    三、客户端在使用HTTPS方式与Web服务器通信时的步骤

  5. 客户使用https的URL访问Web服务器,要求与Web服务器建立SSL连接。

  6. Web服务器收到客户端请求后,会将网站的证书信息(证书中包含公钥)传送一份给客户端。
  7. 客户端的浏览器与Web服务器开始协商SSL/TLS连接的安全等级,也就是信息加密的等级。
  8. 客户端的浏览器根据双方同意的安全等级,建立会话密钥,然后利用网站的公钥将会话密钥加密,并传送给网站。
  9. Web服务器利用自己的私钥解密出会话密钥。
  10. Web服务器利用会话密钥加密与客户端之间的通信。

20180920154005922.png
20180920154006193.png
尽管HTTPS并非绝对安全,掌握根证书的机构、掌握加密算法的组织同样可以进行中间人形式的攻击,但HTTPS仍是现行架构下最安全的解决方案,它大幅增加了中间人攻击的成本。

四、CA证书的申请及其使用过程

上面客户端使用HTTPS与服务器通信中使用到了CA认证,这里可能大家会问为什么不直接使用非对称加密的形式直接进行,首先这里先介绍下非对称加密。

1. 非对称加密和对称加密

非对称加密:客户端和服务端均拥有一个公有密匙和一个私有密匙。公有密匙可以对外暴露,而私有密匙只有自己可见。
使用公有密匙加密的消息,只有对应的私有密匙才能解开。反过来,使用私有密匙加密的消息,只有公有密匙才能解开。这样客户端在发送消息前,先用服务器的公钥对消息进行加密,服务器收到后再用自己的私匙进行解密。
例如:我们提交代码到github的时候,就可以使用SSH key:在本地生成私钥和公钥,私钥放在本 地 .ssh 目录中,公钥放在github网站上,这样每次提交代码,就不用输入用户名和密码了,github会根据网站上存储的公钥来识别我们的身份。
非对称加密的优点:

  1. 非对称加密采用公有密钥和私有密钥的方式,解决了http中消息保密性问题,而且使得私有密钥泄露的风险降低。
  2. 因为公钥加密的消息只有对应的私钥才能解开,所以较大程度上保证了消息的来源性以及消息的准确性和完整性。

非对称加密的缺点:

  1. 非对称加密时需要使用到接收方的公钥对消息进行加密,但是公钥不是保密的,任何人都可以拿到,中间人也可以。那么中间人可以做两件事,第一件是中间人可以在客户端与服务器交换公钥的时候,将客户端的公钥替换成自己的。这样服务器拿到的公钥将不是客户端的,而是中间人的。服务器也无法判断公钥来源的正确性。第二件是中间人不替换公钥,但他截获客户端发来的消息,然后篡改,然后用服务器的公钥加密再发往服务器,服务器将收到错误的消息。
  2. 非对称加密的性能相对对称加密来说会慢上几倍甚至几百倍,比较消耗系统资源。正是因为如此,https将两种加密结合了起来。

    对称加密:通信双方使用相同的密钥进行加密。特点是加密速度快,但是缺点是需要保护好密钥,如果密钥泄露的话,那么加密就会被别人破解。常见的对称加密有AES,DES算法,IDEA、RC4、RC5、RC6。 由于算法效率较高,一般用于对效率有要求的实时数据加密通信。比如在使用 VPN 或者代理进行加密通信时,既要保证数据的保密性,又要保证不能有高的延迟,所以通常会使用对称加密算法。 优点:算法公开、计算量小、加密速度快、加密效率高。 缺点:在数据传送前,发送方和接收方必须商定好密钥,然后使双方都能保存好密钥。其次如果一方的密钥被泄露,那么加密信息也就不安全了。另外,每对用户每次使用对称加密算法时,都需要使用其他人不知道的唯一秘密钥,也就是说每一组收发方所使用的密钥都是唯一的,例如:A电脑与B、C、D都有通信,那么A就得存储与B、C、D三台电脑通信所用的密钥。这会使得收、发双方所拥有的钥匙数量巨大,密钥管理成为双方的负担。

2. 数字证书和数字签名

为了应对上面非对称加密带来的问题,我们就引入了数字证书与数字签名
4211569f38eb493e93714ccf5ca8acc4.png
CA 签发证书的过程,如上图左边部分:

  1. 首先 CA 会把持有者的公钥、用途、颁发者、有效时间等信息打成一个包,然后对这些信息进行 Hash 计算, 得到⼀个 Hash 值;
  2. 然后 CA 会使用自己的私钥将该 Hash 值加密,生成 Certificate Signature,也就是 CA 对证书做了签名;
  3. 最后将 Certificate Signature 添加在文件证书上,形成数字证书;

客户端校验服务端的数字证书的过程,如上图右边部分:

  1. 首先客户端会使用同样的 Hash 算法获取该证书的 Hash 值 H1;
  2. 通常浏览器和操作系统中集成了 CA 的公钥信息,浏览器收到证书后可以使用 CA 的公钥解密 Certificate Signature 内容,得到⼀个 Hash 值 H2 ;
  3. 最后比较 H1 和 H2,如果值相同,则为可信赖的证书,否则则认为证书不可信。

故CA认证介入我们的HTTPS连接的过程如下:

  1. 服务器拥有自己的私钥与公钥。
  2. 服务器将公钥交给CA认证机构,请求给予一份数字证书。
  3. CA认证机构生成数字证书,并颁发给服务器。
  4. 服务器将带有公钥信息的数字证书发给客户端。
  5. 进入客户端生成对称密钥再进行对接的过程……

20190426152200712.png
关于证书链
事实上,证书的验证过程中还存在⼀个证书信任链的问题,因为我们向 CA 申请的证书⼀般不是根证书签发的, 而是由中间证书签发的,比如百度的证书,从下图你可以看到,证书的层级有三级:
4957788dc0be4446a6a1579375302d81.png
对于这种三级层级关系的证书的验证过程如下:

  • 客户端收到 baidu.com 的证书后,发现这个证书的签发者不是根证书,就无法根据本地已有的根证书中的公钥去验证 baidu.com 证书是否可信。于是,客户端根据 baidu.com 证书中的签发者,找到该证书的颁发机构是 “GlobalSign Organization Validation CA - SHA256 - G2”,然后向 CA 请求该中间证书。
  • 请求到证书后发现 “GlobalSign Organization Validation CA - SHA256 - G2” 证书是由 “GlobalSign Root CA” 签发的,由于 “GlobalSign Root CA” 没有再上级签发机构,说明它是根证书,也就是自签证书。应用软件会检查此证书有否已预载于根证书清单上,如果有,则可以利用根证书中的公钥去验证 “GlobalSign Organization Validation CA - SHA256 - G2” 证书,如果发现验证通过,就认为该中间证书是可信的。
  • “GlobalSign Organization Validation CA - SHA256 - G2” 证书被信任后,可以使用“GlobalSign Organization Validation CA - SHA256 - G2” 证书中的公钥去验证 baidu.com 证书的可信性,如果验证通过,就可以信任 baidu.com 证书。

在这三个步骤中,最开始客户端只信任根证书 GlobalSign Root CA,然后 “GlobalSign Root CA” 证书信任 “GlobalSign Organization Validation CA - SHA256 - G2” 证书,而“GlobalSign Organization Validation CA - SHA256 - G2” 证书又信任 baidu.com 证书,于是客户端也信任 baidu.com 证书。
总括来说,由于用户信任 GlobalSign,所以由 GlobalSign 所担保的 baidu.com 可以被信任,另外由于用户信任操作系统或浏览器的软件商,所以由软件商预载了根证书的 GlobalSign 都可被信任。

五、HTTPS的缺点

虽然说HTTPS有很大的优势,但其相对来说,还是存在不足之处的:
(1)HTTPS协议握手阶段比较费时,会使页面的加载时间延长近50%,增加10%到20%的耗电;
(2)HTTPS连接缓存不如HTTP高效,会增加数据开销和功耗,甚至已有的安全措施也会因此而受到影响;
(3)SSL证书需要钱,功能越强大的证书费用越高,个人网站、小网站没有必要一般不会用。
(4)SSL证书通常需要绑定IP,不能在同一IP上绑定多个域名,IPv4资源不可能支撑这个消耗。
(5)HTTPS协议的加密范围也比较有限,在黑客攻击、拒绝服务攻击、服务器劫持等方面几乎起不到什么作用。最关键的,SSL证书的信用链体系并不安全,特别是在某些国家可以控制CA根证书的情况下,中间人攻击一样可行。

六、HTTPS优化:

  1. HSTS重定向技术:将http自动转换为https,减少301重定向。
  2. TLS握手优化:在TLS握手完成前客户端就提前向服务器发送数据。
  3. 会话标识符:服务器记录下与某客户端的会话ID,下次连接客户端发ID过来就可以直接用之前的私钥交流。
  4. OSCP Stapling:服务器将带有 CA 机构签名的 OCSP 响应在握手时发给客户端,省的客户端再去CA查询。
  5. 完全前向加密PFS:使用更厉害复杂的秘钥算法。

    七、SSL/TLS的基本过程

  6. client —> server ClientHello 客户端生成随机数,并发送一组密码学套件供服务端选

  7. server—> client ServerHello 服务端生成随机数,并从上述密码学套件组里选一个
  8. server—> client Certificate 服务端发给客户端证书
  9. server—> client ServerKeyExchange 服务端发给客户端秘钥交换算法所需的值
  10. server—> client ServerHelloDone 服务端 hello 阶段结束
  11. client —> server ClientKeyExchange 客户端发给服务端秘钥交换算法所需的值pre_master
  12. client —> server ChangeCipherSpec 客户端告诉服务端,我已经知道秘钥了,之后的消息我就都加密发送了。
  13. client —> server Finish 结束并验证
  14. server —> server ChangeCipherSpec 服务端告诉客户端,我已经知道秘钥了,之后的消息我就都加密发送了。
  15. server—> client Finish 结束并验证

image-20211008182407362.png
image-20211008182251792.png

参考链接:https://blog.csdn.net/qq_35642036/article/details/82788421