将公钥添加到~/.ssh/authorized_keys文件中并不能自动登录

525

我将公共SSH密钥添加到了authorized_keys文件中。ssh localhost应该可以直接登录而不需要输入密码。

我已经这样做了并尝试键入ssh localhost,但仍然要求我输入密码。是否还有其他设置需要更改才能使其正常工作?

我已按照更改权限的说明进行操作:

如果我执行ssh -v localhost,则以下是结果。

debug1: Reading configuration data /home/john/.ssh/config
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: Applying options for *
debug1: Connecting to localhost [127.0.0.1] port 22.
debug1: Connection established.
debug1: identity file /home/john/.ssh/identity type 1
debug1: identity file /home/john/.ssh/id_rsa type -1
debug1: identity file /home/john/.ssh/id_dsa type -1
debug1: Remote protocol version 2.0, remote software version OpenSSH_4.7p1 Debian-8ubuntu3
debug1: match: OpenSSH_4.7p1 Debian-8ubuntu3 pat OpenSSH*
debug1: Enabling compatibility mode for protocol 2.0
debug1: Local version string SSH-2.0-OpenSSH_4.7p1 Debian-8ubuntu3
debug1: SSH2_MSG_KEXINIT sent
debug1: SSH2_MSG_KEXINIT received
debug1: kex: server->client aes128-cbc hmac-md5 none
debug1: kex: client->server aes128-cbc hmac-md5 none
debug1: SSH2_MSG_KEX_DH_GEX_REQUEST(1024<1024<8192) sent
debug1: expecting SSH2_MSG_KEX_DH_GEX_GROUP
debug1: SSH2_MSG_KEX_DH_GEX_INIT sent
debug1: expecting SSH2_MSG_KEX_DH_GEX_REPLY
debug1: Host 'localhost' is known and matches the RSA host key.
debug1: Found key in /home/john/.ssh/known_hosts:12
debug1: ssh_rsa_verify: signature correct
debug1: SSH2_MSG_NEWKEYS sent
debug1: expecting SSH2_MSG_NEWKEYS
debug1: SSH2_MSG_NEWKEYS received
debug1: SSH2_MSG_SERVICE_REQUEST sent
debug1: SSH2_MSG_SERVICE_ACCEPT received
debug1: Authentications that can continue: publickey,password
debug1: Next authentication method: publickey
debug1: Offering public key: /home/john/.ssh/identity
debug1: Server accepts key: pkalg ssh-rsa blen 149
debug1: PEM_read_PrivateKey failed
debug1: read PEM private key done: type <unknown>

然后在上述日志之后它会要求输入密码。为什么它不允许我无密码登录?


5
虽然这里不是这种情况,但如果你从Google来,并且正在使用加密的主目录,sshd将无法访问它,因此也无法读取你的authorized_keys文件。以下是解决方案:https://bugs.launchpad.net/ubuntu/+source/openssh/+bug/362427/comments/12 - Daniel Schaffer
32个回答

1265
你需要验证authorized_keys文件以及它所在的文件夹/父文件夹的权限。
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys

更多信息请参见此页面

您可能还需要更改/验证您主目录的权限以删除组和其他人的写访问权限。

chmod go-w ~

8
以上的某些内容起了作用,但是"chmod -R go-wrx foobar"是否有些过激?为什么需要递归操作? - joachim
12
对于第二部分,不必使其递归,只需执行chmod go-wrx foobar即可。如果您对文件具有某些组或其他访问权限,尤其是在Web目录中,递归执行可能会严重影响某些应用程序。 - StingeyB
29
如OpenSSH FAQ所述,用户的主目录和.ssh目录只需要移除组/其他的写入权限(因此“chmod go-w $ HOME $ HOME /.ssh”就可以做到)。 因此,如果您愿意,这两个目录的权限可以像755一样“开放”。 FAQ中提供了最简单/最不具侵入性的命令:http://www.openssh.org/faq.html#3.14 - davidjb
4
为什么在我执行chmod 700 ~/.ssh && chmod 644 ~/.ssh/authorized_keys之前,使用600权限不起作用,而使用644权限才可以生效? - ficuscr
4
我还需要运行sudo chown -R {$USER}:{$USER} ~/.ssh/,因为我用root身份写了authorized_keys文件。 - Zane
显示剩余12条评论

