尝试对密钥文件进行ssh身份验证:服务器拒绝了我们的密钥


53

我正在尝试使用密钥文件而不是用户名/密码来设置ssh身份验证。客户端是运行PuTTY的Windows盒,服务器是Ubuntu 12.04 LTS服务器。

我下载了puttygen.exe并生成了密钥对。在/etc/ssh/sshd_config我这行:

AuthorizedKeysFile %h/.ssh/authorized_keys

在我客户的公共密钥文件上显示:

---- BEGIN SSH2 PUBLIC KEY ----
Comment: "my@email.address.com"
ssh-rsa AAAAB3NzaC1yc2EAAAABJQAAAIEAr3Qo6T5XU06ZigGOd3eKvfBhFLhg5kWv8lz6
qJ2G9XCbexlPQGanPhh+vcPkhor6+7OmB+WSdHeNO652kTofnauTKcTCbHjsT7cJ
GNrO8WVURRh4fabknUHPmauerWQZ6TgRPGaz0aucU+2C+DUo2SKVFDir1vb+4u83
AV1pKxs=my@email.address.com
---- END SSH2 PUBLIC KEY ----

我将部分内容从“ ssh-rsa AAA”复制到“ my@email.address.com”,并将其~/.ssh/authorized_keys放在服务器上的文件中(在自己的家庭文件夹中)。在PuTTY中的连接> SSH>身份验证下,我输入了它在客户端上生成的私钥的路径,并保存了会话设置。

我用重新启动了ssh服务器

sudo service ssh restart

现在,如果我将配置文件加载到PuTTY中(我确认私钥仍在“连接”>“ SSH”>“身份验证”中,并且路径正确)并运行该配置文件,它会说

Server refused our key

我尝试将公共密钥放在目录下的文件中, ./ssh/authorized_keys/但这无济于事,所以我将其./ssh/authorized_keys用作文件,将密钥粘贴到其中。我还尝试在服务器上生成私钥/公钥对,将公钥放入./ssh/authorized_files并在客户端上的PuTTY中加载私钥。重新启动服务器也无济于事。

我发现可以通过将密钥放在用户主文件夹之外的某个位置来解决该错误,但这仅在主文件夹经过加密的情况下才有用,而这个不是。

还尝试生成4096位密钥,认为1024太短了。

我怎样才能使它工作?谢谢!

编辑:

好的,/var/log/auth.log说:

sshd: Authentication refused: bad ownership or modes for directory /home/vorkbaard/.ssh

Google告诉我~/.ssh/应该是700,~/.ssh/authorized_keys应该是600,所以我做到了。现在/var/log/auth.log说:

sshd: error: key_read: uudecode AAAAB3N [etc etc etc until about 3/4 of my public key]

Answers:


95

好的,它已修复,但是我看不出它与我已经尝试过的有什么不同。

我做了什么:

  • 使用puttygen.exe生成密钥对(长度:1024位)
  • 在PuTTY配置文件中加载私钥
  • ~/.ssh/authorized_keys 在同一行中输入公共密钥(需要以开头ssh-rsa
  • chmod 700 ~/.ssh
  • chmod 600 ~/.ssh/authorized_keys
  • chown $USER:$USER ~/.ssh -R
  • 变化,/etc/ssh/sshd_config所以它包含AuthorizedKeysFile %h/.ssh/authorized_keys
  • sudo service ssh restart

进行故障排除# tail -f /var/log/auth.log

谢谢你的帮助!


1
嗯,那么那个sshd: error: key_read: uudecode AAAAB3N错误发生了什么auth.log呢?
Alaa Ali 2013年

我没头绪,阿拉。也许我粘贴上一个键字符串时出错。Auth.log现在不再有任何条目,并且基于密钥的身份验证可以完美地工作。我的主要问题是,我真的不知道关于什么需要做,使得如何更加困难。所以我不知道为什么,但是它有效。再次感谢您的帮助:)
Forkbeard

太棒了!!! 我已经挠了两天。这个答案可以节省一天!
naka,2014年

步骤3是我的诀窍。我没有将公钥放入authorized_keys文件中,只是将文件粘贴mykey.pub~/.ssh文件夹中,并认为它将被提取。相反,我最终需要的是运行此命令或编辑并粘贴在其​​中可能存在的其他键下面。cat mykey.pub >> authorized_keys。现在看来很简单,但是吸取的教训是所有公钥都必须存在于目录中,authorized_keys而不仅仅是~/.ssh/目录中。有人请告知这是否是正确的断言。
2014年

如果这些步骤无济于事,请检查以下内容:1.您将保存的PuTTY公钥复制到了authentic_keys中,而不是OpenSSH中。2.如果您使用PuTTYgen中的复制/粘贴复制了您(应该这样做),则可能是多行公钥;它应该是一行;确保您在复制时没有添加前导或尾随空格,这要感谢r_hartman centos.org/forums/viewtopic.php?t=990
mvladk 2014年

23

我刚遇到这个问题。尽管已经正确配置了该线程中已经提到的配置(对authorized_keys等的许可),但事实证明我的公钥格式错误。它的形式为:

---- BEGIN SSH2 PUBLIC KEY ----
Comment: "imported-openssh-key"
AAAAB3NzaC1yc2EAAAADAQABAAABAQDUoj0N3vuLpeviGvZTasGQ...
... lPmTrOfVTxI9wjax2JvKcyE0fiNMzXO7qiHJsQM9G9ZB4Lkf71kT
---- END SSH2 PUBLIC KEY ----

