SSH 权限被拒绝(公钥)

Pat*_*tle 197 server ssh permissions

我正在尝试从我的本地机器(也运行 Ubuntu 12.04 LTS)连接到 Linode(运行 Ubuntu 12.04 LTS)

我在本地机器上创建了一个私钥和公钥,并将我的公钥复制到我的 Linode 的 authorized_keys 文件中。但是,每当我尝试通过 ssh 连接到我的 Linode 时,我都会收到错误消息Permission denied (publickey)

在我的 Linode 上如何设置 ssh 不是问题,因为我可以使用密钥身份验证从我的 Windows 机器 ssh 到它。

在我.ssh本地 Ubuntu 机器上的目录中,我有我的id_rsaid_rsa.pub文件。我需要在我的本地机器上创建一个 authorized_keys 文件吗?

编辑:这是我运行时得到的ssh -vvv -i id_rsa [youruser]@[yourLinode]

debug3: authmethod_lookup publickey
debug3: remaining preferred: keyboard-interactive,password
debug3: authmethod_is_enabled publickey
debug1: Next authentication method: publickey
debug1: Offering RSA public key: id_rsa
debug3: send_pubkey_test
debug2: we sent a publickey packet, wait for reply
debug1: Authentications that can continue: publickey
debug2: we did not send a packet, disable method
debug1: No more authentication methods to try.
Permission denied (publickey).
Run Code Online (Sandbox Code Playgroud)

ear*_*Lon 128

公钥认证

