向〜/ .ssh / authorized_keys添加公钥不会自动登录


446

我将公共SSH密钥添加到了authenticated_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文件。这里有一个解决方案:bugs.launchpad.net/ubuntu/+source/openssh/+bug/362427/comments/...
丹尼尔·施弗

Answers:


1097

您需要验证authorized_keys文件及其所在的文件夹/父文件夹的权限。

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

有关更多信息,请参见此页面

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

chmod go-w ~

6
上面的内容确实有用,尽管“ chmod -R go-wrx foobar”不是很引人注目吗?为什么需要递归?
joachim 2012年

9
对于第二部分,不必进行递归操作,只需要这样做就chmod go-wrx foobar可以了。如果您可以对文件进行某些组或其他访问,则以递归方式进行操作可能会严重影响某些应用程序,尤其是在它是Web目录的情况下。
StingeyB

24
如OpenSSH常见问题解答所述,用户的home&.ssh目录仅需要写入已删除组/其他用户的权限(因此chmod go-w $HOME $HOME/.ssh可以解决问题)。因此,如果您愿意的话,两个目录的权限都可以设为755。最简单/侵入性最低的命令在FAQ中:openssh.org/faq.html#3.14
davidjb

3
直到我这么做了,为什么它对我不起作用chmod 700 ~/.ssh && chmod 644 ~/.ssh/authorized_keys?600在644处没有工作……
ficuscr 2014年

3
我还需要这样做,sudo chown -R {$USER}:{$USER} ~/.ssh/因为我已将authorized_keys文件写为root。
Zane Hooper

155

SELinux也可能导致authorized_keys无法使用。特别是对于CentOS 6和7中的root用户。确认权限正确后,您可以按以下方式解决此问题:

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

7
restorecon是你需要什么,你已经复制手工,例如文件到一个新的硬盘后。(在这种情况下,您可能应该在所有文件上运行它。可以解决其他奇怪的问题。)
ospalh 2015年

另一个快乐的露营者在这里。这是我在RHEL 6.5中
遇到的

2
9/10次,“为什么这样不起作用,它总是可以起作用”的问题是selinux问题。
安德鲁·怀特

在1and1(1und1)服务器上为我解决了问题
musicman

104

设置sshauthorized_keys似乎很简单,但隐藏了一些我想弄清楚的陷阱

-服务器-

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

-客户-

cygwin视为Linux仿真并安装并运行openssh

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

在这里只按ENTER键,您会在〜/ .ssh /中得到DEFAULT 2个文件“ id_rsa ”和“ id_rsa.pub ”,但是如果输入name_for_the_key,则生成的文件将保存在您的pwd中

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.日志记录ssh user_name@host_name仅适用于默认的id_rsa,因此这是第二个陷阱,您需要ssh -i path/to/key_name user@host

(使用ssh -v ...选项查看正在发生的情况)

如果服务器仍然要求输入密码,则您输入了smth。以输入密码:当您创建密钥(所以这是正常的)

如果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确保所有非根主目录的所有权和组所有权都是适当的。

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

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

7.考虑出色的 http://www.fail2ban.org

8. Extra ssh TUNNEL访问MySQL(绑定= 127.0.0.1)服务器


5
请注意,“仅4安全性”不只是为了安全性!如果它没有限制性权限,SSH将忽略该文件。
纳文2014年

确保所有权将是此列表的重要补充
steviejay 2015年

1
我不知道ssh-copy-id!单靠这一步就能做出很好的回答。
James Marble

1
chmod 755〜/ .ssh代替了我在其他地方看到的700似乎做到了
Jim W说恢复Monica


12

由于将id_rsa.pub文本从混乱的终端中复制出来,绝望的人也可能会确保他们在authorized_keys文件中没有多余的换行符。


2
这正是我发生的事情!两个端子的宽度相同,因此直到我打开行号以查看authorized_keys文件中的两行之前,很难弄清楚。
肖恩

1
这个。因此,我浪费了一个小时。这不是第一次。@bortunac的答案提到了ssh-copy-id工具,以后我将使用它来避免这种情况。
xdhmoore

7

请注意,即使所有权限似乎都不错,SELinux也会触发此错误。禁用它对我来说很成功(插入有关禁用它的常规免责声明)。


您可以看到SELinux干扰/var/log/audit/audit.logrestorecon -R -v /root/.ssh解决了我的具体情况。
Dave Goodell

7

用户是您的用户名

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

更适合扎根: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 # paste keys here!
Odysseus

7

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

更新的跟踪与密码保护的私钥一致。请参阅ssh-agent或使用ssh-keygen -p


5

编写命令:

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

完成此操作后,请确保您的目录是这样的:

drwx------ 2 lab lab 4.0K Mar 13 08:33 .
drwx------ 8 lab lab 4.0K Mar 13 08:07 ..
-rw------- 1 lab lab  436 Mar 13 08:33 authorized_keys
-rw------- 1 lab lab 1.7K Mar 13 07:35 id_rsa
-rw-r--r-- 1 lab lab  413 Mar 13 07:35 id_rsa.pub

1
您的答案与被接受的答案有何不同?您是3年后使用Ctrl + C Ctrl-V命令编写的吗?
毒刺

5

最终对我起作用的是确保所有者/组不是root而是用户:

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

chown:无效的用户:'/home/lsa/.ssh/'
Stepan

3