哪个不起作用。但是使其具有以下形式可以正常工作:

ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDU.....j0N3vuLpeviGvZTasGQa1rcJiPXQMW7v3uurb+n94B9MQaaWR0odsg5DJQL92TNenOda5BO1nd08y6+sdLQmHXExTz6X8FzgoVsAkEl3RscxcxHUksiKA9JfTo38vQvG/bPxIHMCuSumCQVA1laf3rO/uOrkcB7iMWhaoi1/z6AbFtPzeh7xjGfInMWwtBI0CsHSRF73VWIxT26w0P+KjafCjSn/7vDO1bT8QHujSQelU/GqaVEvbbvPl1a7POVjKgHLNekolwRKfNeVEewcnmZaoqfHgOKlPmTrOfVTxI9wjax2JvKcyE0fiNMzXO7qiHJsQM9G9ZB4Lkf71kT UserName@HOSTNAME

14
您可以ssh-keygen -i -f filenameofwindowsformpub.key用来将公钥转换为您的OpenSSH服务器可以理解的格式。
黑色

是的,它对我有用!它必须在一行中。简直不敢相信!
adelriosantiago

1
嗨kuraara我认为@Black的上述指示应在答案中突出。
ekerner

我可以添加注释到OpenSSH服务器格式吗?对于人类来说,很难分辨出该键代表什么计算机。
user1700890

当我遵循@Black的建议时,字符串末尾没有UserName @ HOSTNAME。我不知道那部分是否重要。
arnoldbird '18

9

问题是Windows使用的换行不同于linux,因此将密钥从Windows复制到linux 时,该行的末尾有一个\ n,您在编辑器中的linux上看不到。

如果拖尾/var/log/auth.log并尝试登录,则错误如下:

sshd:错误:key_read:uudecode AAAAB3N [....] == \ n

如果您在Windows上更改密钥,因此将其更改为一行而不在末尾添加新行,然后将其复制到linux,则它应该可以工作(这是我的诀窍)。


这是我的问题,但是我在auth.log中没有看到任何提示。令人沮丧的...
安东尼

8

我必须将权限更改为主目录

chmod 700 ~

2
这对我也很有效(尽管在AIX上)。
stevepastelan'2

也在CentOS上为我工作
Jaywalker

在Redhat上为我工作!组写访问权限似乎是特定问题。如果我仍然保留组读取权限,仍然对我有用:“ chmod 740〜”。
保罗

6

我不得不将〜/ .ssh目录权限从770更改为700,并将〜/ .ssh / authorized_keys文件权限从660更改为600。

由于某些原因,删除组权限为我解决了此问题。

chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys

5

~/.ssh/authorized_keys文件要求密钥必须全部放在一行上。如果像上面的粘贴一样在多行中添加了它,请尝试合并这些行。


谢谢,这很有意义,现在我明白了为什么它是文件而不是目录。但是它没有帮助。
Forkbeard

3
对于可能对此感到困惑的任何人,他的意思是每个密钥本身必须在同一行上,但是不同的密钥需要在不同的行上。
安东尼

2

这对我有用:

在中puttygen,在生成密钥后,请确保从顶部字段复制并粘贴信息,以将其放入您的authorized_keys文件中。如果将公用密钥保存到客户端计算机,然后将其打开,则该文本与puttygen屏幕顶部的文本不同。同样,请确保puttygen您已将屏幕顶部中的文本复制并粘贴(在创建密钥之后)到应该位于中的authorized_keys文件中~/.ssh


这实际上解决了问题。我不明白为什么如果您单击保存公共密钥,为什么它不保存正确的格式。
幸运

1

除了上述所有答案外,请确保您puttygen正确地复制并粘贴了密钥!

如果您只是双击大部分的键串以选择它,则可能无法获得整个字符串,因为文本框会在某些字符(例如)上分割行+,因此您不必在+字符(因为文本框太小而看不到)。请确保手动选择整个字符串,从ssh-rsa到文本框的最后。


1

有时将公钥放在一行上可能是一个问题,这种方法似乎可以解决它

echo 'the content of the public key' > /root/.ssh/authorized_keys

1

对我来说,问题是我是~/.ssh/authorized_keys使用root 创建的,因此拥有root。我不得不chown sshuser:sshuser ~/.ssh/authorized_keys然后它开始工作


1

我也遇到了此错误,并通过将authorized_keys文件的权限更改为来解决了该错误600

chmod 600 ~/.ssh/authorized_keys

1

常见错误是人们使用文本编辑器(如Vim)并在激活“插入”之前粘贴复制的文本(粘贴前在Vim中按+ i)


0

实际上,我将authorized_keys的权限更改为644,然后问题解决了。

chmod 644 ~/.ssh/authorized_keys

0

调试打开的ssh可以使用:

sudo `which sshd` -p 2020 -Dd

它在其他端口2020上运行sshd。它作为当前程序运行sshd,因此输出进入屏幕。如果关闭,则关闭。

然后尝试连接。

说明:

  • `哪个sshd`-找到sshd地址,尝试执行哪个sshd以查看其打印内容。使用反引号时,它将执行并返回结果。
  • -p 2020-指定端口
  • -D-记录到文件
  • -d-登录到屏幕

https://www.attachmate.com/documentation/rsit-unix-802/rsit-unix-guide/data/sshd_options_ap.htm


您能否扩展这个答案?论点意味着什么?命令在做什么(对于没有经验的人)?
Zzzach ...

-1

我以root用户身份登录时创建了.ssh和authorized_keys文件,这赋予了错误的权限。它还将所有文件放在根目录下。

将这些文件的所有权更改为所需的用户不是一个好习惯,因此,我回溯了自己的步骤,并确保以要使用SSH的用户身份登录,并再次创建了.ssh和authorized_keys。

将Win7连接到Xubuntu 15.04服务器的说明: 如何创建带有Putty的SSH密钥以连接到VPS

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.