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


9

喂,

安装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上用腻子连接到主机,也可以使用不同的私钥与我的手机连接。

你有什么主意吗 ?

/ etc / ssh / ssh_conf

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

谢谢

编辑:我可以输入密码


您是否在serverfault上检查了此问答?也许是您shadow.conf中的错误
Henrik Pingel 2015年

您在审核中看到任何SELinux拒绝或SECCOMP消息吗?ausearch -m SECCOMP还是ausearch -m AVC?最近有一些更改可能会影响某些设置。
2015年

1
Helo,谢谢您的所有回答,但我没有发现发生了什么。我降级到f22,现在可以使用了。
祝你

sshd中有任何日志吗?
neutrinus

1
这里缺少的主要内容是来自服务器的日志。客户日志永远无法讲完整的故事。如果添加相关的服务器日志,则获得答案的机会将大大增加。
珍妮·D

Answers:


3

首先,有关如何设置或配置基于公共密钥的身份验证的在线文档很多,非常详细。请查看其中之一,看看您是否已正确遵循所有内容。是一个。所以我不再重复。

最基本的概念是(从此处复制):

基于密钥的身份验证使用两个密钥,一个允许任何人看到的“公共”密钥,以及另一个仅允许所有者看到的“私有”密钥。为了使用基于密钥的身份验证进行安全通信,需要创建一个密钥对,将私钥安全地存储在要登录的计算机上,并将公钥存储在要登录的计算机上。

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

  • 似乎涉及两个不同的用户。/home/theo/.ssh/authorized_keys/home/tbouge/.ssh/id_rsa。您是否要以一个用户身份登录到另一个用户的主目录?
  • 该错误Postponed publickey for theo..表示在使用publick密钥方法之前尝试了不需要的身份验证方法。SSH会依次尝试config中启用的所有身份验证方法。您已GSSAPIAuthentication yes启用了未使用的功能。您可以通过这样做安全地禁用它GSSAPIAuthentication no
  • debug2: we did not send a packet, disable method最有可能是它无法处理私钥文件(文件许可权或名称问题)。 SSH对本地和远程计算机中的目录和文件权限非常敏感。(chown user_name:user_group -R /home/userchmod 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

为了更好地理解它,让我们逐步进行认证过程,如digitalocean所述

  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

同时检查用户和组


谢谢您的回答,但我已经检查过了。
Preovaleo 2015年

2

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

要解决此问题,在Linux机器上生成新密钥而不是重用另一台机器上的密钥会更合适。您可以将新的公共密钥添加到主机上的authorized_keys文件中,然后可以使用Windows的Windows密钥和Fedora的新Linux密钥。


谢谢您的回答,但是是的,私钥是好的(有趣的事实:1小时可以找到如何在腻子中使用它!)。
Preovaleo

根据您的问题(非常合理的解决方案),私钥是好的,但是即使客户端认为应该可以使用,也无法使用它。我怀疑可能有些东西本来想请您输入密码,但没有成功。那可以解释为什么它在升级之前就可以工作了;升级要么错误地设置了“询问密码”过程,要么将其弄乱了(如果已经存在),并进行了sudo authconfig --updateall修复。
Law29 2016年

2

您的问题似乎很普遍,我也很清楚地说。

 Permission denied (publickey).

这对您有什么意义吗?对我来说,对我来说意义重大。

可以在服务器端检查是否在强制模式下运行了selinux runnin吗?如果不告诉我selinux会以哪种模式运行。

另外,如果您可以再进行一次尝试并捕获该尝试的审核日志并在此处发布,则肯定可以告诉我们原因:

  tail -f /var/log/audit/audit.log  (and try to attempt)

这是明确的权限问题,但不是文件权限:-)


+1也可以在RHEL7.1设置上看到。请使用audit2allow:)
kubanczyk 2015年

1

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

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

PubkeyAcceptedKeyTypes=+ssh-dss

尽管我已将该行添加到服务器和客户端配置文件中,但只有客户端有所不同。请注意,权限必须600是读取配置文件的权限。


不是这种情况。有一个问题,密钥是RSA。
2015年

