在部署Heroku代码时出现“Permission denied(publickey)”错误。致命错误:远程端意外挂断。

857

我试图使用以下命令行将我的代码部署到Heroku:

git push heroku master

但是收到以下错误:

Permission denied (publickey).
fatal: The remote end hung up unexpectedly

我已经上传了我的公共SSH密钥,但仍然出现这个错误。


sebarmeli的解决方案对你有用吗?我没有使用名为"id_rsa.pub"的RSA密钥,只需输入"heroku keys:add ~/.ssh/<rsa_key_filename>.pub"。 - Michael Merchant
6
大约一年前我遇到了这个问题,当时提出的解决方案并没有完全奏效,但是我总算想出了方法(现在我已经不记得具体做了什么)。Sebarmeli在我不再需要帮助后回答了我的问题,尽管他的答案似乎在那些遇到类似问题的人中很受欢迎。如果这能让人们感到满意,我愿意选择他的答案作为正确的答案。 - vich
3
以下这行代码解决了我的问题。heroku accounts:set youraccount - Mingming
今天似乎有一些Heroku服务出现了问题--如果你正在调试,请务必检查他们的网站是否有问题! - Philip Guin
我曾经遇到了同样的问题,我所需要做的就是运行 heroku login 命令,然后输入我的邮箱和密码,再尝试一次即可。 - Alejandro Veintimilla
34个回答

1484
你需要上传你的公钥到Heroku:
heroku keys:add ~/.ssh/id_rsa.pub

如果你没有公钥,Heroku会自动提示你添加一个公钥,这很顺畅。只需使用:

heroku keys:add

清除所有以前的键:

heroku keys:clear

要显示所有现有的键,请执行以下操作:

heroku keys

编辑:

上述方法对我来说似乎不起作用。我曾经搞乱了HOME环境变量,因此SSH在错误的目录中搜索密钥。

为确保SSH在正确的目录中检查密钥,请执行以下操作:

ssh -vT git@heroku.com

这将会显示以下(示例)行:

OpenSSH_4.6p1, OpenSSL 0.9.8e 23 Feb 2007
debug1: Connecting to heroku.com [50.19.85.156] port 22.
debug1: Connection established.
debug1: identity file /c/Wrong/Directory/.ssh/identity type -1
debug1: identity file /c/Wrong/Directory/.ssh/id_rsa type -1
debug1: identity file /c/Wrong/Directory/.ssh/id_dsa type -1
debug1: Remote protocol version 2.0, remote software version Twisted
debug1: no match: Twisted
debug1: Enabling compatibility mode for protocol 2.0
debug1: Local version string SSH-2.0-OpenSSH_4.6
debug1: SSH2_MSG_KEXINIT sent
debug1: SSH2_MSG_KEXINIT received
debug1: kex: server->client aes128-cbc hmac-md5 none
debug1: kex: client->server aes128-cbc hmac-md5 none
debug1: sending SSH2_MSG_KEXDH_INIT
debug1: expecting SSH2_MSG_KEXDH_REPLY
debug1: Host 'heroku.com' is known and matches the RSA host key.
debug1: Found key in /c/Wrong/Directory/.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: 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: /c/Wrong/Directory/.ssh/identity
debug1: Trying private key: /c/Wrong/Directory/.ssh/id_rsa
debug1: Trying private key: /c/Wrong/Directory/.ssh/id_dsa
debug1: No more authentication methods to try.

Permission denied (publickey).

