Skip to content

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 RandomServer RandomPre-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)**消息,通知对方即将关闭连接。
  • 会话密钥销毁:
    • 在会话关闭之后,双方都会销毁会话密钥及其他相关的敏感信息,确保不会重复使用会话密钥,以降低被攻击的可能性。