![SSH 公钥不一致导致权限被拒绝](https://linux22.com/image/1625363/SSH%20%E5%85%AC%E9%92%A5%E4%B8%8D%E4%B8%80%E8%87%B4%E5%AF%BC%E8%87%B4%E6%9D%83%E9%99%90%E8%A2%AB%E6%8B%92%E7%BB%9D.png)
我最近发现.pub
生成的公钥文件()ssh-keygen
是实际使用进行身份验证。
我有一对旧密钥~/.ssh/id_rsa
,~/.ssh/id_rsa.pub
然后我更换了仅私钥用一个新的,而不删除或更新公钥文件。这个设置给了我一个Permission denied (publickey,gssapi-keyex,gssapi-with-mic)
错误。
如果我删除旧的公钥文件,它就可以正常工作。如果我从新的私钥生成公钥文件,它也可以正常工作。
我想知道这种行为是否有记录?我没有找到有关此的任何信息。
答案1
可能没有明确记录。
SSHv2 中的公钥认证的工作原理如下:
- 客户端提供一个公钥。
- 服务器检查此密钥是否可能可以接受,并要求提供证明(签名)。
- 客户端发送使用相应私钥制作的数字签名。
如果您有用于不同服务器组的多个密钥对,客户端将尝试提供所有密钥对,直到找到服务器愿意接受的密钥对。
但是使用“PEM”密钥文件格式,如果私钥被加密,它将被完全加密 - 你甚至无法从中提取公共参数 - 这意味着客户端需要提示你输入你拥有的每个密钥的密码,直到最终找到匹配的密钥。
因此,为了避免这种情况,OpenSSH 客户端始终使用.pub
文件作为初始提供 - 它不会尝试解密私钥文件,直到它知道服务器是否愿意接受这些密钥。当然这意味着客户端无法在这种情况发生之前检查两个文件是否匹配。
(PuTTY 的“PPK”密钥格式不存在此问题。较新的“OpenSSH”私钥格式似乎也以明文形式存储公钥,并且似乎 OpenSSH 8.3 最终添加了对使用但即使如此,也只有在相应的.pub
文件丢失的情况下才会发生。)