Putty:让服务器拒绝我们的关键错误

Paw*_*man 76 ssh putty

我创建了密钥对使用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
Run Code Online (Sandbox Code Playgroud)

所以这是正确的(一行,没有评论,从ssh-rsa开始,等等)

.ssh dir权限级别为700,authorized_keys文件权限为600.我尝试登录的实际用户拥有的目录和文件.

当我尝试连接时,我正在收到'server refused our key'服务器并要求输入密码.就这样./var/log/auth.log尝试使用密钥登录时未记录任何内容.

我到处寻找,所有文章和提示都提到为文件/目录设置chmod 600和700并正确格式化密钥.我已经做了所有这些仍然'拒绝我们的关键'错误,我没有想法.

Paw*_*man 54

好吧,我的钥匙上有一个小错字.显然,当粘贴到文件时,第一个字母被切断,它以sh-rsa而不是ssh-rsa开头.

nrathathaus - 你的答案非常有帮助,非常感谢,这个答案归功于你:)我喜欢你说并在sshd_conf中设置:

LogLevel DEBUG3
Run Code Online (Sandbox Code Playgroud)

通过查看日志,我意识到sshd正确读取密钥但由于标识符不正确而拒绝它.

  • 完全相同的问题:) (6认同)
  • @ user1046647`LogLevel`在`/ etc/ssh/sshd_config`中定义.除非在`sshd_config`中另行定义,否则缺省日志为`/ var/log/auth.log`. (3认同)
  • !`sudo service ssh restart` 以使更改生效。否则我的身份验证日志文件中没有任何内容。 (3认同)
  • 如果你在vim中打开authorized_key并立即尝试粘贴'ssh_rsa'中的第一个's'被视为vim命令,之后vim将切换到插入模式并且剩下的文本被粘贴.如果你之前进入插入模式粘贴(例如使用"i")领先的's'不会被削减. (2认同)

Ran*_*nty 25

添加一些想法作为其他答案有帮助,但不完全适合.

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

/etc/ssh/sshd_config
Run Code Online (Sandbox Code Playgroud)

并设置日志级别:

LogLevel DEBUG3
Run Code Online (Sandbox Code Playgroud)

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

/var/log/secure
Run Code Online (Sandbox Code Playgroud)

它会有你想要的错误.

  • 默认为`/ var/log/auth.log`,至少在我的Ubuntu 14.04.1中. (7认同)

Ati*_*tif 16

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

  • 并且对于我自己文件夹700和authorized_keys 600解决了该问题 (4认同)

Wes*_*Gun 10

在我的情况下,是一个权限问题.

我将日志级别更改为DEBUG3,在/var/log/secure我看到这一行:

Authentication refused: bad ownership or modes for directory
Run Code Online (Sandbox Code Playgroud)

谷歌搜索,我发现这篇文章:

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

chmod g-w /home/your_user
chmod 700 /home/your_user/.ssh
chmod 600 /home/your_user/.ssh/authorized_keys
Run Code Online (Sandbox Code Playgroud)

基本上,它告诉我:

  • 摆脱w用户主目录的组权限
  • 更改权限700的的.ssh目录
  • 更改权限600的的authorized_keys文件.

这很有效.

另一件事是,即使我启用root登录,我也无法开始root工作.更好地使用其他用户.

  • 这个答案被低估了。被忽视的主目录权限可能会花费您一整天的时间来排除故障。 (4认同)

not*_*vvy 9

如果您在 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]
Run Code Online (Sandbox Code Playgroud)

那么这实际上是导致错误的原因,并且在更新 Putty 后它应该会消失。


Loa*_*ing 7

运行 Windows 8.1 我遇到了这个server refused our key问题。

遵循指南:https : //winscp.net/eng/docs/guide_windows_openssh_server 使用 Windows 登录usernamepassword. 但是,username结合 a 进行身份验证private key,响应为server refused our key

让它与公钥一起工作归结为文件权限: C:\ProgramData\ssh\administrators_authorized_keys

这是一个有用的页面:https : //github.com/PowerShell/Win32-OpenSSH/wiki/Troubleshooting-Steps

停止两个 OpenSSH 服务,然后command promptadmin permissions. 然后运行: 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
Run Code Online (Sandbox Code Playgroud)

必须创建文件: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.
Run Code Online (Sandbox Code Playgroud)

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

要修复Bad permissions,右键单击administrators_authorized_keys文件,转到Security Tab,单击Advanced按钮并删除继承的权限。然后删除Group or user names:除 Windows 登录用户名之外的所有用户名,例如:YourMachineName\username 该权限username应为Read AllowWrite Deny其他所有内容均未选中。文件的所有者也应该是YourMachineName\username

这解决了问题。

其他有用的链接:

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

如何使用 WinSCPnet.dll 连接到 OpenSSH 服务器的 C# 示例:https ://winscp.net/eng/docs/library#csharp

以下是使用 建立连接的代码片段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");
    }
}
Run Code Online (Sandbox Code Playgroud)

用你自己的价值观替换SshHostKeyFingerprintSshPrivateKeyPath

编辑:添加了 administrators_authorized_keys 文件权限的截图: 在此处输入图片说明

OpenSSH SSH Server作为服务运行时,那么只System应该有权限。但是,如果sshd.exe从命令提示符运行,则当前用户应该是唯一列出的用户(读允许、写拒绝)。

  • 你在这里做了很多有帮助的事情。首先在命令行上运行带有调试标志的 sshd。Windows 服务系统日志显示的很少,完全没有用于调试。其次,主要事实是,作为管理员,存在一个错误,它只在 administrators_authorized_keys 文件中查找,而不是在预期的 Users .ssh 文件夹中查找 authorized_keys(每个人在 Windows 上运行 sshd 的悲痛点)。最后是 ProgramData 中的“ssh”文件夹!我想知道它把服务器证书等放在哪里。所以在我挠了一天左右的时间后,只有你在这里的信息对我有帮助。谢谢! (3认同)