为什么我仍然收到带有公钥身份验证的 ssh 的密码提示?

Tho*_*hom 597 ssh key-authentication

我正在使用我在这里找到的 URL:

http://web.archive.org/web/20160404025901/http://jaybyjayfresh.com/2009/02/04/logging-in-without-a-password-certificates-ssh/

我的 ssh 客户端是 Ubuntu 64 位 11.10 桌面,我的服务器是 Centos 6.2 64 位。我已按照指示进行操作。我仍然在 ssh 上收到密码提示。

我不知道接下来要做什么。

Rob*_*Rob 721

确保~/.ssh目录及其内容的权限正确。当我第一次设置我的 ssh 密钥身份验证时,我没有~/.ssh正确设置文件夹,它对我大喊大叫。

  • 您的主目录~、您的~/.ssh目录和~/.ssh/authorized_keys远程机器上的文件必须只能由您写入:rwx------并且rwxr-xr-x很好,但rwxrwx---不好¹,即使您是组中唯一的用户(如果您更喜欢数字模式:700755,不是775) .
    如果~/.sshauthorized_keys是符号链接,则检查规范路径(扩展符号链接)
  • 您的~/.ssh/authorized_keys文件(在远程机器上)必须是可读的(至少 400),但如果您要向其中添加更多密钥,则需要它也是可写的(600)。
  • 您的私钥文件(在本地机器上)必须只能由您读写:rw-------,即600.
  • 此外,如果 SELinux 设置为 enforcing,您可能需要运行restorecon -R -v ~/.ssh(参见例如Ubuntu 错误 965663Debian 错误报告 #658675;这已在 CentOS 6 中修补)。

¹某些发行版(Debian 和衍生版)除外,如果您是组中的唯一用户,它们已修补代码以允许组可写。

  • 非常感谢您指出 restorecon。一段时间以来,我一直在为这个问题挠头。 (46认同)
  • 奇怪的是,我遇到了一个朋友在他的 VPS 上设置的帐户问题,使公钥身份验证正常工作。我认为所有的权限都是正确的,但重要的是要记住 `/home/USER` 必须是 `700` 或 `755` (27认同)
  • `chmod -R 700 ~/.ssh` 为我工作以满足这个答案的限制(RHEL 7) (19认同)
  • 另外,将 -v 添加到您的 ssh 命令以查看该密钥会发生什么。`ssh -v user@host`。 (14认同)
  • 还记得检查所有者和组设置,我使用 RSYNC 复制了一个 authorized_keys 文件并且没有注意到所有者/组被设置为 1000 而不是 root! (3认同)
  • 我还必须确保我的 ~ 本身,`$HOME`,是适当的安全。出于某种原因,它最初是 775。`chmod 700 $HOME` 成功了。 (3认同)
  • 可能还需要运行 `restorecon -R -v ~/` 来恢复主目录上的上下文。我的主目录上的一些上下文设置与默认值不符,尽管在这里和其他帖子中尝试了所有其他建议超过两个小时,我仍然无法通过 SSH 公钥身份验证连接到我的服务器,直到我想还运行 `restorecon ` 在我家的 `~/` 目录中看到这里的建议后在 `~/.ssh` 上运行它!希望这对其他人有帮助。 (2认同)
  • restorecon 对我不起作用,但是这样做了: chcon -R unconfined_u:object_r:user_home_t:s0 /path/to/users/homedirectory/.ssh/ (2认同)

Tgr*_*Tgr 195

如果您对服务器具有 root 访问权限,那么解决此类问题的简单方法是在调试模式下运行 sshd,方法是/usr/sbin/sshd -d -p 2222在服务器上发出类似命令(需要 sshd 可执行文件的完整路径,which sshd可以提供帮助),然后使用ssh -p 2222 user@host. 这将强制 SSH 守护进程留在前台并显示有关每个连接的调试信息。寻找类似的东西

debug1: trying public key file /path/to/home/.ssh/authorized_keys
...
Authentication refused: bad ownership or modes for directory /path/to/home/
Run Code Online (Sandbox Code Playgroud)

如果无法使用替代端口,您可以暂时停止 SSH 守护程序并在调试模式下将其替换为一个。停止 SSH 守护进程不会终止现有连接,因此可以通过远程终端执行此操作,但有些风险 - 如果在调试替换未运行时连接确实以某种方式中断,您将被锁定在机器之外直到您可以重新启动它。所需的命令:

service ssh stop
/usr/sbin/sshd -d
#...debug output...
service ssh start
Run Code Online (Sandbox Code Playgroud)

(根据您的 Linux 发行版,第一行/最后一行可能是systemctl stop sshd.service/systemctl start sshd.service代替。)

  • 我刚试过这个......当我运行`sshd -d`时它工作正常,但是一旦我真正运行`service sshd start`就失败了。我确定这很简单,但我不是 Linux 专家。有什么想法吗? (5认同)
  • 作为参考,[这篇文章](http://serverfault.com/questions/321534/public-key-authentication-fails-only-when-sshd-is-daemon) 解释了解决我的问题的 SELinux 解决方案。 (3认同)
  • 很好的建议,我的用户文件夹权限错误。 (3认同)
  • 我在让公钥认证工作时也遇到了麻烦,我很确定目录权限不是问题。在调试模式下运行SSH后,我很快发现我错了,权限是问题。 (2认同)
  • 谢谢你。出于各种原因,我的用户无法登录,因为 ansible (/bin/zsh) 在用户创建时指定的 shell 不存在。我永远不会猜到。 (2认同)
  • @Hatshepsut,是的(尽管您始终可以重新启动机器)。正如我所说,如果您可以访问其他端口,则可以运行第二个 SSH 守护程序而无需停止正常的守护程序,这绝对不会那么麻烦。 (2认同)

小智 59

你的家目录加密了吗?如果是这样,对于您的第一个 ssh 会话,您将必须提供密码。到同一台服务器的第二个 ssh 会话正在使用 auth 密钥。如果是这种情况,您可以将您authorized_keys的目录移动到未加密的目录并更改~/.ssh/config.

我最终做的是创建一个/etc/ssh/username文件夹,由用户名拥有,具有正确的权限,并将authorized_keys文件放在那里。然后将 AuthorizedKeysFile 指令更改/etc/ssh/config为:

AuthorizedKeysFile    /etc/ssh/%u/authorized_keys
Run Code Online (Sandbox Code Playgroud)

这允许多个用户在不影响权限的情况下拥有此 ssh 访问权限。

  • ubuntu 文档:https://help.ubuntu.com/community/SSH/OpenSSH/Keys#Troubleshooting (4认同)
  • 这个答案很重要并且对我有帮助 - 对于任何想知道这是否是问题的人 - 您可能会在 auth.log 中看到“pam_ecryptfs:Passphrase file wrapper”;不知何故,这还不足以让我记住 homedir 已加密。此外,您可能会发现第一次登录要求输入密码,后续会话则不需要(因为它在其他会话打开时被解密)。 (4认同)

小智 49

只需尝试以下这些命令

  1. ssh-keygen

    按 Enter 键直到出现提示

  2. ssh-copy-id -i root@ip_address

    (它会询问主机系统的密码)

  3. ssh root@ip_address

    现在您应该无需任何密码即可登录

  • 请注意,一般来说,允许远程 root 登录不是推荐的安全做法。 (7认同)
  • @nevelis:如果这对他们来说是显而易见的,他们就不会问。有些人是 ssh-keygen 的新手,他们可能不明白公钥和私钥在哪里。这就是他们在这里的原因。 (4认同)
  • 在哪个服务器上? (3认同)
  • @Amalgovinus 显然你在客户端上运行这个,而不是你正在连接的机器上 - 你不希望在服务器上有你的私钥的副本!:) (3认同)
  • 只是详细阐述这个答案:我不愿意使用 `ssh-copy-id` 因为我不熟悉它;我总是只是复制 .pub 文件,当它不起作用时,尝试使用“ssh -v”对其进行调试。但今天,经过半个小时的沮丧之后,我想管他呢,尝试使用这个实用程序吧。然后它就开始工作了。我不得不从远程计算机上的“authorized_keys”中清除一些不需要的密钥,但最终省去了很多麻烦。有时简单的方法确实更好。 (2认同)

小智 43

将密钥复制到远程机器并将它们放入其中后,authorized_keys您必须执行以下操作:

ssh-agent bash
ssh-add ~/.ssh/id_dsa or id_rsa
Run Code Online (Sandbox Code Playgroud)

  • 如果要在 ~/.ssh/config 中指定不同名称的密钥,这仍然是有用的建议(例如在主机 *.mydomain.org...IdentityFile ~/.ssh/some_limited_use.pub -- ssh-add ~/ .ssh/some_limited_use.pub)。 (11认同)
  • 正如上面评论中所指出的,如果您使用默认密钥之外的任何密钥,则默认情况下不会将其添加到 ssh 代理中。因此,请务必检查您要使用的密钥是否在代理的钥匙串中:`ssh-add -L` (2认同)

小智 38

当远程主目录没有正确的权限时,我遇到了挑战。在我的情况下,用户将主目录更改为777,以便在团队中进行一些本地访问。机器无法再使用 ssh 密钥连接。我将权限更改为744,然后它又开始工作了。

  • 我们也有这个问题 - 家庭目录上的 755 修复了它 (9认同)
  • 对于那些已经正确生成密钥但仍然提示输入密码的人来说,这很可能是答案。 (2认同)

小智 23

我们遇到了同样的问题,我们按照答案中的步骤操作。但它仍然对我们不起作用。我们的问题是登录可以从一个客户端运行,但不能从另一个客户端登录(.ssh 目录是 NFS 挂载的,并且两个客户端都使用相同的密钥)。

所以我们不得不更进一步。通过以详细模式运行 ssh 命令,您可以获得大量信息。

ssh -vv user@host
Run Code Online (Sandbox Code Playgroud)

我们发现默认密钥 (id_rsa) 未被接受,而是 ssh 客户端提供了一个与客户端主机名匹配的密钥:

debug1: Offering public key: /home/user/.ssh/id_rsa                                    
debug2: we sent a publickey packet, wait for reply                                        
debug1: Authentications that can continue: publickey,gssapi-keyex,gssapi-with-mic,password
debug1: Offering public key: /home/user/.ssh/id_dsa                                    
debug2: we sent a publickey packet, wait for reply                                        
debug1: Authentications that can continue: publickey,gssapi-keyex,gssapi-with-mic,password
debug1: Offering public key: user@myclient                                          
debug2: we sent a publickey packet, wait for reply                                        
debug1: Server accepts key: pkalg ssh-rsa blen 277                  
Run Code Online (Sandbox Code Playgroud)

显然,这不适用于任何其他客户端。

因此,我们的解决方案是将默认的 rsa 密钥切换到包含 user@myclient 的密钥。当密钥为默认值时,不会检查客户端名称。

然后我们遇到了另一个问题,在切换之后。显然,密钥缓存在本地 ssh 代理中,我们在调试日志中收到以下错误:

'Agent admitted failure to sign using the key'
Run Code Online (Sandbox Code Playgroud)

这是通过将密钥重新加载到 ssh 代理来解决的:

ssh-add
Run Code Online (Sandbox Code Playgroud)


Dav*_*osh 16

RedHat/CentOS 6上的SELinux存在公钥身份验证问题,可能是在创建某些文件时 selinux 未正确设置其 ACL。

要为 root 用户手动修复 SElinux ACL:

restorecon -R -v /root/.ssh
Run Code Online (Sandbox Code Playgroud)


小智 11

这将是服务器端的 SSH 未命中配置。必须编辑服务器端 sshd_config 文件。位于/etc/ssh/sshd_config。在该文件中,更改变量

  • ChallengeResponseAuthentication、PasswordAuthentication、UsePAM 的“是”到“否”

  • PubkeyAuthentication 的“否”到“是”

基于http://kaotickreation.com/2008/05/21/disable-ssh-password-authentication-for- added-security/


mar*_*arc 7

过去,我遇到过一些描述如何实现 ssh 无密码设置的教程,但有些教程是错误的。
让我们重新开始,检查每一步:

  1. 来自客户端- 生成密钥:ssh-keygen -t rsa
    公钥和私钥(id_rsa.pubid_rsa)将自动存储在~/.ssh/目录中。
    如果您使用空密码,设置会更容易。如果您不愿意这样做,那么仍然遵循本指南,但还要检查下面的要点。

  2. 从客户端- 将公钥复制到服务器ssh-copy-id user@server
    客户端公钥将被复制到服务器的位置 ~/.ssh/authorized_keys

  3. 从客户端- 连接到服务器:ssh user@server

现在,如果在执行上述 3 个步骤后仍然无法正常工作,请尝试以下操作:

  • 检查客户端服务器~/.ssh计算机中的文件夹权限。
  • 检查/etc/ssh/sshd_config服务器以确保和选项未被禁用,默认情况下可以使用启用它们RSAAuthenticationPubkeyAuthenticationUsePAMyes
  • 如果您在生成客户端密钥时输入了密码,那么您可以尝试ssh-agentssh-add会话中实现无密码连接。
  • 检查服务器/var/log/auth.log上的内容以查找根本跳过密钥身份验证的问题。


小智 6

确保AuthorizedKeysFile指向正确的位置,用作用%u户名的占位符:

# /etc/ssh/sshd_config
AuthorizedKeysFile /home/%u/authorized_keys
Run Code Online (Sandbox Code Playgroud)

可能您只需要取消注释该行:

AuthorizedKeysFile .ssh/authorized_keys

请注意,您必须重新加载 ssh 服务才能进行更改:

service sshd reload
Run Code Online (Sandbox Code Playgroud)


小智 6

我错误的一件事是服务器系统上我的主目录的所有权。服务器系统设置为默认:默认,所以我:

chown -R root:root /root
Run Code Online (Sandbox Code Playgroud)

它奏效了。另一个廉价的解决方法是禁用 StrictModes:StirctModes no。在 sshd_config.php 中 这至少会告诉您密钥交换和连接协议是否良好。然后你就可以去寻找坏权限了。


小智 6

我遇到了类似的问题,并使用调试模式按照步骤操作。

/usr/sbin/sshd -d
Run Code Online (Sandbox Code Playgroud)

这显示了以下结果

debug1: trying public key file /root/.ssh/authorized_keys
debug1: fd 4 clearing O_NONBLOCK
Authentication refused: bad ownership or modes for directory /root
debug1: restore_uid: 0/0
debug1: temporarily_use_uid: 0/0 (e=0/0)
debug1: trying public key file /root/.ssh/authorized_keys2
debug1: Could not open authorized keys '/root/.ssh/authorized_keys2': No such file or directory
debug1: restore_uid: 0/0
Failed publickey for root from 135.250.24.32 port 54553 ssh2
debug1: userauth-request for user root service ssh-connection method gssapi-with-mic
Run Code Online (Sandbox Code Playgroud)

真的很困惑

[root@sys-135 ~]# ls -l /
drwxrwxrwx.   2 root root     4096 Dec 14 20:05 bin
drwxrwxrwx.   5 root root     1024 May  6  2014 boot
drwxrwxrwx.   2 root root     4096 Dec  2  2013 cgroup
drwxrwxrwx.  10 root root     1024 Sep 25 23:46 data
drwxrwxrwx. 124 root root    12288 Dec 16 10:26 etc
drwxrwxrwx.  11 root root     4096 Jan 14  2014 lib
drwxrwxrwx.   9 root root    12288 Dec 14 20:05 lib64
drwxrwxrwx.   2 root root    16384 Jan 10  2014 lost+found
drwxrwxrwx.   2 root root     4096 Jun 28  2011 media
drwxr-xr-x.   2 root root        0 Dec 10 14:35 misc
drwxrwxrwx.   2 root root     4096 Jun 28  2011 mnt
drwxrwxrwx.   4 root root     4096 Nov 24 23:13 opt
dr-xr-xr-x. 580 root root        0 Dec 10 14:35 proc
drwxrwxrwx.  45 root root     4096 Dec 16 10:26 root
Run Code Online (Sandbox Code Playgroud)

它显示根目录对每个人都有权限。我们更改了它,以便其他人没有权限。

[root@sys-135 ~]# chmod 750 /root
Run Code Online (Sandbox Code Playgroud)

密钥认证开始工作。


Ste*_*ell 6

检查权限并尝试此处列出的其他几种解决方案后,我最终删除了服务器上的 ssh 目录,然后再次设置我的公钥。

服务器命令:

rm -rf ~/.ssh
Run Code Online (Sandbox Code Playgroud)

本地命令:

ssh-copy-id user@192.168.1.1        # where <user> is your username and <192.168.1.1> is the server IP
Run Code Online (Sandbox Code Playgroud)


小智 5

在 /etc/selinux/config 文件中,将 SELINUX 更改为禁用,使无密码 ssh 成功工作。

早些时候我可以用一种方式做到这一点。现在,我可以通过这两种方式进行无密码 ssh。


fas*_*aan 5

在服务器上:

$ ls -lh /home
$ sudo chmod 700 /home/$USER
Run Code Online (Sandbox Code Playgroud)

它是directory permission issue。服务器上的号码是 777,所以I changed it back to 700. 即使复制到服务器后,这fixed也是我的问题。ssh password less login failure$USER/.ssh/id_rsa.pub$USER/.ssh/authorized_keys


cow*_*tor 5

如果服务器接受私钥和用户名/密码身份验证方法,那么如果私钥失败,它将简单地退回到提示输入用户名/密码而不显示任何错误。

您可以使用该-vvv标志来确定是否尝试了私钥(以及具体是哪些密钥)以及密钥失败的原因。例子:ssh -T -vvv myHost.com。或者,您可以LogLevel DEBUG3在 中使用~/.ssh/config

常见的故障是服务器拒绝密钥。在这种情况下,你会看到类似这样的内容:

debug1: Next authentication method: publickey
debug1: Trying private key: /c/Users/myUsername/.ssh/id_rsa
debug3: send packet: type 50
debug2: we sent a publickey packet, wait for reply
debug3: receive packet: type 51
debug1: Authentications that can continue: publickey,password
debug1: Next authentication method: password
myUsername@myServer.com's password:
Run Code Online (Sandbox Code Playgroud)

根据 SSH 协议的官方规范 (RFC 4252),身份验证数据包具有以下值:

SSH_MSG_USERAUTH_REQUEST    50
SSH_MSG_USERAUTH_FAILURE    51
SSH_MSG_USERAUTH_SUCCESS    52
Run Code Online (Sandbox Code Playgroud)

这意味着debug3: receive packet: type 51服务器拒绝了该密钥。