谷歌云平台:SSH连接谷歌云实例时出现“Permission denied (publickey)”错误

26

当我使用ssh登录谷歌云实例时,遇到了以下问题:

$ ssh -i DD2 root@35.237.32.84
Permission denied (publickey).

经过一些测试,我发现错误的原因是公钥签名与 Google Cloud 帐户不一致。例如:
scuio33@chef-server:~$ 

这里您的账户是scuio33 那么您的公共文件将会是:

ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDBpNeFZyXXXehjPuGCkEjb/t
laNQt0fztORSCFFQIoKHkQzi7SNhp48kagyOHDNj6mY1LmVZB/sIj2oCa1AFupoFuBYc/XILP
rTX60fIlnBYkHl+6Kq/TX2hzKv scuio33

scuio33账户和您的Google账户完全相同,否则将会出现“权限被拒绝(publickey)”的问题。这种限制只存在于Google Cloud中。

这不是一个“问题”,而是ssh连接到Google Cloud失败的提示。


2
scuio33 将与您的 Google 帐户完全相同,否则将出现“权限被拒绝(publickey)”的问题。这没有意义。公钥行中的“scuio33”字段是一个注释。它对 ssh 的工作没有任何影响。 - Kenster
1
第一次使用scuio33@XX和其他名称作为公共文件的结尾时,我的想法和你一样,ssh不起作用,改成scuio33后就可以。这个问题只发生在谷歌云上。如果您知道中文,可以参考https://mini.nidbox.com/diary/read/8884523。 - wherby
1
我可以确认,在2022年。 - sineverba
如果有人最近升级到Ubuntu 22.04并遇到此问题,请查看https://dev59.com/DaXja4cB1Zd3GeqPPlZg#74273581。 - ezvine
13个回答

49

在首次在Google Cloud Platform上设置Kubernetes时,我遇到了这个问题。

每次尝试从终端SSH到我的实例时,我都会遇到以下错误:

promisepreston@52.174.274.72: Permission denied (publickey)

这是我的解决方案:

在您的工作站上打开终端并使用ssh-keygen命令生成一个新的密钥。使用-C选项指定您的用户名添加一个注释。

ssh-keygen -t rsa -f ~/.ssh/[KEY_FILENAME] -C [USERNAME]

在我的案例中,这是这样的:
ssh-keygen -t rsa -f ~/.ssh/kubernetes-trial -C promisepreston

进入.ssh目录:

cd ~/.ssh

限制访问您的私钥,以便只有您可以读取它,没有人可以写入它。

chmod 400 [KEY_FILENAME]

在我的情况下,是这样的:

chmod 400 kubernetes-trial

双击 kubernetes-trial.pub 打开它,或使用 cat 命令在控制台上打印:

sudo cat kubernetes-trial.pub

公共SHH密钥应该是这个格式:

ssh-rsa [KEY_VALUE] [USERNAME]

或者

ssh-rsa [KEY_VALUE] google-ssh {"userName":"[USERNAME]","expireOn":"[EXPIRE_TIME]"}

在我的情况下,它是这样的:
ssh-rsa AAAAB3MzaC1yc2EAAAADAQABAAABAQDdLjLb2b97m9NSK5Z8+j6U8awAwIx1Sbn9o4cEpYT2USYlFhJPRckgnmCQ+Eaim/sgL40V2v3Jwt6HVAY0L9bl84jmvox9QP4FOY7+LM02ZqfRB6LaEukM1tGdObVr+HBvhOwrxGCI06GFjnD3vVzW4jEsK75Y7MPzXd5YSpebGvU+7ZOuEcuSKp/R9dJcJn4kdXeaqor4gh8uTKQ43PGPTEvyoNlCWLkwSgy8khbo2BpoChLA7B53pVEhviMvVVIbmwpc6V2AIhRYY7ppR8oBzklLgh8CtTBPXtQRYiahLOIhds6ORf7wGNFI+A4sbBqwEL3J6av5fE1+zkUBhAHX promisepreston

将其内容复制并粘贴到元数据部分下的实例SSH部分。 添加或删除实例级公共SSH密钥

ssh keys

在本地终端中,导航到您拥有私有SSH密钥文件的目录,使用ssh命令以及您的私有SSH密钥文件、用户名和实例的外部IP地址进行连接。例如:
ssh -i private-key username@external-ip-of-the-virtual-instance

在我的情况下,是这样的:

ssh -i kubernetes-trial promisepreston@52.174.274.72

连接成功后,请使用该终端在实例上运行命令。完成后,请通过运行 exit 命令断开与实例的连接。
注意:
- 确保您已添加实例级公共 SSH 密钥,详情请查看添加或删除仅限实例的公共 SSH 密钥。 - 确保您未阻止项目范围公共 SSH 密钥进入 Linux 实例,详情请查看允许或阻止项目范围公共 SSH 密钥进入 Linux 实例。 - 确保未启用 OS 登录,详情请查看启用或禁用 OS 登录。 就这些了。
希望能对您有所帮助。

