Putty:获取“Server refused our key”错误

108

我使用puttygen.exe在Windows 8客户端创建了密钥对。在Ubuntu 12.04.3 LTS服务器上,我将我的公钥放入了~/.ssh/authorized_keys中。公钥如下:

ssh-rsa AAAAB3NzaC1yc2EAAAABJQAAAQEAopfM6RHOgnuc4Aftn3t4k5UIAT3StCAbn/vg/IMbphbXadshC+79sIlRq3P4zGzMjFTP4hKnzu6ehLV5lmj/qorq3SKT+bPO5Qrac3VbIlrGvuBFDDjP82I2Hwg3HzlsFTstqk++KToapaTYZ7jENEYyPl2wnzITJnt//+4U1o6juoXTKgdNE02hHnRZyHOV/bnkZyJJCEwJv5U0eXSThQnhmXtUxGT8U0HQNFiXfqIIVllhWiCnyrhhIaKz/CIJNAd2VmzyJzQtJtTQX8aWSNVrZju6Sv2/RncTNvsACdNgjjh/FH8PQXaep00jlJ3MOdsC8vz6VSPFbh6iKy1oLQ== rsa-key-20131231

因此,它是正确的(一行,无注释,以ssh-rsa开头等)。

.ssh目录权限级别为700,authorized_keys文件权限为600。目录和文件都属于我尝试登录的实际用户。

当我尝试连接时,我收到了“服务器拒绝了我们的密钥”的提示,并且服务器要求输入密码。就这些。在尝试使用密钥登录时,/var/log/auth.log中没有记录。

我已经到处查找并且所有文章和提示都提到设置文件/目录的chmod 600和700,并正确格式化密钥。我已经做到了所有这些,但仍然出现“refused our key”错误,我已经没有任何思路了。


2
你有告诉Putty使用相同的密钥吗?你是否使用相同的用户登录?这是默认的SSH安装,还是你修改了sshd_config? - Noam Rathaus
4
请确保sshd_config已配置为使用公钥,否则可能未配置。 - Noam Rathaus
另外,你是在尝试以 root 身份访问吗?默认情况下不允许 Root 登录。 - Noam Rathaus
2
你在 /var/log/auth.log 中看到了什么吗?将 SSH 的日志级别增加到“DEBUG”,看看是否记录了任何问题,如果仍然没有显示你的访问,则你正在查看错误的日志文件。 - Noam Rathaus
谢谢你的帮助。请看我下面的回答。加一分给你,老铁。 - PawelRoman
显示剩余5条评论
39个回答

68

好的,我的密钥中有一个小错误。显然,在复制到文件时第一个字母被切掉了,它以sh-rsa开头,而不是ssh-rsa。

nrathathaus - 你的回答非常有帮助,非常感谢,这个答案归功于你 :) 我按照你说的设置了sshd_conf:

LogLevel DEBUG3

查看日志后,我意识到sshd正确读取了密钥,但由于不正确的标识符而拒绝了它。


4
LogLevel被定义在"/etc/ssh/sshd_config"中。默认的日志文件是"/var/log/auth.log",除非在"sshd_config"中另有定义。 - Axel Kemper
密钥生成器肯定有问题,因为我也遇到了完全相同的问题! - Kevin
4
如果你在vim中打开authorized_key并立即尝试粘贴第一个“ssh_rsa”中的“s”,那么vim会将其视为vim命令,然后切换到插入模式并粘贴剩余的文本。如果你在粘贴之前进入插入模式(例如使用i),则不会删除前导的“s”。 - Pawel
3
请执行命令 sudo service ssh restart 以使更改生效。否则,我的认证日志文件中没有任何内容。 - hogan
我启用了LogLevel并重新启动了ssh服务,但在/var/log文件夹中找不到auth.log文件。(我正在使用CentOs 6.9和OpenSSH_5.3p1,OpenSSL 1.0.1e-fips)除root之外,我还有另一个用户,它可以正常工作。只有root会出现上述错误。其他文件夹和文件权限都是正确的。 - Chaminda Bandara
显示剩余2条评论

38

其他答案提供了一些帮助,但并不完全符合要求,我希望能够补充一些思路。

首先,正如接受的答案所述,编辑

/etc/ssh/sshd_config

并设置日志级别:

LogLevel DEBUG3

然后在服务器上重新启动sshd以使用更改后的日志级别,例如:

sudo service ssh restart

尝试进行身份验证,当失败时,请查找日志文件:

/var/log/secure

它会有你正在寻找的错误。