设置您的客户端

  1. 生成您的密钥。

    ssh-keygen
    
    Run Code Online (Sandbox Code Playgroud)
  2. 配置 ssh 以使用密钥。

    vim ~/.ssh/config
    
    Run Code Online (Sandbox Code Playgroud)
  3. 将您的密钥复制到您的服务器。

    ssh-copy-id -i /path/to/key.pub SERVERNAME`
    
    Run Code Online (Sandbox Code Playgroud)

步骤 2 中的配置文件应具有类似于以下内容的内容:

Host SERVERNAME
Hostname ip-or-domain-of-server
User USERNAME
PubKeyAuthentication yes
IdentityFile ./path/to/key
Run Code Online (Sandbox Code Playgroud)

您可以添加IdentitiesOnly yes以确保在身份验证期间ssh使用指定的IdentityFile而不是其他密钥文件。设置IdentitiesOnly可防止发生失败的身份验证,ssh否则将尝试使用多个密钥登录。设置此项也被认为更安全,因为您不会泄露有关您已安装的其他密钥的信息,并在不同访问级别之间保持您的密钥的分离。

故障排除

  1. 使用“-vvv”选项
  2. 确保服务器有您的公钥 (.pub)。
  3. 确保您的 IdentiyFile 指向您的私钥。
  4. 确保您的.ssh目录有 700 个,其中的文件有 600 个权限。
    • ssh-keygen 将为您创建具有适当权限的文件和目录
  5. tail -f /var/log/auth.log (在服务器上)并在您尝试登录时监控错误
  6. 如果您有许多密钥文件,请尝试IdentitiesOnly yes将身份验证限制为使用单个指定的密钥。

  • 只是为了详细说明第 2 步: ~/.ssh/config 中的 `IdentityFile` 行必须指向 PRIVATE 键。 (5认同)
  • 我想知道您为什么要在步骤 4 中将文件设置为具有执行权限? (5认同)
  • 虽然目录需要 700 权限,但文件不需要,它们应该是 600。 (5认同)
  • 仅供参考,我在 https://github.com/centic9/generate-and-send-ssh-key 创建了一个小脚本,它一次性运行必要的步骤,并另外确保所有文件/目录权限,这总是让我头疼。 .. (4认同)
  • 后代和完整性就是原因。 (2认同)

小智 100

有时问题来自权限和所有权。举例来说,如果你想以root身份登录,/root.ssh而且authorized_keys必须属于根。否则,sshd 将无法读取它们,因此无法判断用户是否有权登录。

在您的主目录中:

chown -R your_user:your_user .ssh
Run Code Online (Sandbox Code Playgroud)

至于权利,700为.ssh和600为authorized_keys

chmod 700 .ssh
chmod 600 .ssh/authorized_keys
Run Code Online (Sandbox Code Playgroud)

  • 这个答案对我有帮助。我采纳了[这篇文章](http://askubuntu.com/questions/254776/ubuntu-server-ssh-after-reboot-permission-denied-publickey)的建议,并将我的“authorized_keys”文件移到了加密之外主目录。这样做时,我无意中将所有权更改为“root:root”。 (4认同)
  • 希望我能投票两次,一次为文件夹,一次为文件。权限准确非常重要。 (4认同)

小智 25

我遇到的问题是它在客户端上使用了错误的密钥。我已将 id_rsa 和 id_rsa.pub 重命名为其他名称。您可以将它们重命名回默认值,或者在发出 ssh 命令时,像这样使用它

ssh -i ~/.ssh/private_key username@host
Run Code Online (Sandbox Code Playgroud)

  • 确切地。这就是为什么当您连接时,您将您的私钥提供给 ssh 客户端。服务器存储您的公钥。上面帖子中的命令正是应该如何使用私钥。 (6认同)
  • @St3an 你把公钥放在服务器上,但是当你像上面的托德一样连接时,你使用你的私钥 (4认同)

gun*_*ert 18

你不需要authorized_keys你的客户。

您必须告诉 ssh-client 实际使用您生成的密钥。有几种方法可以做到这一点。仅用于测试类型ssh -vvv -i .ssh/id_rsa [youruser]@[yourLinode]。每次要连接到服务器时,您都必须提供密码。

如果有效,您可以将密钥添加到ssh-agentwith ssh-add .ssh/id_rsa(您只需为此提供一次密码,只要您不注销/重新启动,它就可以工作)

  • “您必须告诉 ssh 客户端实际使用您生成的密钥。” 不,默认情况下它会在默认路径中查找密钥,例如`~/.ssh/id_rsa`。此外,就我所见,使用密钥代理完全是可选的,与问题无关。 (4认同)
  • 要传输密钥,请在客户端使用 ssh-copy-id (2认同)

ima*_*man 17

还要检查PasswordAuthenticationin 的值/etc/ssh/sshd_config以及是否将其no更改为yes. 之后不要忘记重新启动 ssh 服务。

  • OP 没有尝试使用密码身份验证。他们有一定的意义并且正在使用公钥/私钥。 (21认同)
  • 这解决了我的问题,在某些云服务器中,启用 ssh 登录后,密码登录会自动禁用...... (2认同)

小智 7

还要确保用户的主目录(在服务器上)实际上属于 ssh 进入的用户(在我的情况下设置为 root:root)。

本来应该:

sudo chown username:username /home/username;
Run Code Online (Sandbox Code Playgroud)


小智 7

另一个可能的原因可能AllowedUsers/etc/ssh/sshd_conf. 注意:该列表是空格分隔的(不是逗号分隔的),因为我通过惨痛的教训才了解到。

AllowUsers user1 user2 user3
Run Code Online (Sandbox Code Playgroud)


ana*_*ask 6

如果您可以独立访问机器A 和机器B(例如从机器C),则以下方法可能有效。

\n\n

如果 ssh-copy-id 不起作用,则可以禁用密码身份验证。以下是解决方法

\n\n

将机器 A 的公钥包含在机器 B 的授权密钥(即 ~/.ssh/authorized_keys)中将允许您从机器 A 进行 ssh。这也适用于 scp。

\n\n

使用以下命令生成密钥对后:ssh-keygen

\n\n

机器A上,执行cat ~/.ssh/id_rsa.pub

\n\n

示例输出:

\n\n
\n

ssh-rsa AAAAB3NzaSGMFZW7yB anask@mahineA

\n
\n\n

复制打印的密钥(\xe2\x8c\x98 Command+CCRTL+ ),然后将其添加到machineBC上的 ~/.ssh/authorized_keys 文件中。

\n\n

例如,在machineB上执行以下命令:

\n\n
\n

echo 'ssh-rsa AAAAB3NzaSGMFZW7yB anask@mahineA' >> ~/.ssh/authorized_keys

\n
\n


Jus*_*n C 5

我最近在使用 Web 服务器时遇到了这个问题。

我通常将所有服务器上的授权密钥列表保存在~/.ssh/authorized_keys2. 根据我的经验,sshd会寻找~/.ssh/authorized_keys~/.ssh/authorized_keys2默认。

在我的网络服务器的情况下,/etc/ssh/sshd_config有这条线

AuthorizedKeysFile    %h/.ssh/authorized_keys
Run Code Online (Sandbox Code Playgroud)

代替

AuthorizedKeysFile    %h/.ssh/authorized_keys2
Run Code Online (Sandbox Code Playgroud)

我应用了后者,重新启动了我的 ssh 守护进程,并解决了我使用公钥登录 ssh 的问题。