根据上述提示,我们可以看到 ssh 在 /c/Wrong/Directory/.ssh 目录中查找密钥,但这并不是我们刚刚通过 heroku keys:add ~/.ssh/id_rsa.pub 添加到 Heroku 的公钥所在的位置。(请注意,在 Windows 操作系统中,~ 是指 HOME 路径,在 Windows 7/8 中为 C:\Users\UserName

要查看您当前的主目录,请执行以下操作:echo $HOMEecho %HOME%(Windows)。

要正确设置您的 HOME 目录(正确指的是 .ssh 目录的父目录,以便 ssh 可以在正确的目录中查找密钥),请参考以下链接:

  1. 如何永久设置 Unix 环境变量的 SO 回答

  2. 关于 ssh 在错误的目录中查找密钥以及解决方案的 SO 问题。


31
对我没有用。我不得不撤销我的旧密钥,让Heroku应用程序为我生成并上传一个新的密钥。请参考Lithium提供的链接了解如何执行此操作。 - borisdiakur
9
提醒那些说它没有起作用的人,你需要确保你已经创建了一个SSH公钥。请查看http://help.github.com/mac-set-up-git/以获取更多在Mac上如何创建SSH公钥的信息。 - Ryan
93
如果您没有公钥,Heroku将自动提示您添加一个,这可以无缝工作。只需使用命令:heroku keys:add - vansan
13
如果仍然出现错误,请尝试使用ssh-keygen -t rsa -C“your_email@youremail.com”创建另一个file.pub文件,并在此答案中推荐的命令中使用该文件。 - Tom Roggero
3
在将应用程序部署到Heroku之前,您可能需要创建/重新创建密钥。对于Windows 7,http://www.whatibroke.com/?p=284 对我很有帮助。 - Khalid Saifullah
显示剩余10条评论

148

我遇到了同样的问题,下面的步骤对我有用:

->heroku login

abc@gmail.com 和密码

->cd C:\Users\yourusername\.ssh    (OR for cygwin shell ->cd ~/.ssh)

->ssh-keygen -t rsa -f id_rsa

如果要求输入任何密码,不要留空,请填写一个密码,但不要忘记它。

生成密钥后,您需要将其添加,如下所示:

$ ssh-add

将其部署到Heroku。
->heroku keys:add "id_rsa.pub"

将目录更改为工作区,然后

->git clone git@heroku.com:stark-dawn-1234.git -o heroku

使用您设置的口令短语。


实际上,我还删除了以下文件,但不确定它们是否重要:

C:\Users\yourusername.heroku\credientals 和 C:\Users\yourusername.ssh\known_hosts


21
对我而言,这解决了我的问题。我认为原因是我有一个来自“Github for Windows”的“github_rsa”文件,但没有id_rsa文件。 - msiemens
在 Windows 7 上,我必须在“git bash”命令提示符上执行此操作,以便运行ssh-keygen。谢谢。 - Rots
3
这对我很有帮助。如果您在Windows上使用Git Bash,则密钥名称必须为id_rsa.pub,否则即使您将其他内容上传到Heroku,它也无法工作。 - Kiv
我正在使用Ubuntu 14.04,遇到了heroku git:clone -a myapp的问题...所以我尝试了这个命令git clone git@heroku.com:myapp.git -o heroku,并且解决了我的permission denied publickey问题。非常感谢这个好提示! - hailton
这对我有帮助,因为我有多个密钥,它提供了错误的密钥。ssh-add /path/to/my/key - Rob
显示剩余5条评论

92

这个问题折磨了我几天。

这可能会有帮助。

1)找出你现在在 Heroku 中有哪些密钥。

$ heroku keys
=== 1 key for joe@example.com
ssh-dss AAAAB8NzaC...DVj3R4Ww== joe@workstation.local

2)构建一个~/.ssh/config文件:

$ sudo vim ~/.ssh/config

使用此信息进行编辑

Host heroku.com
Hostname heroku.com 
Port 22 
IdentitiesOnly yes 
IdentityFile ~/.ssh/ssh-dss # location and name of your private key
TCPKeepAlive yes 
User joe@workstation.local

3
这对我也有用,因为其他方法都没有起作用!然而,在最后一行的 User 前应该有一个换行符。此外,它抱怨 # 注释,所以我只是将其删除了。 - Erik J
2
确保“IdentityFile”使用的是非公共文件(如上所示),而不是公共文件。由于某种原因,我的文件使用了公共版本,导致出现错误,提示文件权限不正确。 - Kevin K
1
“IdentityFile ~/.ssh/ssh-dss” 是指 私钥 的路径。您需要在此处输入您的 私钥,而不是您的 公钥 - HairOfTheDog
谢谢大家。对我来说已经解决了问题,只需要使用私钥(即没有.pub扩展名的那个)。 - Yosep Kim
1
这个答案是让我成功的关键。我正在运行64位的Windows 7。还有一些其他的步骤也很有帮助,比如:ssh-keygen -t rsa -f id_rsa,然后删除任何heroku密钥并添加刚刚创建的密钥:heroku keys:clear heroku keys:add C:\Users\username.ssh\id_rsa.pub,最后稍微修改上面的文件为IdentityFile C:/Users/windows_username/.ssh/id_rsa - Paul
显示剩余3条评论

61

