SSH权限被拒绝(公钥)


110

我正在尝试从本地计算机(也正在运行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).

4
1)关于您在客户端上出现此错误的时间,SSH服务器上的日志怎么说?(/var/log/auth.log)2)您如何将公钥传输到服务器?始终使用ssh-copy-id以确保权限。您的主目录,.ssh目录和authorized_keys文件具有严格的权限要求。(请参阅第sshd(8)页的联机帮助~/.ssh/authorized_keys)。3)您是否在Ubuntu上生成了新的密钥对?如果您从Windows重用了密钥,则必须先将其转换为OpenSSH格式。
gertvdijk

1
该命令应该ssh -vvv -i .ssh/id_rsa ....(请注意id_rsa的路径!)-请替换-旧日志仅显示“我们”没有要发送的pubKey。
guntbert

@guntbert我错过了.ssh,因为我已经在.ssh目录中。我也使用.ssh / id_rsa进行了尝试,但是得到了相同的结果
Pattle 2013年

我明白了,所以我读错了-请回答@gertvdijk的问题。
guntbert

任何人都可以在stackoverflow.com/questions/51254328/unable-to-ssh-to-bitbucket上发表评论我有类似的问题。
Mrinmay Kalita '18

Answers:


90

PubKeyAuthentication

设置您的客户

  1. 生成您的密钥
    • ssh-keygen
  2. 配置ssh以使用密钥
    • vim ~/.ssh/config
  3. 将密钥复制到服务器
    • ssh-copy-id -i /path/to/key.pub SERVERNAME

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

Host SERVERNAME
Hostname ip-or-domain-of-server
User USERNAME
PubKeyAuthentication yes
IdentityFile ./path/to/key

您可以添加IdentitiesOnly yes以确保在身份验证期间ssh使用IdentityFile和没有其他密钥文件,这可能会导致问题,并且不是一个好习惯。

故障排除

  1. 使用“ -vvv”选项
  2. 确保服务器具有您的PUBLIC密钥(.pub)。
  3. 确保您的IdentiyFile指向您的PRIVATE密钥。
  4. 确保您的.ssh目录具有700个文件,并且您的文件具有700个权限(rwx ------)。
  5. tail -f /var/log/auth.log (在服务器上)并在您尝试登录时监视错误
  6. 如果您有许多密钥文件,请尝试IdentitiesOnly yes限制身份验证以使用单个指定密钥。

1
仅供参考,我在github.com/centic9/generate-and-send-ssh-key上创建了一个小脚本,该脚本一口气运行了必要的步骤,并确保了所有文件/目录权限,这总是让我头疼...
centic

1
只是为了详细说明步骤2:IdentityFile〜/ .ssh / config中的行必须指向PRIVATE键。
丹尼·舒曼


3
我想知道为什么要在步骤4中将文件设置为具有执行权限?
托德·沃尔顿

这也是每个用户的非常重要的权限(使用chown和chmod),否则即使服务器具有公用密钥,您也将获得身份验证被拒绝。
joseluisq

61

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

在您的主目录中:

chown -R your_user:your_user .ssh

至于权利,用700代表.ssh600authorized_keys

chmod 700 .ssh
chmod 600 .ssh/authorized_keys

1
这个答案帮助了我。我从这篇文章中获得了建议,并将authorized_keys文件移到了加密的主目录之外。这样做时,我无意中将所有权更改为root:root
约旦·格兰特

希望我可以投票两次,一次是文件夹,一次是文件。权限必须准确,这一点非常重要。
格里弗先生

是的,一直都是权限。
a3y3

这个解决了我的问题,对此表示感谢。
sathiyarajan

14

您不需要authorized_keys客户。

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

如果工作可以将密钥添加到ssh-agentssh-add .ssh/id_rsa(你将不得不为此提供的密码只有一次,只要你不退出它应该工作/重启)


感谢您的帮助,我已经编辑了答案,以显示输入您的建议时会发生什么。
Pattle

2
要在客户端上传输密钥,请使用ssh-copy-id
Panther

@ bodhi.zazen谢谢,但是我已经转移了密钥,这不是问题
Pattle 2013年

4
“您必须告诉ssh-client实际使用您生成的密钥。” 否,默认情况下它将在默认路径中查找密钥,例如~/.ssh/id_rsa。而且,就我所知,使用密钥代理完全是可选的,并且与该问题无关。
gertvdijk

@gertvdijk,您在这里进行的假设尚无事实支持-我们不知道系统发生了什么。
guntbert

10

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


4
OP未尝试使用密码身份验证。他们有一定的意识,并且正在使用公用/专用密钥。
ctrl-alt-delor

9

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

ssh -i ~/.ssh/private_key username@host

1
不,请使用公钥
St3an

@ St3an,您将公钥放在服务器上,但是当您像上面的Todd一样进行连接时,您将使用私钥
NathanF。

@NathanFiscaletti,您永远不能公开您的私钥,这就是为什么它是私钥的原因。本地ssh代理使用该私钥来检查您是否确实给出了与私钥相对应的公钥。然后,计算机之间的SSH代理可以确保用户是他们假装的用户:-)
St3an

1
究竟。这就是为什么在连接时将私钥提供给ssh-client的原因。服务器存储您的公钥。上面文章中的命令正是应该使用私钥的方式。
内森·F。