2
一针见血。我正好遇到了GC SSH的这个问题。 - David Brewer
4
谢谢!在我的情况下,问题是启用了操作系统登录。 - Rafael Beirigo
1
非常好的逐步教程。对于可以访问多个实例的人来说,删除configgoogle-cloud-auth文件是有帮助的。 - LonelySoul

10

你必须确保用于生成密钥的用户名与本地计算机上的用户名相匹配。


步骤:

1/ 生成密钥(不改写)

在本地计算机上: 在Linux系统中,默认情况下$USER会给出你的用户名(echo $USER),所以你甚至不需要指定它。

ssh-keygen -t rsa -f ~/.ssh/my_google_cloud_key -C $USER

2/将密钥复制到Google Cloud元数据

cat /home/$USER/.ssh/my_google_cloud_key.pub

https://console.cloud.google.com/compute/metadata/sshKeys中选择并复制它(添加密钥,然后保存)

3/ 连接到您的VM

获取您实例的外部IP地址https://console.cloud.google.com/compute/instances

EXTERNAL_IP={{input your external ip}}
ssh -i ~/.ssh/my_google_cloud_key $USER@$EXTERNAL_IP

3
你救了我。因为我盲目复制,有一个小问题:ssh -i之间缺少一个空格。 - Ratinahirana

4

通过SSH密钥连接到Google Cloud Compute Engine实例并不仅限于该实例所属项目的用户。您可以生成一个SSH密钥,只要将其添加到实例中并且操作系统上存在该用户,就应该能够进行SSH连接。您可以使用其他用户名进行连接。请确保:

  1. 通过Google Cloud控制台[1]将公钥添加到实例中。

  2. 您的用户名存在于实例的操作系统中。

  3. 如果您想要以“root”身份进行SSH,请更改/etc/ssh/sshd_config文件中的配置。


2
承诺Preston的解决方案有效,只需确保禁用“ENABLE-OSLOGIN”或从元数据设置中删除该项。

1

promise-preston的答案对我有用。问题在于名称与Google帐户名称不匹配。

请注意,如果未指定,则Google SSH服务器识别的名称是根据您的电子邮件地址自动生成的,但不一定相同。在我的情况下,我的电子邮件地址是wenzhan.main@gmail.com,用户名实际上是wenzhan_main。请仔细检查这个技巧。

我想再补充一点,类似ssh -i kubernetes-trial promisepreston@52.174.274.72这样的内容,只有当您已经在.ssh/目录中时才有效。


1

我知道有类似的答案,但是我在答案中迷失了方向;

对于现有的ssh密钥

1- 复制您的公钥,格式如下: ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDAu5kKQCPF... hbceylan

2- GCP > 编辑VM > 添加SSH密钥 > 保存

enter image description here

3- 连接实例

ssh -i /path-to-private-key/id_rsa hbceylan@1.2.3.4

如果需要新的ssh-key

1- 创建ssh key,例如:

ssh-keygen -t rsa -f ~/.ssh/x-poject-hbceylan -C hbceylan -b 2048

2- GCP > 编辑VM > 添加SSH key > 保存(见图片)

3- 连接实例

ssh -i /path-to-private-key/id_rsa hbceylan@1.2.3.4


1

我遇到了同样的错误。尝试添加--tunnel-through-iap

gcloud compute ssh --zone "%zone%" "%instanaceName%" --project "%projectName%"  --tunnel-through-iap

请按照以下方式替换:

  • %zone% - 输入计算引擎所在的区域(位置)名称
  • %instanceName% - 实例(计算引擎)的名称
  • %projectName% - Google Cloud 当前项目的名称

0
遇到了相同的错误,通过在“VM实例详细信息”设置页面上取消选中“阻止项目范围SSH密钥”来解决。显然,这会阻止从本地ssh到GCE实例。 enter image description here

0
在我的情况下,尽管将公钥上传到虚拟机并在 Visual Studio 中配置了私钥的 ssh 文件,但由于同样的原因,我无法连接。
对我来说,这是解决问题的方法。您可以按照将 .pub 文件添加到实例元数据的步骤,将私钥保存在 ssh 配置文件中,然后运行:
gcloud compute ssh --zone "your-vm-zone" "your-instance"  --project "your_project"

这将生成一个被Google Cloud VM识别的id_rsa文件。然后,您可以使用SSH定期连接,例如在Visual Studio Code中。


0

前往项目级元数据(Compute Engine -> Metadata),确保您没有启用 enable-oslogin 键,或者将其设置为 FALSE。这对于 Windows PowerShell 有效。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接