Appearance
SSH
1. 客户端发起连接并请求与服务器建立SSH通信
- 客户端通过TCP连接到SSH服务器,默认端口为22。客户端与服务器通过TCP握手建立物理连接。
2. 协商SSH协议版本
- 服务器响应协议版本:服务器会发送它所支持的SSH协议版本,通常是
SSH-2.0。 - 客户端确认协议版本:客户端和服务器需要达成一致的协议版本,一般为
SSH-2.0,以确保双方使用相同的SSH协议。
3. 交换加密算法列表,确定通信的加密、MAC和压缩算法
- 加密算法列表交换:客户端和服务器交换各自支持的加密算法、消息验证码(MAC)算法、压缩算法和密钥交换算法的列表。
- 选择共同支持的算法:双方选择一个兼容的加密算法、MAC算法、压缩算法和密钥交换算法,通常是优先级最高且双方都支持的算法。
4. 服务器发送主机公钥,客户端确认服务器身份
- 服务器发送主机公钥:服务器发送自己的主机公钥给客户端,公钥用于加密和身份验证。
- 客户端验证服务器身份:
- 首次连接:如果是第一次连接,客户端会将服务器的公钥存储在
~/.ssh/known_hosts文件中。 - 后续连接:如果服务器公钥已在该文件中,客户端将其与之前存储的公钥进行比对。如果公钥不同,客户端会提示用户进行确认,防止中间人攻击。
- 首次连接:如果是第一次连接,客户端会将服务器的公钥存储在
5. 密钥交换(例如:Diffie-Hellman),双方通过公钥和私钥计算共享密钥
- 生成临时密钥对:客户端和服务器各自生成临时的公私钥对,并交换各自的公钥。
- 计算共享密钥:客户端和服务器通过各自的私钥和对方的公钥进行计算,生成一个共享密钥,这个密钥是双方独有的,是基于Diffie-Hellman算法或**ECDH(椭圆曲线Diffie-Hellman)**生成的。
6. 签名验证,服务器签名会话哈希,客户端验证签名,确认身份
- 会话哈希计算:服务器会将密钥交换的内容(包括公钥和会话ID等)进行哈希运算,生成一个会话哈希值。
- 服务器签名:服务器使用长期私钥对这个哈希值进行数字签名,签名数据发送给客户端。
- 客户端验证签名:客户端使用服务器的公钥验证签名,以确保公钥来自合法的服务器,防止中间人攻击。通过验证,客户端确认服务器的身份以及密钥交换的内容没有被篡改。
7. 生成会话密钥,客户端和服务器生成相同的会话密钥
- 使用共享密钥生成会话密钥:客户端和服务器各自使用协商生成的共享密钥和其他交换的信息,生成一个对称会话密钥(Session Key),这个密钥将在整个SSH会话中用于加密和解密数据。
8. 建立对称加密通道,使用会话密钥对数据加密
- 建立加密通道:客户端和服务器使用生成的会话密钥来加密后续所有的通信内容。加密采用对称加密方式,保证了通信的效率和数据的安全性。
9. 用户身份验证,通过密码、公钥或其他方式确认客户端的合法性
- 用户身份验证方式:
- 密码验证:客户端输入用户名和密码,服务器验证该信息的合法性。
- 公钥验证:客户端用持有的私钥对服务器发送的挑战字符串进行签名,服务器通过验证签名确认客户端的身份。
- 其他验证方式:包括双因子认证(如手机验证码)或使用Kerberos等其他身份验证系统。
10. 建立安全会话,客户端和服务器可以安全地通信
- 安全会话建立:在用户身份验证通过后,客户端和服务器建立了一个基于对称加密的安全会话。客户端可以发送命令给服务器,服务器则响应并返回结果,所有通信内容都通过对称会话密钥进行加密。
11. 加密通信,所有数据加密传输,确保保密性和完整性
- 加密数据传输:客户端和服务器之间的所有数据通过会话密钥进行对称加密,这保证了通信的机密性,攻击者无法窃取或篡改数据。
- 数据完整性:通过**MAC(消息验证码)**来确保传输的数据在过程中没有被篡改,接收方可以验证数据的完整性。
12. 会话终止,双方安全地终止连接并销毁会话密钥
- 会话关闭:当会话结束时,客户端或服务器可以发送SSH消息来请求安全地断开连接。
- 会话密钥销毁:会话终止后,双方都会销毁会话密钥和其他相关的敏感信息,防止这些密钥被恶意利用。
SSL
1. 客户端请求连接 - Client Hello
客户端发起连接:客户端向服务器发起SSL/TLS连接请求。它通过TCP连接到服务器的443端口(HTTPS默认端口)。
Client Hello消息:在这个阶段,客户端发送一条
Client Hello消息给服务器,包含以下内容:
- SSL/TLS版本号:客户端支持的最高版本号(如TLS 1.2或TLS 1.3)。
- 客户端支持的加密套件列表:包括支持的对称加密算法、密钥交换算法和消息验证码(MAC)算法(如RSA、AES、SHA)。
- 压缩算法:客户端支持的压缩方法列表。
- 随机数(Client Random):客户端生成的一个随机数,用于稍后生成会话密钥。
2. 服务器响应 - Server Hello
服务器接收并处理Client Hello:服务器收到
Client Hello消息后,验证消息的内容并选择兼容的加密设置。Server Hello消息:服务器响应客户端,发送
Server Hello消息,包含以下内容:
- SSL/TLS版本号:服务器选择使用的协议版本(双方都支持的最高版本)。
- 加密套件:服务器选择的加密套件,确保双方可以共同使用的加密算法、MAC算法等。
- 服务器随机数(Server Random):服务器生成的一个随机数,用于稍后与客户端的随机数共同生成会话密钥。
- 服务器证书:服务器的数字证书,通常由受信任的证书颁发机构(CA)签发,包含服务器的公钥。
3. 服务器的身份验证
客户端验证服务器证书:
- 验证签名的CA:客户端会检查服务器证书是否由受信任的CA签发,验证证书的合法性。
- 验证证书有效期:检查证书是否在有效期内。
- 验证域名:验证证书中的域名是否与用户请求的服务器的域名匹配。
如果证书通过验证,客户端确认服务器的身份为可信,否则用户会看到警告。
4. 客户端生成预主密钥(Pre-Master Secret)
- 生成预主密钥:
- 客户端生成一个称为**预主密钥(Pre-Master Secret)**的随机数。
- 加密预主密钥:
- 客户端使用服务器证书中的公钥来加密预主密钥。这样可以确保只有拥有对应私钥的服务器才能解密这个预主密钥。
- 发送加密的预主密钥:
- 客户端将加密后的预主密钥发送给服务器,这个步骤确保即使数据被拦截,攻击者也无法获取预主密钥。
5. 服务器解密预主密钥
- 解密预主密钥:
- 服务器使用自己的私钥解密加密的预主密钥,从而获得与客户端一致的预主密钥。
- 密钥生成:
- 服务器和客户端现在拥有了相同的预主密钥(Pre-Master Secret)。
6. 生成会话密钥
- 生成对称会话密钥:
- 服务器和客户端各自使用双方生成的随机数(Client Random 和 Server Random)以及预主密钥,通过伪随机函数(PRF)计算生成对称会话密钥。
- 会话密钥用于加密接下来的通信内容。伪随机函数的输入包括
Client Random、Server Random和Pre-Master Secret,确保生成的对称密钥对客户端和服务器来说是相同的。
7. 交换Change Cipher Spec和Finished消息
- 客户端发送Change Cipher Spec消息:
- 客户端发送
Change Cipher Spec消息,表示从此刻开始,后续的通信都将使用协商好的对称会话密钥加密。
- 客户端发送
- 客户端发送Finished消息:
- 紧接着,客户端发送
Finished消息,表明客户端握手过程已经完成。这个消息会用新的会话密钥加密,服务器通过解密验证握手的完整性。
- 紧接着,客户端发送
- 服务器发送Change Cipher Spec消息:
- 服务器也发送
Change Cipher Spec消息,表示后续通信也将使用协商好的会话密钥。
- 服务器也发送
- 服务器发送Finished消息:
- 服务器同样发送
Finished消息,表明服务器的握手过程也完成。这个消息也会用新的会话密钥加密,客户端用同样的密钥解密以确认握手成功。
- 服务器同样发送
在这一阶段,SSL握手完成,客户端和服务器之间的通信已经通过会话密钥加密。
8. 加密数据传输
- 安全通信开始:
- 通过SSL握手过程,客户端和服务器已经建立了一个加密通道。后续的通信数据都会使用会话密钥进行对称加密。
- 加密方式:对称加密确保了传输数据的机密性和高效性,通常使用AES、DES等对称加密算法。
- 消息验证码(MAC):每条消息还会通过MAC算法进行验证,以确保数据在传输过程中的完整性,防止被篡改。
9. 会话终止
- 关闭通知:
- 当客户端或服务器决定关闭会话时,会发送一个**关闭通知(Close Notify)**消息,通知对方即将关闭连接。
- 会话密钥销毁:
- 在会话关闭之后,双方都会销毁会话密钥及其他相关的敏感信息,确保不会重复使用会话密钥,以降低被攻击的可能性。