zoukankan      html  css  js  c++  java
  • SSL/TLS 链接的建立/握手

    HTTPS 即 HTTP-within-SSL/TLS,其中 SSL/TLS 又分别表示:

    • SSL:Secure Sockets Layer
    • TLS:Transport Layer Security

    SSL/TLS 建立链接及握手的过程为:

    SSL/TLS 建立链接及握手的示意图

    SSL/TLS 建立链接及握手的示意图

    阶段一

    • Client Hello
      • 客户端向服务器发送
        • 随机数 Random1
        • 客户端支持的加密套件 Support Ciphers
        • SSL 版本
    • Server Hello
      • 服务器向客户端发送
      • 从客户端发送加密套件列表中选择一个,加密套件决定了后续加密及生成摘要的算法
      • 生成随机数Random2。两端的随机数会在后续生成对称密钥时使用。

    阶段二

    • Certificate
      • 服务器将自己的证书下发给客户端,让客户端验证服务器的身份。( 12306 曾经使用国内自己签发的证书,结果 Chrome 不认就是这个道理)
      • 客户端验证后从证书取出公钥
    • Server Key Exchange
      • DH 算法需要此步骤,发送服务器使用的 DH参数,RSA 不需要
    • Certificate Request
      • 可选。服务器要求客户端上报证书。对安全性要求极高时使用。
    • Server Hello Done
      • 通知客户端 Server Hello 结束

    阶段三

    • Certificate Verify

      • 客户端收到证书后从CA验证其合法性。
      • 验证合法后从证书取出公钥,生成随机数 Random3
      • 使用公钥非对称加密Random3 生成 PreMaster Key
    • Client Key Exchange

      • 客户端将 PreMaster Key 发送服务器,服务器用自己的私钥解出 Random3。
      • 此时两端都拥有 Random 1~3
      • 两端使用相同的算法生成密钥,握手结束后的数据传输都使用此密钥进行对称加密。
    • 为何需要三个随机数?

      • 因为SSL/TSL 握手过程数据明文传输,多个随机数种子生成的密钥不容易暴力破解。

    阶段四

    • Change Cipher Spec (Client)
      • 这是一条事件消息
      • 客户端通知服务端后续消息都会使用前面协商出来的密钥加密。
    • Encrypted Handshake Message (Client)
      • 这是条 Client Finish 消息
        • 客户端将前面的握手消息生成摘要,使用前面协商的密钥加密。
      • 这是客户端发出的第一条加密消息
      • 服务端使用密钥解密,解密成功说明密钥一致。
    • Change Cipher Spec (Server)
      • 事件消息
      • 服务端通知客户端后续消息都使用加密。
    • Encrypted Handshake Message (Server)
      • Server Finish 消息
      • 服务端将握手过程生成摘要
      • 使用密钥加密发送给客户端
      • 这是服务端发送的第一条加密消息
      • 客户端收到后解密,成功说明密钥一致。

    相关资源

  • 相关阅读:
    html基础教程2
    HTML的基础教程
    JS中响应函数和for循环执行问题
    Cookie显示上次访问时间出现错误的问题
    完全卸载VSCode--解决卸载重新安装后还有原来配置的问题
    servlet中输出HTML标签浏览器不能正常显示
    Java中Servlet输出中文乱码问题
    eclipse下配置Tomcat(没有Tomcat8及以上版本问题)
    Java多线程通信之wait()和notify()方法
    Java中synchronize关键字
  • 原文地址:https://www.cnblogs.com/Wayou/p/ssl_tls_handshake.html
Copyright © 2011-2022 走看看