@Jakuje是的,似乎没有,我没有注意到。好吧,也许它可以帮助其他人,因为昨天升级后我遇到了完全相同的问题。
jeroen 2015年

@jeroen,默认情况下它使用rsa密钥。除非自定义,否则请参阅此处的 fedora ref 。当然,您可以选择要配置和使用的密钥类型。
2015年

2
@jeroen在进一步测试中,我不建议这样做;不幸的是,gnome-keyring-daemon不会拾取$ HOME / .ssh / id_ecdsa文件,因此这些密钥将不会被解锁并在登录时自动添加到会话的ssh-agent中。无论如何,此后我已将服务器升级到F23,并且使用RSA密钥在服务器和其余的F22客户端(双向)之间没有问题。尽管ECSDA密钥确实为需要它的我的一台笔记本电脑提供了一种解决方法(使用RSA密钥的任何尝试均会失败),但根本问题似乎是其他原因。
FeRD

1
感谢您的帮助。请注意,如果服务器已升级到OpenSSH 7.0或更高版本(例如,如果它已升级到Fedora 23或更高版本),则需要在服务器上进行相同的更改。参见superuser.com/q/1016989/93541
DW

1

我不知道是否还有其他人仍然遇到此问题,但是我终于为遇到该问题的一台机器(一台笔记本电脑)解决了该问题。我相信我知道最终会解决该问题的原因,因此我会将信息留在这里,希望对其他仍会遇到此问题的人有所帮助,并希望有人可以检查我的解决方案并确认它实际上是什么解决了问题。

事实证明,这个问题根本不(对我而言)与SSH有关,而是与PAM如何配置我的密钥有关。中的配置/etc/pam.d已过时(尽管它在Fedora 22中可以正常工作),结果登录时再也无法进行正确的操作以从中提取我的密钥$HOME/.ssh/。运行此命令:

# sudo authconfig --updateall

正确地重建了/etc/pam.d配置。在下次重新启动时,我登录后(第一次尝试SSH进入服务器)时,会出现一个对话框,要求我输入SSH密钥($HOME/.ssh/id_rsa)的密码。我这样做了,选中了“登录时自动解锁”框,瞧!我从笔记本电脑中退出的功能已恢复。

背景

当我从外部来源导入RSA密钥时,导致我解决此问题的线索就来了。(A USB钥匙我随身携带,与我的家庭网络我的“远程访问”的关键。我关掉PasswordAuth我朝外的服务器年入侵后前)后ssh-add-ing THAT RSA密钥,不像一个坐在$HOME/.ssh/id_rsa,它已被远程服务器毫无问题地接受。

然后,我终于实现了我应该已经是一个多余的ssh-add,拿起$HOME/.ssh/id_rsa。我注意到,完成此操作后,ssh-add -l包含两个相同键的条目:

% ssh-add -l
2048 SHA256:XXXXXXXXXXXXXXXXXXXXXX id_rsa (RSA)
2048 SHA256:XXXXXXXXXXXXXXXXXXXXXX me@host (RSA)
2048 SHA256:YYYYYYYYYYYYYYYYYYYYYY imported@usbkey (RSA)

请注意,两个条目之一如何不显示密钥标识符,而仅显示与其公共签名匹配的私钥文件名。好像私钥并没有真正被钥匙圈管理者解锁。

我相信这就是正在发生的事情,PAM正在将“坏密钥”传递给尚未使用密码解锁的SSH代理。因此,当ssh尝试使用密钥进行身份验证时,它实际上并没有密钥对的(未锁定)私有部分,因此身份验证失败。

最后一点是猜测,但是无论是否有人在升级到F23后远程主机(以前是)不接受ssh密钥的问题,都值得尝试/etc/pam.d/使用重建目录authconfig作为解决方案。


0

检查用户主目录权限。这一点很重要。必须为755。700或770无法使用。


0

在你的ssh_config,尝试取消注释和/或添加/删除/追加到要么CipherCiphersMACs线(S)。

在我看来sshd,该请求正在寻找某种未包含在请求中的特定密码,可以通过在中配置它来添加该密码ssh_config

...并且我假设您没有在远程服务器上PubkeyAuthentication设置任何权限no,因为这肯定会导致失败。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.