• Https握手过程


    https:
    比如客户端要访问通过域名访问B站,但是如何防止不法分子伪装B站让你访问,Https要求服务端申请SSL证书,证明域名是大家熟知的B站。(SSL证书比TLS更为人熟知。SSL证书其实是一份保存在源服务器的数据文件,要让SSL证书生效,需要向CA机构申请)。该证书除了表明域名属于谁、日期等信息外,还包含了公钥与私钥,服务器安装了SSL证书后,用户才能通过HTTPS访问服务器。用户会把Http默认端口80改为Https端口443。
    浏览器通过Https访问服务器具体变化会根据不同TLS版本会有不同变化。以TLS1.2为例。首先,正常的TCP三次握手不变。TCP三次握手后,客户端发了一个Client Hello给服务端,客户端会告诉服务端支持TLS1.2版本(和其它版本)和16个加密套件,还有一个随机数。服务端收到客户端打招呼后,会发送server hello。在服务端发送的报文中,包含服务端确认支持的TLS版本以及选择的加密套件,并且服务器也生成随机数发给客户端。服务器再发一个响应,出示自己的证书。浏览器就可以根据对照自己的证书信任列表来确认服务器是否可信(简单说,检查服务器的证书是否可信)。然后在server key exchange中,包含了公钥。如果服务端也要客户端的证书,也会在这里发出请求,比如登录网银就需要这个步骤。最后服务端还要告诉客户端自己发送完了。截止到目前这些请求和响应还未进行加密。截止到这里,这些请求还未加密。此时,客户端处理这些响应。客户端会再生成一个随机数,在发送的报文中的Client key exchange部分的pubkey中有个随机数。然后还有个Change Cipher Spec,告诉服务器往后的数据用商议好的算法和密钥。最后Encrypted Handshake Message,表示客户端协商没问题。加密开始。服务器也发送Encrypted Handshake Message,表示范围准备好了。也表示TLS握手成功了。可以给数据加密进行交换了。

    总结整个过程
    1 Client Hello,客户端和服务端打招呼,并把自己支持的TLS版本,加密套件发送给服务端。同时生成一个随机数给服务端。称为随机数1。
    2 服务端打招呼,Server Hello,包括确认支持的TLS版本以及选择的加密套件。并且也生成一个随机数给客户端,这个随机苏称为第二随机数。
    3 服务端把证书发给客户端
    4 服务端把公钥发给客户端
    5 服务端发送Server Hello Done
    (此前都是明文)
    6 客户端生成第三个随机数,称为(预主秘钥)不会直接发送出去,而是用公钥加密后发送出去。
    7 服务端收到加密后的预主密钥,用私钥解密,服务端就知道预主密钥了。此时只有客户端和服务端知道预主密钥。
    8 客户端用预主密钥第以及一随机数和第二随机数计算出会话密钥,服务端也是根据预主密钥、第一和第二随机数计算出会话密钥。
    此后,使用对称加密。

  • 相关阅读:
    linux下的编译工具——gcc/g++
    深度操作系统 15.2——怀揣梦想,笃定前行
    windows服务器通过nginx配置https
    Python之xpath、JsonPath、bs4基本使用
    Linux- 命名信号量和无名信号量的区别
    数仓4.0(三)------数据仓库系统
    渣土车识别监测 渣土车未盖篷布识别抓拍算法
    这 13 个可能是你一直未使用过的超级棒的 Python 用法
    databindingutil.setcontentview type mismatch 从使用角度区分ViewBinding和DataBinding
    JAVA毕业设计105—基于Java+Springboot+Vue的校园跑腿系统(源码+数据库)
  • 原文地址:https://blog.csdn.net/myscratch/article/details/132920293