2
Heroku从未提示我添加一个。所以我必须先执行ssh-keygen。这很有帮助。谢谢! - Kal
这个方法对我有效。生成了一个新的密钥,覆盖了旧的密钥,在此之后选择id_rsa.pub与Heroku一起使用。谢谢。 - jfoutch

36

我遇到了同样的问题,因为我没有公钥,所以我执行了以下操作:

heroku keys:clear
heroku keys:add
那将生成一个公钥,然后它能够良好地工作。

1
仍然出现错误。我尝试了不同的方法来解决它,然后下周又遇到了相同的问题...我想知道为什么Heroku会这样。 - JGallardo

31

如果你是Windows用户,那么这里的其他解决方案可能无法解决你的问题。

我使用的是Windows 7 64位 + Git-1.7.7.1-preview20111027,解决方法是将我的密钥从C:\users\user\.ssh复制到C:\Program Files (x86)\Git\.ssh。这就是当向Heroku推送时,该git客户端查找密钥的位置。

希望这可以帮助你。


2
对我来说,它是c:\msysgit.ssh。我只需在我的个人文件夹中创建一个目录链接到.ssh文件夹即可。 - Colin Bowern
我也遇到了同样的问题,但是为什么我不知道。每次我添加密钥时,它显示使用了我的用户文件夹中的密钥,这个修复方法也是一样,但它起作用了。 - Haris Krajina
12
不要那样做!这个方法有效是因为HOME文件夹为空,它会默认使用当前的可执行文件目录。如果有人以Guest用户身份登录,他就可以获取你的私钥。在高级用户设置中将HOME设为%HOME_DRIVE%%HOMEPATH%(或Win7上的C:\Users<username>),并将.ssh文件夹复制到那里。 - dmajkic
关于@dmajkic的问题,对于Win7系统,请参考此Git for Windows Tip%HOME%环境变量设置为%USERPROFILE% - Steve Eynon

29

这是对我有效的解决方案:

ssh-add ~/.ssh/my_heroku_key_rsa

1
同样的问题。谢谢。还要确保您的私钥具有适当的权限。chmod 600 ~/.ssh/heroku_rsa - Arnaud Brousseau
谢谢,这也是我的问题,我也需要先遵循Arnaud的提示。 - Mike Atlas

15

分享我的经验:

Git(我自己安装的)正在寻找名为“id_rsa”的密钥。

所以我尝试将我的密钥重命名为“id_rsa”和“id_rsa.pub”,然后它就可以工作了。

顺便说一句,我确信还有其他的方法可以做到这一点,但是我还没有深入研究过。


3
对我来说没问题(Windows 7 64位)。我已经安装了GitHub for Windows,它将密钥命名为GitHub_rsa。是否有一种方法可以指定Git应该使用哪个密钥? - Spongeboy

10
如果您已经上传了密钥,请尝试删除该密钥,然后使用新密钥重新上传。
 heroku keys:remove //removes the existing key
 ssh-keygen -t rsa //generates a new key in ~/.ssh folder
 heroku keys:add    //uploads the new key, if no arguments r passed then the key generated                              
                    //in default directroy i.e., ~/.ssh/id_rsa is uploaded
 git push heroku

这应该可以工作。


谢谢,这对我有用。虽然我使用了 heroku keys:clear 而不是 heroku keys:remove。 - Peter de Ridder
1
错误,必须指定要删除的KEY。 - JGallardo

7

我花了3天时间尝试各种可能的组合,试图让它正常工作--最终我尝试使用DSA密钥,它成功了。

如果RSA无法正常工作,请尝试使用DSA。

(我使用的是Ubuntu 11.10、ruby 1.8.7、heroku 2.15.1)


1
我和Heroku支援人員交談,他們建議這是一個暫時的解決方案。對我來說有效,但我確信這不是每種情況的答案。 - Sauce McBoss
3
不确定为什么这个回答被踩了……它解决了我的问题,并提供了一个解决方案。 - Sauce McBoss
我遇到了相反的问题...即使Heroku开发文档说可以使用DSA密钥(ssh-dss),但在我切换到RSA密钥之前,我一直收到“权限被拒绝”的消息。 - brandonjp
对我来说起作用了。如果在 heroku create 之后、git push 之前更改密钥,似乎在 dsa 和 rsa 之间切换是有效的。 - Pramod
我要如何创建DSA密钥并将其添加到Heroku? - coiso

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