我试图从本地计算机(也运行Ubuntu 12.04 LTS)连接到Linode(运行Ubuntu 12.04 LTS)

我已经在本地计算机上创建了私钥和公钥,并复制了我的公钥到我的Linode的authorized_keys文件中。但是,每当我尝试SSH到Linode时,我都会收到错误消息Permission denied (publickey)

在Linode上如何设置ssh并不是问题,因为我可以使用密钥身份验证从Windows计算机上对其进行ssh设置。

在本地Ubuntu计算机上的.ssh目录中,有我的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).


评论

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

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

@guntbert我错过了.ssh,因为我已经在.ssh目录中。我也使用.ssh / id_rsa尝试了一下,但结果却相同

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

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

#1 楼

PubKeyAuthentication
设置客户端


生成密钥。
ssh-keygen



配置ssh以使用密钥。
vim ~/.ssh/config



将密钥复制到服务器。
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且没有其他密钥文件,这可能会引起问题并且不是一个好习惯。
故障排除

使用“ -vvv”选项
确保服务器具有您的PUBLIC密钥(.pub)。
确保您的IdentiyFile指向您的PRIVATE密钥。​​
确保您的.ssh目录具有700个文件,其中的文件具有600个权限。

tail -f /var/log/auth.log(在服务器上)并在尝试登录时监视错误
如果您有很多密钥文件,请尝试IdentitiesOnly yes将身份验证限制为使用指定的单个键。


评论


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

–中心
2015年10月7日,11:30

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

–丹尼·舒曼(Danny Schoemann)
17年8月30日在14:19

我想知道为什么要在步骤4中将文件设置为具有执行权限?

–托德·沃尔顿(Todd Walton)
18年11月7日在13:43

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

– joseluisq
19年7月23日在7:40



后代和完整性是为什么。

–earthmeLon
19年9月28日在21:48

#2 楼

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

在您的主目录中:

chown -R your_user:your_user .ssh


权利方面,.ssh为700,authorized_keys为600

chmod 700 .ssh
chmod 600 .ssh/authorized_keys


评论


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

–乔丹·格兰特(Jordan Grant)
16年8月12日在22:27

希望我能投票两次,一次是对文件夹,一次是对文件。权限必须非常重要。

–格里弗先生
19年5月15日在18:21

是的,一直都是权限。

– a3y3
19年7月10日在15:54

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

–sathya
19-10-15在13:29

#3 楼

还要检查PasswordAuthentication中的/etc/ssh/sshd_config值,如果是no,则将其更改为yes。不要忘记在那之后重新启动ssh服务。

评论


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

–ctrl-alt-delor
18年8月20日在17:43

#4 楼

您不需要在客户端上使用authorized_keys

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

如果可以,则可以将密钥与ssh-agent一起添加到ssh-add .ssh/id_rsa中(为此,您只需提供一次密码即可)。只要您不注销/重新启动,它就可以正常工作。

评论


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

–瓶
2013年6月22日23:22

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

–豹
13年6月23日在0:30

@ bodhi.zazen谢谢,但是我已经转让了钥匙,那不是问题

–瓶
13年6月23日,0:33

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

– Gertvdijk
2013年6月23日在1:09



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

–冈伯特
13年6月23日在11:24

#5 楼

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

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


评论


不,使用公钥

– St3an
18/12/3在9:58

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

– Nathan F.
19年4月10日在21:50

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

– St3an
19年4月11日在8:26

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

– Nathan F.
19年4月11日在14:54

#6 楼

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

应该是:

sudo chown username:username /home/username;


评论


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

–迈克尔
15/12/22在9:44

这对我来说很有效

–Zerquix18
16年7月14日在22:53

#7 楼

我最近在我的Web服务器上遇到了此问题。

我通常在~/.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
18-10-8在8:45

#8 楼

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

AllowUsers user1 user2 user3


#9 楼

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

原始作者在此处发布:digital-ocean-public-访问密钥被拒绝

sudo nano /etc/ssh/sshd_config


替换此

UsePAM yes
IgnoreUserKnownHosts no
PasswordAuthentication no


与此

>
UsePAM no
IgnoreUserKnownHosts no
PasswordAuthentication yes


保存文件并重新启动ssh

reload ssh


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

#10 楼

如果您可以独立访问机器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 + C或CRTL + C),然后将其添加到machineB上的〜/ .ssh / authorized_keys文件中。

例如,在machineB上执行以下操作:


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


#11 楼

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

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


#12 楼

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

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

评论


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

– Ben Creasy
16-11-27在11:58



#13 楼

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

另请参见此处和此处的答案

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

#14 楼

对于像我这样的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 


#15 楼

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

结果是,将生成的文件id_rsa.pub复制到服务器计算机时,作为文件~username/.ssh/authorized_keys,我会一开始不小心忽略了单词ssh-rsa。添加它可以解决问题。

#16 楼

有些人想知道可能仅将ssh访问权限设置为root帐户上的密钥,然后创建了新用户,却没有意识到他们需要

ssh root@your-ip-address

rsync --archive --chown=[user]:[user] ~/.ssh /home/[user]

然后重试。用您的新用户帐户替换[user]。

当您在设置中使用ssh键时,在DigitalOcean上设置新服务器时,这很常见。

https://www.digitalocean.com/community/教程/ initial-server-setup-with-ubuntu-18-04

#17 楼

同样适用于Ubuntu 16.04。

问题在sshd_config文件内

这是ULTIMATE解决方案:

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

vi /etc/ssh/sshd_config


现在移至最底端,并将值从“ no”更改为“ yes”。

它应如下所示:

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

PasswordAuthentication yes
service sshd reload


生效。

现在您可以使用以下命令简单地输入密钥您的本地计算机(又名笔记本电脑等)

因此,要打开新的终端窗口而不登录服务器,只需使用以下命令:

ssh-copy-id john @serverIPAddress

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

您应该可以使用

#18 楼

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

#19 楼

我向服务器添加了错误的密钥。因为我没有在命令中使用选项来指定某个密钥,所以它添加了标准密钥文件。
请确保您确实使用了ssh-copy-id -i CORRECT_KEY.pub
此错误密钥对一个客户端有效,因为该客户端也有这个钥匙。但是,当尝试将另一个客户端连接到同一台服务器时,它显然失败了。
另外,可能有趣的是,使用ssh -vv可以获得更多的日志记录,而不仅仅是单个-v