1. TCP连接建立
客户端发起连接:客户端(如
ssh user@host)向服务器的SSH端口(默认22)发送TCP SYN包。三次握手:完成TCP连接的建立,确保双方可通信。
2. 协议版本协商
客户端发送版本信息:格式为
SSH-protoversion-softwareversion(如SSH-2.0-OpenSSH_8.9)。服务器响应版本信息:若版本兼容,服务器返回类似响应(如
SSH-2.0-OpenSSH_9.0);否则终止连接。
3. 密钥交换与算法协商(KEX)
- 算法协商:
- 双方交换支持的算法列表(如密钥交换、加密、MAC、压缩算法等)。
- 协商确定最终使用的算法(如
curve25519-sha256、aes256-ctr、hmac-sha2-256等)。- 密钥交换(Key Exchange):
- 方法:常用
Diffie-Hellman (DH)或Elliptic-Curve Diffie-Hellman (ECDH)。- 过程:
- 服务器生成临时密钥对,发送公钥(
server_host_key)和DH参数(如p、g)给客户端。- 客户端生成临时密钥对,计算共享密钥
K,并发送自己的DH参数给服务器。- 双方独立计算出相同的会话密钥
session_key,用于后续加密通信。- 主机密钥验证:
- 服务器发送其永久主机公钥(如
ssh-rsa或ecdsa-sha2-nistp256)。- 客户端验证:
- 首次连接时,客户端提示用户确认主机密钥指纹(如
SHA256:xxxx)。- 已记录的主机密钥会与本地缓存(如
~/.ssh/known_hosts)比对,防止中间人攻击。
4. 用户认证
A. 密码认证
- 客户端发送用户名。
- 服务器响应密码提示。
- 客户端加密密码(使用会话密钥)并发送。
- 服务器验证密码正确性。
B. 公钥认证(更安全)
- 客户端发送用户名。
- 服务器查询
~/.ssh/authorized_keys,找到对应公钥。- 密钥验证挑战:
- 服务器生成随机字符串
challenge,用用户公钥加密后发送给客户端。- 客户端用私钥解密
challenge,并混合会话密钥生成响应(如HMAC)发回。- 服务器验证响应正确性。
- 可选:Agent Forwarding:
若客户端使用ssh-agent,可代理私钥签名,避免私钥明文传输。C. 其他认证方式
①Keyboard-Interactive:交互式多因素认证(如Google Authenticator)。
②GSSAPI:基于Kerberos的单点登录。
5. 会话建立
通道请求:客户端请求建立交互式会话(如Shell或端口转发)。
服务启动:服务器启动对应服务(如
/bin/bash)。数据传输:所有后续通信(输入/输出)均通过会话密钥加密,并使用协商的MAC算法验证完整性。
关键安全特性
- 前向安全性:每次会话使用临时密钥,即使长期私钥泄露,历史会话也无法解密。
- 防重放攻击:通过随机数和序列号确保消息唯一性。
- 完整性保护:MAC算法防止数据篡改。
常见问题排查
连接超时:检查防火墙是否放行22端口。
认证失败:确认
authorized_keys权限为600,或密码是否正确。主机密钥变更:服务器重装或IP变更后需更新
known_hosts。
结语
重整旗鼓
奋勇前进
!!!

3798

被折叠的 条评论
为什么被折叠?



