我在一台 Linux 服务器上有两个非 root 用户。如果我在第一个用户下与一个特定的 SSH 服务器建立 SSH 连接(基于密钥的身份验证),那么它会成功:
/* debug messages removed for brevity */
debug1: Next authentication method: publickey
debug1: Offering public key: .ssh/id_rsa
debug1: Server accepts key: pkalg ssh-rsa blen 149
debug1: PEM_read_PrivateKey failed
debug1: read PEM private key done: type <unknown>
Enter passphrase for key '.ssh/id_rsa':
debug1: read PEM private key done: type RSA
debug1: Authentication succeeded (publickey).
debug1: channel 0: new [client-session]
debug1: Entering interactive session.
debug1: Sending environment.
debug1: Sending env LANG = en_US.UTF-8
现在,在第二个用户下,我使用 指定私钥文件-i .ssh/SD
,基于密钥的身份验证不会成功。直到这里为止,所有 SSH 客户端调试消息都完全相同:
/* debug messages removed for brevity */
debug1: Next authentication method: publickey
debug1: Trying private key: .ssh/SD
debug1: PEM_read_PrivateKey failed
debug1: read PEM private key done: type <unknown>
Enter passphrase for key '.ssh/SD':
debug1: read PEM private key done: type RSA
debug1: Authentications that can continue: publickey
debug1: No more authentication methods to try.
Permission denied (publickey).
为什么第二种情况下 SSH 客户端不提供公钥?这是基于密钥的身份验证的强制性步骤,不是吗?
答案1
我要检查两件事。
您似乎使用了不同的 ssh 密钥,因此请确保权限正确。 .ssh文件夹应该是0700,rsa私钥应该是0600,公钥应该是0644。用于
ls -l ~/.ssh
查看权限。确保公钥已传输到第二台服务器。您可以使用
ssh-copy-id ~/.ssh/SD.pub
将公钥复制到第二台服务器。运行后,您可以通过登录服务器(以 root 身份或使用密码)来验证它是否存在,然后它应该在您的本地系统上cat ~/.ssh/authorized_keys
具有准确的输出。cat ~/.ssh/SD.pub
如果您之前添加过它们,它可能还有其他键。
如果这两件事看起来都不错,但您仍然无法进入,那么您应该查看 /var/log/secure 中的服务器日志,或者您也可以在前台运行第二个 ssh 服务器来查看发生的情况。在远程服务器上运行
sudo $(which sshd) -p 6666 -D -d
然后在您的系统上尝试使用以下命令登录新的 ssh 守护进程
ssh -p 6666 -i ~/.ssh/SD <SERVER>
您应该会看到服务器终端上打印出的日志信息,其中可能包含有关登录失败原因的更多信息。
作为对第二个 sshd 守护进程的解释。即使为了安全起见权限通常为 0755,您也需要 sudo。您还需要提供 sshd 二进制文件的完整路径。这就是为什么$(which sshd)
包含在命令中。-p 6666
设置端口(我只是随机选择一个)。-D
将在前台运行并-d
启用调试。
答案2
为什么第二种情况下 SSH 客户端不提供公钥?
如果公钥存在,则由客户端提供(即文件存在并且与私钥位于同一文件夹中,且名称相同+“.pub”)。
这是基于密钥的身份验证的强制性步骤,不是吗?
不,提供公钥是可选的。仅强制证明客户端拥有私钥。
更多解释可以在这里找到:
https://security.stackexchange.com/a/152638
为了说明这两种情况:
- 提供公钥,然后证明客户端拥有私钥
debug1: Authentications that can continue: publickey,password
debug1: Offering public key: RSA SHA256:3btAL+lsfo8D3Z8PVWLG04j8BqShS2ImfxqwMFPS8BM '.ssh/id_rsa'
debug3: send_pubkey_test
debug3: send packet: type 50
debug2: we sent a publickey packet, wait for reply
debug3: receive packet: type 60
debug1: Server accepts key: pkalg ssh-rsa blen 535
debug2: input_userauth_pk_ok: fp SHA256:3btAL+lsfo8D3Z8PVWLG04j8BqShS2ImfxqwMFPS8BM
debug3: sign_and_send_pubkey: RSA SHA256:3btAL+lsfo8D3Z8PVWLG04j8BqShS2ImfxqwMFPS8BM
debug3: send packet: type 50
debug3: receive packet: type 52
debug1: Authentication succeeded (publickey).
- 只证明客户端有私钥
debug1: Authentications that can continue: publickey,password
debug1: Trying private key: '.ssh/id_rsa'
debug3: sign_and_send_pubkey: RSA SHA256:3btAL+lsfo8D3Z8PVWLG04j8BqShS2ImfxqwMFPS8BM
debug3: send packet: type 50
debug2: we sent a publickey packet, wait for reply
debug3: receive packet: type 52
debug1: Authentication succeeded (publickey).
请注意,如果名为 的公钥.ssh/SD.pub
存在并且与私钥不相关.ssh/SD
(例如由于先前生成的密钥),则连接将失败。根据OP提供的日志,这里的情况并非如此,但这是我在提出这个问题时遇到的问题。在这种情况下,客户端的日志如下(并且没有明确说明身份验证失败的原因):
debug1: Next authentication method: publickey
debug1: Offering public key: RSA SHA256:p5eJ+CJ1aRR9xeEcQUDCkbnQ3VUxa8cxjlWUhsYfla4 '.ssh/id_rsa'
debug3: send_pubkey_test
debug3: send packet: type 50
debug2: we sent a publickey packet, wait for reply
debug3: receive packet: type 51
debug1: Authentications that can continue: publickey,password