zoukankan      html  css  js  c++  java
  • 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权威指南》

  • 相关阅读:
    pythonchallenge(二)
    pythonchallenge(三)
    pythonchallenge(一)
    [译]Python编写虚拟解释器
    [译]用R语言做挖掘数据《七》
    [译]用R语言做挖掘数据《六》
    [译]用R语言做挖掘数据《五》
    编译安装php容易出现的问题以及解决办法
    关于nodejs模块安装后找不到包解决办法
    gulp的入门
  • 原文地址:https://www.cnblogs.com/mingorun/p/9094229.html
Copyright © 2011-2022 走看看