【Cryptography】传输层安全
传输层安全
会与
公钥分发
相结合,主要以SSL与TLS为基础并与HTTPS结合
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的连接与TLS类似,但传输时的包格式不同
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