/var/log/ 目录存在,但是 secure 不存在。我该如何发现正在写入哪个日志? - aliteralmind
13
在我的Ubuntu 14.04.1中,默认日志路径是/var/log/auth.log - Axel Kemper
是的!谢谢你!原来我的公钥文件末尾有一个看不见的 \n。 - alextsil
1
Linux/Ubuntu真是让人沮丧。在阅读@axel的评论之前,我花了好20分钟试图弄清楚为什么没有“secure”文件。 - JYelton
我找不到任何Ubuntu日志文件,最终按照https://serverfault.com/a/1054725/698635中提到的方法使用“journalctl -t sshd -b0 -r”读取了日志。 - Nir

23
在我的情况下,我不得不将/home/user的权限从0755更改为0700。

1
这是我的问题和解决方案。 - pstanton
6
对于我自己,将文件夹权限设置为700,authorized_keys文件权限设置为600,解决了这个问题。 - David Soussan
1
对我来说,将.ssh文件夹的chmod设置为700,authorized_keys的chmod设置为600解决了这个问题。 - Iwo Kucharski
我的问题得到了解决,只需将.ssh文件夹权限设置为700,authorized_keys文件权限设置为600即可。 - Deep-B

22
在我的情况下,这是一个权限问题。 我将日志级别更改为DEBUG3,在/var/log/secure中我看到了这一行:
Authentication refused: bad ownership or modes for directory

我谷歌搜索到了这篇文章:

https://www.daveperrett.com/articles/2010/09/14/ssh-authentication-refused/

chmod g-w /home/$USER
chmod 700 /home/$USER/.ssh
chmod 600 /home/$USER/.ssh/authorized_keys

基本上,它告诉我:

  • 去除您用户主目录的组w权限
  • .ssh目录的权限更改为700
  • authorized_keys文件的权限更改为600

那就可以了。

另外一件事是,即使我启用了root登录,我也无法使用root。最好使用其他用户。


4
这个答案的投票比较低。忽视家目录权限可能会导致你花费一整天来解决问题。 - chingNotCHing
谢谢你为我点赞。我只是分享我所拥有的。 - WesternGun
对于任何试图理解'bad ownership or modes for directory'错误的人,我在这里发布帖子,因为我自己花了很多时间搜索才找到它的来源。这是由sshd_config中的StrictModes设置强制执行的。虽然不建议禁用它,但它对故障排除非常有帮助。 - Lockszmith

9
在运行Windows 8.1时,我遇到了“服务器拒绝了我们的密钥”问题。按照指南:https://winscp.net/eng/docs/guide_windows_openssh_server,使用Windows登录的用户名密码很容易建立连接。然而,当使用私钥用户名进行身份验证时,响应是服务器拒绝了我们的密钥。使其能够使用公钥工作取决于文件权限:C:\ProgramData\ssh\administrators_authorized_keys。这是一个有用的页面:https://github.com/PowerShell/Win32-OpenSSH/wiki/Troubleshooting-Steps
停止两个OpenSSH服务,然后使用管理员权限打开一个命令提示符。然后运行: C:\OpenSSH-Win32>c:\OpenSSH-Win32\sshd.exe -ddd 注意:必须指定exe的完整路径,否则sshd会报错。这将创建一个一次性使用的连接监听器。-ddd是详细级别3。
连接后,扫描日志可发现:
debug1: trying public key file __PROGRAMDATA__/ssh/administrators_authorized_keys
debug3: Failed to open file:C:/ProgramData/ssh/administrators_authorized_keys error:2
debug1: Could not open authorized keys '__PROGRAMDATA__/ssh/administrators_authorized_keys':
        No such file or directory

需要创建文件:C:\ProgramData\ssh\administrators_authorized_keys,并将public key文本复制到其中,例如:ssh-rsa AAAA................MmpfXUCj rsa-key-20190505,然后保存文件。我将文件保存为UTF-8BOM的格式。没有测试ANSI

然后再次运行一次性命令行,在日志中显示:

debug1: trying public key file __PROGRAMDATA__/ssh/administrators_authorized_keys
debug3: Bad permissions. Try removing permissions for user: S-1-5-11 on file C:/ProgramData/ssh/administrators_authorized_keys.
        Authentication refused.

S-1-5-11是赋予System的名称。

为了解决Bad permissions问题,请右键单击administrators_authorized_keys文件,进入Security Tab,点击Advanced按钮并删除继承的权限。 然后删除所有Group or user names:,除了Windows登录用户名,例如:YourMachineName\usernameusername的权限应为Read AllowWrite Deny,其他都不选中。文件的所有者也应为YourMachineName\username

这样就解决了问题。

其他有用的链接:

