HTTPS的原理

 HTTPS的原理

1  https 与 http的区别

   https 就是在安全的传输层上发送的http。https 将http报文发送给TCP 之前,先将其发送给了一个安全层(SSL/TLS),由安全层对其进行加密 (ISO模型结构参考图-1)。

   如果客户端浏览器发现请求的URL是以 https开头, 浏览器就会打开一条到服务器端口 443(默认端口)的TCP连接,连接建立好之后会与服务器做SSL握手来初始化SSL层的参数。

   等到SSL参数初始化完成之后 客户端才可以将请求报文发送给安全层。然后在安全层SSL上将已加密的报文通过TCP发送给服务器。

         

                              (图-1)

  

2  https的原理

2.1 公开秘钥加密

   与对称秘钥加密算法使用相同的加密秘钥和解密秘钥不同,公开秘钥加密算法使用的加密秘钥和解密秘钥是不一样的。它使用两个非对称秘钥,一个用来对主机报文编码,另一个用来对主机报文

  解码。这样可以把编码秘钥公布出去让所有相互通信的访问者都知道,而在服务器端使用只有自己才知道的私有秘钥用来解密。(反过来私钥加密公钥也能解密)非对称秘钥加密需要确保在知道以下

  ①:公开秘钥

  ②:获取了小片的拦截的密文

  ③:已知报文明文和相关的密文

  的情况下依然无法知道私有秘钥。RSA算法就是满足条件的非对称加密算法。(对称秘钥加密与非对称秘钥加密对比如图-2)

  

                            (图 - 2)

2.2 数字签名

  使用数字签名是为了可以在报文接收端知道报文有没有被篡改过,数字签名是附加在报文上的特殊加密校验码,数字签名的生成和校验如下

   发送端通过   ①:将边长报文提出为一个定长的摘要

        ②: 使用私钥为参数对定长摘要做加密, 计算出签名

        ③:将计算出的签名附加在报文的末尾, 一并发送出去

   接收端通过   ①:使用公开秘钥对签名做解密获取报文的摘要

        ②:在本地计算明文报文的摘要

        ③:拿解密获取的报文的摘要和本地计算得到的报文摘要做比较,若相同则表示报文未被篡改过

   这种数字签名方式虽然看似安全,但是黑客仍然可以通过某种途径拿到客户端的设备,把本地的公钥修改为自己的私钥对应的公钥,这样黑客下次便可以冒充服务端与客户端正常通信而不被察觉。

   考虑到这种攻击方式的存在。服务端可以使用三方的数字证书来证明自己的身份。

  

                             (图 - 3)

  

2.3 数字证书

  数字签名存在的安全隐患主要表现在,客户端使用的公钥是否是真实可靠的公钥这一点上。如果存在一个第三方的认证中心(certificate authority,CA)能够告诉客户端这些,事情就好办了。

   浏览器可以自动获取所连接服务器的数字证书。一般web服务器证书包括以下信息

  ①web站点的名称和主机名

  ②web站点的公开秘钥

  ③证书颁发机构的名称

  ④来自证书颁发机构的签名

  

  获取到该证书后,浏览器先是看证书的颁发机构在本地是否已经保存有该机构的公钥,如果已经存在公钥则  使用本地的公钥对证书末尾的签名做解密,并对证书明文提取摘要,判断

  解密后的摘要和本地提取的摘要是否一致。若一致则表示该证书是有效的,这时证书上的域名地址以及公钥都可视为可用,客户端可以使用证书上的公钥来与服务器通信。(如图-4)

  

                            (图 - 4)

   如果客户端浏览器发现证书颁发机构是本地没有的,这时浏览器会警告用户 这张数字证书不是由受信任的机构颁发的,并给出是否信任并继续的弹窗。继续的话意味着需要再不做签名认证的情况下

  信任证书中的公钥和服务器域名地址。

   现在使用的数字证书大多遵循 X.509 v3标准,该标准要求数字证书具有以下格式

  

2.4 SSL 协议

  简化版的SSL握手的过程如下:

    ①客户端向服务器发起请求:以明文向服务器发送包括版本信息,加密套件候选列表,压缩算法候选列表,随机数random_C等信息

    ②服务端向客户端返回协商结果: 包括使用的协议版本,选择的加密套件cipher_suite,选择的压缩算法compression_method以及随机数random_S等以及服务器证书

    ③客户端接收到后先是会做证书的有效性校验,校验通过后客户端计算产生随机数Pre_master , 并使用服务器证书上的公钥对Pre_master加密 然后发送给服务器

    ④这时客户端和服务器均已获得计算协商秘钥(对称秘钥)的所有信息 = random_C + random_S + Pre_master,服务器和客户端均可以通过计算协商秘钥的方法各自在本地

     计算出协商秘钥。

    ⑤客户端通知服务器后续的通信采用协商秘钥做加密通信。

    ⑥客户端结合之前所有通信参数的hash值生成一段数据,并采用协商秘钥加密,发送给服务器用户数据的握手验证

    ⑦服务器使用协商秘钥解密客户端发送过来的握手验证数据,并验证数据和秘钥的正确性

    ⑧服务器端验证通过后,服务器同样的发送类似⑤⑥中的数据给客户端,以此告知客户端也使用协商秘钥加密

    ⑨握手结束,之后使用对称加密通信

参考:

http://www.ruanyifeng.com/blog/2011/08/what_is_a_digital_signature.html

https://blog.csdn.net/junehappylove/article/details/52288796

《HTTP权威指南》

猜你喜欢

转载自www.cnblogs.com/mingorun/p/9094229.html