无法通过SSH连接到GCE:"权限被拒绝(公钥)"。

我通过Google Compute Engine在Bitnami上创建了一个虚拟机。之前,我可以通过Bitnami的Web界面进行SSH连接。但是,我尝试通过我Mac上的终端进行SSH连接时却一直遇到“Permission denied (publickey)”错误。然后,我在服务器和我的Mac上删除了所有的密钥,并从Bitnami下载了pem文件,并使用“-i”选项进行连接,但问题仍然存在。
ssh -i bitnami-gce.pem xxx@1xx.1xx.5x.1xx -v

完整的调试信息:
OpenSSH_6.2p2, OSSLShim 0.9.8r 8 Dec 2011
debug1: Reading configuration data /etc/ssh_config
debug1: /etc/ssh_config line 20: Applying options for *
debug1: Connecting to 1xx.1xx.5x.1xx [1xx.1xx.5x.1xx] port 22.
debug1: Connection established.
debug1: identity file bitnami-gce.pem type -1
debug1: identity file bitnami-gce.pem-cert type -1
debug1: Enabling compatibility mode for protocol 2.0
debug1: Local version string SSH-2.0-OpenSSH_6.2
debug1: Remote protocol version 2.0, remote software version OpenSSH_6.6.1p1 Debian-4~bpo70+1
debug1: match: OpenSSH_6.6.1p1 Debian-4~bpo70+1 pat OpenSSH*
debug1: SSH2_MSG_KEXINIT sent
debug1: SSH2_MSG_KEXINIT received
debug1: kex: server->client aes128-ctr hmac-md5-etm@openssh.com none
debug1: kex: client->server aes128-ctr hmac-md5-etm@openssh.com none
debug1: SSH2_MSG_KEX_DH_GEX_REQUEST(1024<1024<8192) sent
debug1: expecting SSH2_MSG_KEX_DH_GEX_GROUP
debug1: SSH2_MSG_KEX_DH_GEX_INIT sent
debug1: expecting SSH2_MSG_KEX_DH_GEX_REPLY
debug1: Server host key: RSA <RSA KEY>
debug1: Host '1xx.1xx.5x.1xx' is known and matches the RSA host key.
debug1: Found key in /Users/xxx/.ssh/known_hosts:1
debug1: ssh_rsa_verify: signature correct
debug1: SSH2_MSG_NEWKEYS sent
debug1: expecting SSH2_MSG_NEWKEYS
debug1: SSH2_MSG_NEWKEYS received
debug1: Roaming not allowed by server
debug1: SSH2_MSG_SERVICE_REQUEST sent
debug1: SSH2_MSG_SERVICE_ACCEPT received
debug1: Authentications that can continue: publickey
debug1: Next authentication method: publickey
debug1: Trying private key: bitnami-gce.pem
debug1: read PEM private key done: type RSA
debug1: Authentications that can continue: publickey
debug1: No more authentication methods to try.
Permission denied (publickey).

我无法通过SSH连接到主机。所以现在无法向服务器发送任何密钥。如何解决这个问题?

编辑:我尝试通过Google Web控制台进行SSH连接,成功了。有人可以告诉我如何从任何地方进行SSH连接的确切步骤吗?我更喜欢使用简单的用户名和密码方式,请问如何进行配置?


  1. 创建新的 SSH 密钥后
  2. 添加项目公共 SSH 密钥 https://cloud.google.com/compute/docs/instances/adding-removing-ssh-keys
- Jirayuth Sing-ngam
如果您在升级到Ubuntu 22.04后遇到此问题,请查看以下链接: https://stackoverflow.com/a/74273581/11823331 - ezvine
7个回答

在我能够通过Google Web控制台进行ssh之后,我采取了以下步骤来解决这个问题:
  1. 使用ssh-keygen生成ssh密钥
  2. 复制key.pub文件的内容
  3. 将内容追加到~/.ssh/authorized_keys文件中

因为用户的原因,我遇到了同样的情况。在谷歌网页上,我的用户名显示了我的电子邮件的前一部分。所以,我尝试着这样使用ssh。
ssh <first_part_of_gmail>@google_vm_external_ip

后来,我发现谷歌会根据您在谷歌虚拟机设置中放置的SSH密钥创建一个用户。因此,请首先检查公钥末尾的用户,并尝试以下操作。
ssh <user_name_at_the_end_of_public_key>@google_vm_external_ip

你真是一个MVP...过了5分钟我还没注意到他们搞的那个奇怪的用户名的事情。 - George

确保你没有启用OS登录文档中提到:

如果您使用实例上的OS登录来管理SSH密钥,则禁用了这些实例上基于元数据的SSH密钥配置

注意:在实例上启用OS登录会禁用这些实例上基于元数据的SSH密钥配置。禁用OS登录将恢复您在项目或实例元数据中配置的SSH密钥。

要进行验证,请转到项目级元数据(计算引擎 -> 元数据)并确保您没有enable-oslogin键,或者该键设置为FALSE


这个帮我省了很多的烦恼。谢谢你。 - Promise Preston
3确实,@PromisePreston,我在在线聊天上浪费了3天和大约2个小时才弄清楚这个问题。很高兴能帮到你! - Voy
谢谢 @Voy!这也帮了我一个大忙! - Yoni Rabinovitch
还有一种选择,可以仅针对特定实例禁用oslogin:
  1. 在实例详细信息页面上,点击编辑。
  2. 在自定义元数据下,添加一个元数据条目,将键设置为enable-oslogin,值设置为TRUE。或者将值设置为FALSE以在实例上禁用OS登录。
来源:https://cloud.google.com/compute/docs/instances/managing-instance-access
- nkaenzig

当您的实例首次创建时,默认情况下它不会有任何SSH密钥,所以您需要将它们传输到那里,例如通过使用"gcloud"第一次连接到它,如this SO answer中所述,或者通过手动创建SSH密钥并将其手动添加到您的实例中,如another SO answer中所述。

我遇到了同样的问题,并使用gcloud命令首次登录并添加到/etc/ssh/sshd_config文件中。
PubkeyAcceptedKeyTypes  +ssh-dss

重启服务后:
systemctl restart sshd

你需要确保你的bitnami-gce.pem文件权限是600。
尝试执行chmod 600 bitnami-gce.pem命令。
祝好, Ahmed

这是一个老问题,但我今天也遇到了这个问题,并通过以下步骤解决了它:
  1. 从本地计算机生成ssh公钥
  2. 将公钥复制到gcc虚拟机设置中
然后进行连接。
这些步骤将指导您在Mac OS终端上使用ssh连接到您的gcc虚拟机实例:https://nabtron.com/gcc-mac-terminal/,并且还将修复权限被拒绝(公钥)的问题。
希望对您有所帮助。