尝试对我有用的“ ssh-add”。


3

另一个要记住的技巧。自v7.0起,由于默认SSH的继承弱点,OpenSSH 会禁用它们。因此,如果您具有OpenSSH v7.0 +,请确保您的密钥不是ssh-dss

如果您卡在DSA密钥上,则可以通过以下方式更新您的sshd_config~/.ssh/config文件来在本地重新启用支持:PubkeyAcceptedKeyTypes=+ssh-dss


3

就我而言,我需要将authorized_keys文件放入.openssh

该位置/etc/ssh/sshd_config在选项下指定AuthorizedKeysFile %h/.ssh/authorized_keys


服务器上可能会发生一整类问题(当尝试从客户端连接时),如果不访问服务器就无法调试...这是设计使然,可以隐藏来自恶意客户端的信息,但使它更难调试。
qneill

2

确保目标用户设置了密码。运行passwd username设置一个。即使禁用了密码SSH登录,这对我也是必需的。



2

您必须注意的另一个问题。如果生成的文件不是默认文件, id_rsa 并且 id_rsa.pub

您必须创建.ssh / config文件并手动定义将与该连接一起使用的id文件。

示例在这里:

host remote_host_name
hostname 172.xx.xx.xx
user my_user
IdentityFile /home/my_user/.ssh/my_user_custom.pub

2
IdentityFile应该是私钥
Ken H

@KenH是的。是错别字。对此表示抱歉。
Kunthar

1

我发出sudo chmod 700 ~/.sshchmod 600 ~/.ssh/authorized_keyschmod go-w $HOME $HOME/.ssh从上面并固定在盒子CentOS7我的问题,我已经在尝试获取Samba共享工作搞砸了的权限。谢谢


1

好像是权限问题。如果某些文件/目录的权限设置不正确,通常会发生这种情况。在大多数情况下,它们是~/.ssh~/.ssh/*。就我而言/home/xxx

您可以通过修改/etc/ssh/sshd_config(search LogLevel,将其设置为DEBUG)来更改sshd的日志级别,然后检查输入内容/var/log/auth.log以查看发生了什么情况。


3
这看起来与接受的答案基本相同,可能应该是对此的评论,而不是答案。有了更多代表,您就可以发表评论。在此之前,请不要将答案用作解决方法。
内森·塔吉

抱歉,我认为这是解决所有此类问题的方法。现在,我知道该怎么做了,谢谢。
2015年

1

我的问题是修改的AuthorizedKeysFile,当时尚未运行用于填充/ etc / ssh / authorized_keys的自动化程序。

$sudo grep AuthorizedKeysFile /etc/ssh/sshd_config
#AuthorizedKeysFile .ssh/authorized_keys
AuthorizedKeysFile  /etc/ssh/authorized_keys/%u

1

只要看看上/var/log/auth.log服务器。在客户端用-vv设置其他详细信息将无济于事,因为服务器不太可能向可能的攻击者提供太多信息。


1

确保已将整个公钥复制到authorized_keys;该ssh rsa前缀是密钥起作用所必需的。


2
二手ssh-copy-id
vishnu

1

您需要验证文件的属性。分配所需的属性用途:

$ chmod 600 ~/.ssh/sshKey
$ chmod 644 ~/.ssh/sshKey.pub

1

/var/log/auth.log服务器上查看sshdauth错误。

如果所有其他方法均失败,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

0

关于这一点,请确保您的sshd配置具有-;

PermitRootLogin without-password

设置如上,然后重启sshd(/etc/init.d/sshd restart)

注销并再次尝试登录!

我相信默认是-;

PermitRootLogin no

0

就我而言,这是因为未在配置文件/ etc / ssh / sshd_config的AllowGroups中设置用户组。添加后,一切正常。


0

我的主目录位于非标准位置,并且在sshd日志中有以下行:

Could not open authorized keys '/data/home/user1/.ssh/authorized_keys': Permission denied

即使所有权限都很好(请参阅其他答案)。

我在这里找到了解决方案:http : //arstechnica.com/civis/viewtopic.php?p=25813191&sid=0876f069ec2aa5fdcd691a2e2e7242c2#p25813191

在我的情况下:

  • 在中添加了新行/etc/selinux/targeted/contexts/files/file_contexts.homedirs

    • 这是常规主目录的原始行:

      /home/[^/]*/\.ssh(/.*)? unconfined_u:object_r:ssh_home_t:s0

    • 这是我的新行:

      /data/home/[^/]*/\.ssh(/.*)? unconfined_u:object_r:ssh_home_t:s0

  • 随后是a restorecon -r /data/sshd重新启动


0

我遇到了这个问题,其他答案都没有解决,尽管其他答案当然正确的。

就我而言,事实证明/root目录本身(而不是例如/root/.ssh)具有错误的权限。我需要:

chown root.root /root
chmod 700 /root

当然,chmod 770无论如何,这些权限都应该是这样(也许)。然而,特别是防止sshd来自工作,即使/root/.ssh/root/.ssh/authorized_keys两个有正确的权限和所有者。


0

将登录用户的组添加到另一个用户时遇到此问题。假设有一个名为userA的ssh登录用户和一个非ssh登录用户userB。userA也具有组userA。我将userB修改为也有组userA。导致上述行为,因此userA在没有提示的情况下无法登录。从用户B中删除组userA后,没有提示的登录再次起作用。

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.