主机接受了 SSH 密钥但客户端断开了连接

主机接受了 SSH 密钥但客户端断开了连接

你好,

安装 fedora 23 后,我遇到了 SSH 问题。

当我想用私钥连接到我的远程主机时,我的主机找到了密钥:

debug1: matching key found: file /home/theo/.ssh/authorized_keys, line 1 RSA {REDACTED}
debug1: restore_uid: 0/0
Postponed publickey for theo from {REDACTED} port 60351 ssh2 [preauth]
Connection closed by {REDACTED} [preauth]
debug1: do_cleanup [preauth]
debug1: monitor_read_log: child log fd closed

但正如你所看到的我的客户端自动断开连接

debug3: remaining preferred: keyboard-interactive,password
debug3: authmethod_is_enabled publickey
debug1: Next authentication method: publickey
debug1: Offering RSA public key: /home/tbouge/.ssh/id_rsa
debug3: send_pubkey_test
debug2: we sent a publickey packet, wait for reply
debug1: Server accepts key: pkalg ssh-rsa blen 1047
debug2: input_userauth_pk_ok: fp SHA256:{REDACTED}
debug3: sign_and_send_pubkey: RSA SHA256:{REDACTED}
debug2: we did not send a packet, disable method
debug1: No more authentication methods to try.
Permission denied (publickey).

我可以使用相同的私钥通过 Windows 上的 Putty 连接到我的主机,并且可以使用不同的私钥连接我的手机。

你有什么主意吗 ?

ssh 配置文件

Host *
        GSSAPIAuthentication yes
# If this option is set to yes then remote X11 clients will have full access
# to the original X11 display. As virtually no X11 client supports the untrusted
# mode correctly we set this to yes.
        ForwardX11Trusted yes
# Send locale-related environment variables
        SendEnv LANG LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES
        SendEnv LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT
        SendEnv LC_IDENTIFICATION LC_ALL LANGUAGE
        SendEnv XMODIFIERS

谢谢

编辑:我可以使用密码连接

答案1

首先,有很多写得很好的详细文档如何设置或配置基于公钥的身份验证可在线获取。请查看其中之一,看看您是否已正确遵循所有内容。这里就是其中之一。所以我就不再重复了。

最基本的概念是(摘自这里):

基于密钥的身份验证使用两个密钥,一个是任何人都可以查看的“公钥”,另一个是只有所有者才可以查看的“私钥”。要使用基于密钥的身份验证进行安全通信,需要创建一个密钥对,将私钥安全地存储在要登录的计算机上,将公钥存储在要登录的计算机上。

现在从您发布的调试日志中:

  • 似乎涉及两个不同的用户。/home/theo/.ssh/authorized_keys/home/tbouge/.ssh/id_rsa。您是否尝试以一个用户的身份登录到另一个用户的主目录?
  • 该错误Postponed publickey for theo..意味着在公钥方法之前尝试了不需要的身份验证方法。SSH 将依次尝试配置中启用的每种身份验证方法。就您而言,您GSSAPIAuthentication yes启用了未使用的方法。您可以通过执行以下操作安全地禁用它GSSAPIAuthentication no
  • debug2: we did not send a packet, disable method最有可能的是它无法处理私钥文件(文件权限或名称问题)。 SSH 对本地和远程计算机中的目录和文件权限非常敏感。(chown user_name:user_group -R /home/user,,chmod 700 /home/.sshchmod 600 /home/.ssh/authorized_keys因此,请确保您的设置正确。请参见:https://unix.stackexchange.com/questions/131886/ssh-public-key-wont-send-to-server
  • 至于第三个错误:Permission denied (public key).,有几件事需要检查。

以下部分有点令人困惑:

debug2: we sent a publickey packet, wait for reply
debug1: Server accepts key: pkalg ssh-rsa blen 1047
debug2: input_userauth_pk_ok: fp SHA256:{REDACTED}
debug3: sign_and_send_pubkey: RSA SHA256:{REDACTED}
debug2: we did not send a packet, disable method

为了更好地理解,让我们按照此处的描述逐步完成身份验证过程数字海洋

  1. 客户端首先向服务器发送它想要验证的密钥对的 ID。
  2. 服务器检查客户端尝试登录的帐户的 authorized_keys 文件中的密钥 ID。
  3. 如果在文件中找到具有匹配 ID 的公钥,则服务器会生成一个随机数,并使用该公钥对该数字进行加密。
  4. 服务器向客户端发送此加密消息。
  5. 如果客户端确实拥有相关的私钥,它将能够使用该密钥解密消息,从而显示原始号码。
  6. 客户端将解密的数字与用于加密通信的共享会话密钥相结合,并计算该值的 MD5 哈希值。
  7. 然后,客户端将此 MD5 哈希值发送回服务器,作为对加密数字消息的答复。
  8. 服务器使用相同的共享会话密钥和它发送给客户端的原始数字自行计算 MD5 值。它将自己的计算结果与客户端发回的值进行比较。如果这两个值匹配,则证明客户端拥有私钥,并且客户端已通过身份验证。

在您的例子中,如您所见,远程计算机仅接受了您的public key,使用该密钥加密数据包并将其发送回客户端计算机。现在,客户端计算机需要证明它拥有正确的private key。只有使用正确的 private_key,它才能解密收到的消息并发送答复。在这种情况下,客户端无法做到这一点,身份验证过程以失败告终。

我希望这能帮助您理解问题并解决它们。

答案2

你的 ssh 文件上的权限是否正确?

.ssh 文件夹 --> 700

公钥 --> 644

私钥——> 600

还检查用户和组

答案3

您说您在 Windows 机器上有相同的密钥;您确定您在 Linux 机器上的私钥文件是正确的吗?也许私钥是 ssh 不容易理解的 putty 格式。无论如何,如果我输入了不正确或无效的私钥文件,我会得到与您完全相同的错误。

要解决此问题,在 Linux 机器上生成新密钥比重复使用另一台机器上的密钥更为合适。您只需将新公钥添加到主机上的 authorized_keys 文件中,然后就可以同时使用 Windows 中的 Windows 密钥和 Fedora 中的新 Linux 密钥。

答案4

看来问题(就我而言……)是由钥匙类型引起的。

我刚刚解决了这个问题,将以下内容添加到本地~/.ssh/config文件(Fedora 23 客户端机器):

PubkeyAcceptedKeyTypes=+ssh-dss

虽然我已将该行添加到服务器和客户端配置文件中,但只有客户端才有区别。请注意,需要有权限600才能读取配置文件。

相关内容