https://github.com/PowerShell/Win32-OpenSSH/releases下载OpenSSH-Win32.zip

以下是使用WinSCPnet.dll连接到OpenSSH服务器的C#示例代码:https://winscp.net/eng/docs/library#csharp 以下是使用WinSCPnet.dll进行连接的代码片段:WinSCPnet.dll
static void WinSCPTest() {
    SessionOptions ops = new SessionOptions {
        Protocol = Protocol.Sftp, 
        PortNumber = 22,
        HostName = "192.168.1.188", 
        UserName = "user123",
        //Password = "Password1",
        SshHostKeyFingerprint = @"ssh-rsa 2048 qu0f........................ddowUUXA="
    };

    ops.SshPrivateKeyPath = @"C:\temp\rsa-key-20190505.ppk";

    using (Session session = new Session()) {
        session.Open(ops);
        MessageBox.Show("success");
    }
}

请用您自己的值替换SshHostKeyFingerprintSshPrivateKeyPath
编辑:添加管理员授权密钥文件权限截图: enter image description hereOpenSSH SSH Server作为服务运行时,只有System应该拥有权限。但是,如果从命令提示符中运行sshd.exe,则当前用户应该是唯一列出的用户(读取允许,写入拒绝)。

3
你在这里做了很多有帮助的事情。首先,在命令行上使用调试标志运行sshd。Windows服务系统日志几乎没有显示任何信息,完全无法进行调试。其次,作为管理员,有一个错误只查看administrators_authorized_keys文件,而不是期望的用户.ssh文件夹中的authorized_keys(每个人在Windows上运行sshd时的痛点)。最后是ProgramData中的“ssh”文件夹!我一直在想它将服务器证书放在哪里。所以,在你提供的信息之后,我终于解决了这个让我苦恼了一天左右的问题。谢谢! - Master James
这个答案是唯一在我使用全新的EC2实例Windows 2019免费版时有效的。 - yolob 21

7

如果您在0.75版本之前运行Putty,则更新Putty应该可以解决问题。

较新版本的openSSH(如Ubuntu 22.04)已经弃用了在登录期间使用SHA1哈希算法,但Putty在0.74版本之前使用了SHA1。

如果服务器上的sshd日志文件显示

$ sudo grep 'sshd' /var/log/auth.log
sshd[113232]: userauth_pubkey: key type ssh-rsa not in PubkeyAcceptedAlgorithms [preauth]

这实际上是导致错误的原因,一旦Putty更新后,它应该消失。

对我来说很有效。谢谢! - Xel Naga
谢谢,你的解决方案有效。 @not2savvy可以解释一下这是什么意思吗?是哈希还是加密不再支持了? 我找不到相关的参考资料。 - undefined
@YGautomo 如答案中所提到的,SHA1已经不再可用(被认为是不安全的)。 - undefined
对我也起作用了。谢谢! - undefined

4
我发现的简单解决方案是将authorized_keys文件从隐藏的.ssh目录移动到系统ssh目录中:
/etc/ssh/keys/authorized_keys

我这样做后,它就毫无问题地运行了。


4

在Windows Server 2008 R2上遇到相同的问题并探索了很多方法解决,最终通过以下步骤解决:

使用TextPad或其他文本编辑器打开C:\Program Files (x86)\OpenSSH\etc\sshd_config

取消以下行的注释,在删除后应该如下所示:

RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile  .ssh/authorized_keys

保存并尝试使用私钥登录。祝您愉快。


有时候安装ssh时,authorizedkeysfile行被注释掉了,所以它不知道在哪里查找授权密钥文件 :-( - kenyee
授权密钥文件需要哪些权限?它必须放在用户目录还是OpenSSH目录中? - GarfieldKlon
它应该在OpenSSH目录或您安装OpenSSH的位置。您应该能够找到它。 - Ravi Anand
请确保您使用管理员帐户进行设置。 - Ravi Anand

3
我添加这个答案是为了帮助那些像我一样,在网络上花费数小时却没有成功的人。
你的主文件夹可能已经被加密。或者说,任何包含您的“authorized_keys”文件的文件夹都可能被加密。天啊,这将节省我很多时间。要检查,请执行以下操作:
ls -A

在您想确定其加密状态的目录上。如果文件夹包含名为“.encryptfs”的文件夹,则答案是,是的,该文件夹已加密。这将阻止您访问包含用于验证的公共ssh密钥的“authorized_keys”文件。

要解决此问题,请将“authorized_key”文件放置在不包含加密的目录树中。


3
在添加密钥后,如果您使用的是Amazon Linux机器,请使用ec2-user登录,如果是Ubuntu机器,请使用ubuntu登录。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接