传输层安全

会与公钥分发相结合,主要以SSL与TLS为基础并与HTTPS结合

TLS 握手详细过程

TLS 握手详细过程

下面,按上面的图,详细说下具体过程

步骤1、客户端发出请求(ClientHello)

首先,客户端(通常是浏览器)先向服务器发出加密通信的请求,这被叫做ClientHello请求。

在这一步,客户端主要向服务器提供以下信息。

(1) 支持的协议版本,比如TLS 1.1、TLS 1.2、TLS 1.3版。【TLS1.0已经不用了,主流是TLS1.2】

(2) 一个客户端生成的随机数,稍后用于生成"RSA的密钥"。【第一个随机数,叫ClientHello.random,明文

(3) 支持的加密方法,比如RSA公钥加密

(4) 支持的压缩方法。

步骤2、服务器回应(SeverHello)

服务器收到客户端请求后,向客户端发出回应,这叫做SeverHello。服务器的回应包含以下内容。

(1) 服务器确认使用的加密通信协议版本,比如TLS 1.2版本。如果浏览器与服务器支持的版本不一致,服务器关闭加密通信。

(2) 一个服务器生成的随机数,稍后用于生成"RSA的密钥"。【第二个随机数,叫ServerHello.random,明文

(3) 服务器确认使用的加密方法,比如RSA公钥加密

(4) 服务器证书【非常关键,这个证书是CA发布的,有权威性,详细看密钥管理那篇文章

  • 除了上面这些信息,如果服务器需要确认客户端的身份,就会再包含一项【可选的】请求,要求客户端提供"客户端证书"
  • 比如,金融机构往往只允许认证客户连入自己的网络,就会向正式客户提供USB密钥,里面就包含了一张客户端证书。

步骤3、客户端回应

客户端收到服务器回应以后,首先验证服务器证书。如果证书不是可信机构颁布、或者证书中的域名与实际域名不一致、或者证书已经过期,就会向访问者显示一个警告,由其选择是否还要继续通信。

如果证书没有问题,客户端就会从证书中取出服务器的公钥。然后,向服务器发送下面三项信息。

(1) 一个随机数。该随机数用服务器公钥加密,防止被窃听。【第三个随机数,叫pre-master-key,密文

(2) 编码改变通知,表示随后的信息都将用双方商定的加密方法和密钥发送。

(3) 客户端握手结束通知,表示客户端的握手阶段已经结束。这一项同时也是前面发送的所有内容的hash值,用来供服务器校验。

注意

  • (1)中的随机数,是整个握手阶段出现的第三个随机数,又称"pre-master-key"。有了它以后,客户端服务器就同时有了三个随机数,接着双方就用事先商定的加密方法,各自生成本次会话所用的同一把"会话密钥"。
  • 【哪怕前两个随机数,都被中间人监听到了,但第三个因为使用了服务器公钥加密,只有服务器服务器的私钥可以解开,所以中间人不知道第三个随机数,也无法知道他们真正的密钥k是什么,这也是第三个随机数被称为pre-master-key的原因】

步骤4、服务器的最后回应

服务器收到客户端的第三个随机数【pre-master-key】之后,计算生成本次会话所用的"RSA密钥k"。然后,向客户端最后发送下面信息。

(1)编码改变通知表示随后的信息都将用双方商定的RSA加密方法RSA密钥k发送【不会把RSA密钥k发出去的】

(2)服务器握手结束通知,表示服务器的握手阶段已经结束。这一项同时也是前面发送的所有内容的hash值,用来供客户端校验。

至此,整个握手阶段全部结束。接下来,客户端与服务器进入加密通信,就完全是使用普通的HTTP协议,只不过用"会话密钥"加密内容。

主密钥的计算

服务器拿到第三个随机数后,服务器和客户端一共有了三个随机数,他们同时通过这三个随机数,双方共同计算主密钥k

无“Extended Master Secret”方式

1
master_secret = PRF(pre_master_secret,“主密码”,ClientHello.random +【连接上】 ServerHello.random)

有“Extended Master Secret”方式

1
master_secret = PRF(pre_master_secret,“扩展的主密钥”,session_hash)                       

其中的session_hash的定义如下:

1
session_hash = 哈希(handshake_messages)

其中“handshake_messages”是指所有已发送的握手消息,或者从ClientHello开始,直至并包ClientKeyExchange消息,包括以下内容的类型和长度字段握手消息。

使用三个随机数的原因

https://blog.csdn.net/dog250/article/details/5717162

对于RSA密钥交换算法来说,【第三个随机数,客户端向服务器发送的,还加密了】pre-master-key本身就是一个随机数,再加上hello消息中的两个随机数,三个随机数通过一个密钥导出器最终导出一个对称密钥

pre master的存在在于SSL协议不信任每个主机都能产生完全随机的随机数,如果随机数不随机,那么pre master secret就有可能被猜出来,那么仅适用pre master secret作为密钥就不合适了,因此必须引入新的随机因素,那么客户端和服务器加上pre master secret三个随机数一同生成的密钥就不容易被猜出了,一个伪随机可能完全不随机,可是是三个伪随机就十分接近随机了,每增加一个自由度,随机性增加的可不是一。"


SSH连接

SSH协议栈

SSH协议栈

流程图

SSH连接流程

SSH的连接与TLS类似,但传输时的包格式不同

SSH传输层包格式

SSH端口转发应用

另一篇文章有详细介绍

https://blog.lthero.cn/2022/05/30/[网络]ssh的本地端口转发与远程端口转发/


资料

具有扩展主密钥时SSL/TLS的主密钥计算 https://blog.csdn.net/laing92/article/details/104396530

SSL/TLS工作原理和详细握手过程 https://segmentfault.com/a/1190000021559557

SSL/TLS协议运行机制的概述:https://www.ruanyifeng.com/blog/2014/02/ssl_tls.html

SSL/TLS 协议[3]:密钥交换(密钥协商)算法及其原理 https://blog.csdn.net/andylau00j/article/details/54583769