深入理解HTTPS协议

作者: maskwang520 | 来源:发表于2018-03-24 15:00 被阅读444次

    HTTS协议实际就是标准的HTTP协议加上SSL/TLS层.它能防止我们的信息被窃取,暴露出不安全.或者进入钓鱼网址.通过下面这个讲解,我希望能明白SSL/TLS层到底为我们做了哪些事情,才能保证我们的信息安全.

    1. HTTPS到底做了哪些事情

    HTTPS采用众所周知和理解的HTTP协议,并简单地将SSL / TLS加密层层叠在其上。服务器和客户端仍然使用相同的HTTP,但通过安全的SSL连接来加密和解密他们的请求和响应。 SSL层有两个主要目的:

    • 保证你是在跟真正的服务器通信,而不是伪装的服务器.
    • 保证只有真正的服务器才能解密你发送的信息.同时,也只有你才能解密服务器跟你发送消息.就是保证是你跟真正的服务器在通信,这过程中没有第三者.

    在这过程中,其他人还是可以中途截取到你发送的信息,但是是加密的,它们拿到也无法解密.

    2. SSL/TLS是如何建立连接的

    客户端和服务器端通过握手来建立连接的,目的有以下3点。

    • 保证客户端正在和正确的服务器通信(反之亦然)
    • 有关各方已就“密码套件”达成一致,该密码套件包括将用于交换数据的加密算法
    • 对密匙达成一致,双方使用相同的密匙

    一旦建立连接,双方就可以使用商定的算法和密钥将消息安全地发送给对方。我们将握手分为三个主要阶段 - Hello,证书交换和密钥交换。

    1. Hello - 握手从客户端发送ClientHello消息开始。这包含服务器通过SSL/TLS连接到客户端所需的所有信息,包括它支持的各种密码套件和最大SSL/TLS版本。服务器响应ServerHello,其中包含客户端所需的类似信息,包括基于客户端有关哪个密码套件和SSL/TLS版本将被使用的偏好的决定。
    2. 证书交换 - 现在联系已建立,服务器必须向客户证明其身份。这是通过使用SSL证书来实现的,该证书与其护照非常相似。 SSL证书包含各种数据,包括所有者的名称,所连接的属性(例如域),证书的公钥,数字签名以及有关证书有效日期的信息。客户端检查它是隐式信任证书,还是验证它是否被其隐含信任的几个证书颁发机构(CA)之一验证和信任。请注意,服务器也可以要求证书来证明客户的身份,但这通常只发生在非常敏感的应用程序中。
    3. 密钥交换 - 客户端和服务器交换的实际消息数据的加密将使用对称加密算法完成,其确切性质在Hello阶段已经达成一致。对称算法使用单个密钥进行加密和解密,与需要公钥/私钥对的非对称算法相反。双方需要就这个单一的对称密钥达成一致,这个安全使用非对称加密和服务器的公钥/私钥完成的过程。客户端先用非对称加密算法的公钥把通信过程中需要的私钥传给服务端,服务端用私钥解读出以后通信过程中的私钥。

    客户端生成一个用于对称加密算法的随机密钥。它使用在Hello阶段同意的算法和服务器的公钥(在其SSL证书上找到)对其进行加密。它将这个加密的密钥发送到服务器,在那里使用服务器的私钥解密,并且握手的有趣部分已完成。双方都非常高兴,他们正在与正确的人交谈,并秘密地同意了一个密钥,以对称加密的方式加密他们将要发送的数据。 HTTP请求和响应现在可以通过形成明文消息然后加密并发送来发送。另一方是唯一知道如何解密此消息的人,因此中间人攻击者无法读取或修改他们可能拦截的任何请求。


    image.png
    3. 证书

    对于请求方来说,它怎么能确定它所得到的公钥一定是从目标主机那里发布的,而且没有被篡改过呢?亦或者请求的目标主机本本身就从事窃取用户信息的不正当行为呢?这时候,我们需要有一个权威的值得信赖的第三方机构(一般是由政府审核并授权的机构)来统一对外发放主机机构的公钥,只要请求方这种机构获取公钥,就避免了上述问题的发生。
    用户首先产生自己的密钥对,并将公共密钥及部分个人身份信息传送给认证中心。认证中心在核实身份后,将执行一些必要的步骤,以确信请求确实由用户发送而来,然后,认证中心将发给用户一个数字证书,该证书内包含用户的个人信息和他的公钥信息,同时还附有认证中心的签名信息(根证书私钥签名)。用户就可以使用自己的数字证书进行相关的各种活动。数字证书由独立的证书发行机构发布,数字证书各不相同,每种证书可提供不同级别的可信度。
    证书的验证是通过验证证书的数字签名(CA的公钥来解开签名,并与原文hash之后的摘要做对比).

    4. 数字签名

    数字签名技术就是对“非对称密钥加解密”和“数字摘要“两项技术的应用,它将摘要信息用发送者的私钥加密,与原文一起传送给接收者。 接收者只有用发送者的公钥才能解密被加密的摘要信息,然后用HASH函数对收到的原文产生一个摘要信息,与解密的摘要信息对比。 如果相同,则说明收到的信息是完整的,在传输过程中没有被修改,否则说明信息被修改过,因此数字签名能够验证信息的完整性。
    数字签名的过程如下:

    明文 --> hash运算 --> 摘要 --> 私钥加密 --> 数字签名

    数字签名有两种功效:

    • 能确定消息确实是由发送方签名并发出来的,因为别人假冒不了发送方的签名。
    • 数字签名能确定消息的完整性。

    真个HTTPS的握手过程如下


    image.png
    5. 总结

    HTTPS不是不可破解的,并且SSL协议必须随着新攻击被发现和压制而不断发展。但它仍然是一种传递秘密数据的的方式,无需关心谁看到您的消息。当然,这里没有提到许多实现细节,例如握手消息的确切格式和顺序,在不需要重新协商密钥和密码套件的情况下选择最近会话的简短握手,以及在每个阶段可用的众多不同的加密选项。关键要记住的是,虽然HTTPS可以保证数据安全地连接到目的地,但它绝不会保护您(作为用户或开发人员)抵御XSS或数据库泄漏或任何其他事情 。看看威尔史密斯,“Walk in shadow, move in silence, guard against extra-terrestrial violence”。

    参考文章:
    http://www.ruanyifeng.com/blog/2011/08/what_is_a_digital_signature.html
    https://robertheaton.com/2014/03/27/how-does-https-actually-work/
    http://www.wxtlife.com/2016/03/27/%E8%AF%A6%E8%A7%A3https%E6%98%AF%E5%A6%82%E4%BD%95%E7%A1%AE%E4%BF%9D%E5%AE%89%E5%85%A8%E7%9A%84%EF%BC%9F/#u6570_u5B57_u8BC1_u4E66

    相关文章

      网友评论

      • 痴尘_fee:写的不错,要是结合具体两端的案例代码演示流程更好理解了
      • 7f5d05d2eefb:有没有实际操作案例, 包括服务端和移动端

      本文标题:深入理解HTTPS协议

      本文链接:https://www.haomeiwen.com/subject/magnqftx.html