SSH认证核心机制
SSH认证核心机制
一、挑战-响应阶段:验证密钥对的有效性
-
服务端生成随机挑战
- 服务器生成一个动态随机字符串(如
random_challenge=abc123
),并发送给客户端。
- 服务器生成一个动态随机字符串(如
-
客户端用私钥签名挑战
- 客户端使用本地保存的私钥(如
id_rsa
)对挑战进行签名,生成signature=xyz789
。
- 客户端使用本地保存的私钥(如
-
服务端用公钥验证签名
- 服务器使用客户端提供的公钥(如
id_rsa.pub
)解密签名。 - 如果解密后的结果与原始挑战(
abc123
)一致,则证明客户端拥有与公钥匹配的私钥。
- 服务器使用客户端提供的公钥(如
二、公钥存在性检查:确认授权关系
-
计算公钥指纹
- 服务器对客户端提供的公钥(
id_rsa.pub
)计算指纹(如 SHA-256 哈希值)。
- 服务器对客户端提供的公钥(
-
检查授权文件
- 服务器检查目标账户的
~/.ssh/authorized_keys
文件,确认该指纹是否存在于文件中。 - 例如,如果目标是管理员账户,服务器会检查
/home/admin/.ssh/authorized_keys
。
- 服务器检查目标账户的
-
授权决策
- 如果指纹存在,则允许登录;否则拒绝连接。
三、关键逻辑关系
-
顺序不可逆
- 必须先通过挑战-响应验证密钥对的有效性(步骤一),才能进入公钥存在性检查(步骤二)。
- 如果签名验证失败(如私钥不匹配),服务端会直接拒绝连接,无需检查
authorized_keys
。
-
双重保障
- 密钥对有效性:确保客户端拥有合法的私钥。
- 公钥授权:确保该公钥已被目标账户显式授权。
四、举例说明
假设以下场景:
- 服务器 IP:
192.168.1.100
- 目标账户:
admin
- 客户端公钥:
ssh-rsa AAAAB3NzaC1yc2E... user@client
连接过程
-
挑战-响应
- 服务器发送挑战:
abc123
- 客户端用私钥签名:
signature=xyz789
- 服务器用公钥解密签名,得到
abc123
,验证通过。
- 服务器发送挑战:
-
公钥存在性检查
- 服务器计算公钥指纹:
SHA256:abc123...xyz
- 检查
/home/admin/.ssh/authorized_keys
,发现匹配的条目:
- 服务器计算公钥指纹:
ssh-rsa AAAAB3NzaC1yc2E... user@client
- 允许登录。
拒绝连接场景
- 如果客户端的公钥未添加到
authorized_keys
文件中:- 挑战-响应验证通过(私钥有效)。
- 公钥指纹检查失败(未授权)。
- 服务器返回错误:
Permission denied (publickey)
。
五、总结
- 挑战-响应阶段使用客户端提供的私钥和公钥,验证密钥对的有效性。
- 公钥存在性检查确认该公钥是否已被目标账户授权。
- 两者是串联关系,必须同时满足才能登录。
- 这一设计确保了 SSH 认证的安全性:既验证了密钥的合法性,又确保了授权的明确性。