169

SELinux 也可能导致authorized_keys不能正常工作,特别是在CentOS 6和7的root用户上。但并不需要禁用它。

一旦您确认权限正确无误,可以采取以下方式解决此问题:

chmod 700 /root/.ssh
chmod 600 /root/.ssh/authorized_keys
restorecon -R -v /root/.ssh

9
在您手动复制文件(例如到新硬盘驱动器)后,您需要运行restorecon。在这种情况下,最好对所有文件运行它。这可能会解决其他奇怪的问题。 - ospalh
这里又是一个快乐的营地居民。这是我在RHEL 6.5中遇到的问题。 - Antonio Ortells
3
9次中有10次出现“为什么这不起作用,它总是能用”的问题都是SELinux问题。 - Andrew White
在1and1(1und1)服务器上为我解决了问题。 - musicman
在将主目录迁移到另一个硬盘时,我在 Fedora 35 上解决了这个问题。 - MeetTitan

123

设置ssh authorized_keys似乎很简单,但其中隐藏了一些陷阱,我正试图弄清楚。

-- 服务器 --

/etc/ssh/sshd_config中,设置passwordAuthentication yes以让服务器暂时接受密码身份验证

-- 客户端 --

Cygwin视为Linux仿真并安装和运行OpenSSH

1.生成私钥和公钥(客户端) # ssh-keygen

在这里,只需按下Enter,即可获得默认的两个文件,"id_rsa"和"id_rsa.pub",它们位于~/.ssh/中,但如果您给出一个密钥名称,则生成的文件将保存在您的当前工作目录中。

2.your_key.pub文件传输到目标机器,ssh-copy-id user_name@host_name

如果您没有创建默认密钥,则这是出错的第一步......您应该使用:

ssh-copy-id -i path/to/key_name.pub user_name@host_name

3.仅对于默认的id_rsa文件,才能使用ssh user_name@host_name进行登录,因此这是第二个陷阱。您需要执行ssh -i path/to/key_name user@host

(使用ssh -v ...选项查看发生了什么。)

如果服务器仍然要求输入密码,则您输入了错误的内容。当您创建密钥时,需要输入口令:(因此很正常)。

如果ssh未在默认端口22上侦听,则必须使用ssh -p port_nr

-- 服务器 -----

4. 修改文件/etc/ssh/sshd_config以包含

RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile  %h/.ssh/authorized_keys

(如果需要)取消注释

这会告诉ssh接受authorized_keys文件,并在用户主目录中查找.ssh/authorized_keys文件中写入的key_name字符串。

5 在目标机器上设置权限

chmod 755 ~/.ssh
chmod 600 ~/.ssh/authorized_keys

同时关闭密码认证,

passwordAuthentication no

以关闭所有ssh root/admin/....@your_domain的尝试。

6. 确保所有非root主目录的所有权和组所有权是适当的。

chown -R ~ usernamehere
chgrp -R ~/.ssh/ user

===============================================

7. 请考虑优秀的http://www.fail2ban.org

8. 参见SSH tunnel以访问绑定为127.0.0.1的MySQL服务器


6
请注意,“just 4 security”不仅仅是为了安全!如果文件没有受限制的权限,SSH将忽略该文件。 - Navin
确保所有权将是此列表的重要补充。 - steviesh
2
我之前完全不知道 ssh-copy-id 这个命令!单独这一步就足以成为一个很好的答案。 - James Marble
2
将chmod 755 ~/.ssh而不是其他地方看到的700似乎可以解决问题。 - Jim W says reinstate Monica
1
哇...我的问题是“默认命名”(第二步)。SSH在“.ssh”中没有找到任何文件?这让我浪费了几天时间...非常感谢! - Sunchezz
AuthorizedKeysFile %h/.ssh/authorized_keys 这行很重要,特别是如果您已经成功地做了一些聪明的事情,比如告诉它忽略用户的授权密钥文件以提高安全性。 - Drazisil

41

同时确保您的主目录不可被其他人写入:

chmod g-w,o-w /home/USERNAME

这个答案是从这里抄来的。