7

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

本来应该:

sudo chown username:username /home/username;

我可以与本地Linux机器(例如abc)上的用户使用公钥/私钥进行ssh,与远程服务器上的用户(例如def@123.456.789)不同。我只需要确保本地用户拥有本地.ssh文件(例如abc:abc,而不是root:abc)`
Michael

在我的情况下,这有效
Zerquix18 '16

3

我最近在网络服务器上遇到了这个问题。

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

对于我的网络服务器,/etc/ssh/sshd_config该行

AuthorizedKeysFile    %h/.ssh/authorized_keys

代替

AuthorizedKeysFile    %h/.ssh/authorized_keys2

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


非常感谢,这有助于我弄清楚该行已完全从配置中删除!
Christian.D

2

另一个可能的原因可能与中的AllowedUsers配置有关/etc/ssh/sshd_conf。注意:由于我很难学,列表是用空格定界的(不是逗号定界的)。

AllowUsers user1 user2 user3

1

如果所有其他方法均失败,请检查您的登录用户是否属于ssh的AllowedGroup。也就是说,您的用户是/etc/ssh/sshd_config服务器上以下行中显示的组的成员:

AllowGroups ssh #Here only users of 'ssh' group can login

1

我的情况是,客户端是ubuntu 14.04lts,服务器是运行cygwin的win 2012服务器。当cygwin中的2012服务器目录为/ home / Administrator时,我使用的是“ ssh administrator @ xxxx”。因此,它区分大小写,当我尝试使用“ ssh Administrator @ xxxx”(注意Administrator上的大写字母A)时,它可以正常工作。

诸如“找不到用户”之类的错误消息使我比“权限被拒绝(公钥,键盘交互)”更快地找到了解决方案。


有人应该在ssh项目中记录一个问题,建议这样做。我遇到了类似的问题。
Ben Creasy

1

从cPanel Centos系统将常规用户(例如johndoe)的公共密钥复制到AWS上的Ubuntu服务器时,我遇到了同样的问题。正如上面gertvdijk所建议的那样,我检查/var/log/auth.log并确定它说的足够Authentication refused: bad ownership or modes for directory /home/johndoe。原来,/home/johndoe当我尝试将/home/johndoe/public_htmlapache2 设置为默认虚拟主机文档根目录时,我错了777 ,(该任务也不需要)。

另请参见此处此处的答案

服务器只需要插入公共密钥,.ssh/authorized_keys客户端(您正在使用的计算机)就需要私有密钥(.pem,或者将SFTP与Filezilla一起使用,.ppk)


1

对于那些像我这样的Putty用户,如果忘记添加用户user @ Ip,也可能会收到此错误!

其他人对密钥文件chmod的许可为600)

ssh 1.1.1.1 -i /path/to/.pem file 
Permission denied (publickey).`

ssh user@1.1.1.1 -i /path/to/.pem file 

1

这对我有用,解决方法不是我的,但我希望将其写下来,以防其他人遇到相同的问题。

原始作者将其张贴在此处:digital-ocean-public-access-key-denied

sudo nano /etc/ssh/sshd_config

取代这个

UsePAM yes
IgnoreUserKnownHosts no
PasswordAuthentication no

有了这个

UsePAM no
IgnoreUserKnownHosts no
PasswordAuthentication yes

保存文件并重新启动ssh

reload ssh

ssh现在应该可以工作了,要求输入密码


1

我有与问题中所述相同的问题。ssh -vvv -i id_rsa [youruser]@[yourLinode]在客户端计算机上执行的输出与问题中描述的类似。我按照其他答案中的建议检查了所有文件和目录权限,它们是正确的。

原来,将生成的文件复制为id_rsa.pub服务器文件时~username/.ssh/authorized_keys我一开始不小心忽略了这个词ssh-rsa添加它解决了问题。


1

同样适用于Ubuntu 16.04。

问题在sshd_config文件内

这是ULTIMATE解决方案:

以root用户身份登录到Ubuntu服务器

vi /etc/ssh/sshd_config

现在到最底端,将值从“否”更改为“是”。

它看起来应该像这样:

更改为否以禁用隧道明文密码

PasswordAuthentication yes
service sshd reload

生效。

现在,您可以使用本地计算机(又名笔记本电脑等)中的以下命令简单地键入一个键

因此,打开新的终端窗口并且不登录服务器,只需输入以下命令:

ssh-copy-id john @ serverIPAddress

(用您的用户名替换john)。

你应该去



0

在我的情况下,此问题是由于.ssh从较旧的计算机上复制目录引起的。原来,我的旧SSH配置使用的是DSA密钥,此密钥已被弃用。切换到新的密钥对,这一次是基于RSA的,为我解决了这个问题。


0

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

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

在machineB的授权密钥(即〜/ .ssh / authorized_keys)中拥有machineA的公钥,将允许您从machineA进行ssh。这也适用于scp。

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

machineA上执行cat ~/.ssh/id_rsa.pub

样本输出:

ssh-rsa AAAAB3NzaSGMFZW7yB anask@mahineA

复制打印的密钥(⌘ Command+ CCRTL+ C),然后将其添加到machineB上的〜/ .ssh / authorized_keys文件中。

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

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

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.