4
执行以下命令:chmod 700 ~/.ssh ; chmod 600 ~/.ssh/authorized_keys ; chmod g-w,o-w ~这对我很有帮助。谢谢。 - gbraad
1
为什么不直接使用 chmod og-w /home/USERNAME 呢? - Paramvir Singh Karwal

16

在复制 id_rsa.pub 的文本时,绝望的人也要确保 authorized_keys 文件中没有多余的换行符,以避免出现终端混乱。


2
这正是我所遇到的问题!两个终端宽度相同,因此很难弄清楚,直到我打开行号才看到授权密钥文件中有两行。 - Shawn
1
这就是问题所在。我因此浪费了一个小时,而且不是第一次了。@bortunac的答案提到了ssh-copy-id工具,我将来会使用它来避免这种情况。 - xdhmoore
我使用more而不是cat获取了id_rsa.pub的内容,这是致命的,因为存在看不见的换行符。 - Dan Halbert

8

将公钥列在 .ssh/authorized_keys 中是必要的,但不足以使 sshd(服务器)接受它。如果您的私钥受到密码保护,则每次需要向 ssh(客户端)提供密码。或者您可以使用 ssh-agent 或 GNOME 等程序。

您的更新的跟踪结果表明私钥受到密码保护。请参阅 ssh-agent 或使用 ssh-keygen -p


8
在下文中,“用户”指的是您的用户名。
mkdir -p /home/user/.ssh
ssh-keygen -t rsa
touch /home/user/.ssh/authorized_keys
touch /home/user/.ssh/known_hosts
chown -R user:user /home/user/.ssh
chmod 700 /home/user/.ssh
chmod 600 /home/user/.ssh/id*
chmod 644 /home/user/.ssh/id*.pub
chmod 644 /home/user/.ssh/authorized_keys
chmod 644 /home/user/.ssh/known_hosts

更适合root用户的命令: mkdir -p /home/$USER/.ssh && chown -R $USER:$USER /home/$USER/.ssh && sudo -u $USER ssh-keygen -t rsa && touch /home/$USER/.ssh/authorized_keys && touch /home/$USER/.ssh/known_hosts && chmod 700 /home/$USER/.ssh && chmod 600 /home/$USER/.ssh/id* && chmod 644 /home/$USER/.ssh/id*.pub && chmod 644 /home/$USER/.ssh/authorized_keys && chmod 644 /home/$USER/.ssh/known_hosts && vim /home/$USER/.ssh/authorized_keys # 在此处粘贴密钥! - Odysseus

7

请注意,SELinux也可能会引起此错误,即使所有权限似乎都没问题。对我来说,禁用它解决了问题(关于禁用它的免责声明通常会被提到)。


您可以在/var/log/audit/audit.log中看到SELinux的干扰。restorecon -R -v /root/.ssh修复了我的特定情况。 - Dave Goodell

6

请在服务器上查看文件/var/log/auth.log,以查找sshd身份验证错误。

如果所有其他方法都失败了,请以调试模式运行sshd服务器:

sudo /usr/sbin/sshd -ddd -p 2200

然后从客户端连接:

ssh user@host -p 2200

在我的情况下,我发现错误部分位于结尾处:
    debug1: userauth_pubkey: test whether pkalg/pkblob are acceptable for RSA SHA256:6bL+waAtghY5BOaY9i+pIX9wHJHvY4r/mOh2YaL9RvQ [preauth]
==> debug2: userauth_pubkey: disabled because of invalid user [preauth]
    debug2: userauth_pubkey: authenticated 0 pkalg ssh-rsa [preauth]
    debug3: userauth_finish: failure partial=0 next methods="publickey,password" [preauth]
    debug3: send packet: type 51 [preauth]
    debug3: receive packet: type 50 [preauth]

通过这个信息,我意识到我的 sshd_config 文件限制了只有 ssh 组的成员可以登录。下面的命令修复了这个权限错误:

sudo usermod -a -G ssh NEW_USER

这个额外的日志非常有用,谢谢!它向我展示了我的一个密钥——复制和粘贴到authorized_keys中——其中间有一个换行符! - Quentin Stafford-Fraser

5
尝试使用"ssh-add"命令,这对我有用。

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