为什么我的SSH密钥无法用于连接github?


72

注意:我不是新手,并且已经做了无数次尝试,但是由于某种原因,今天它决定不工作。

Permission denied (publickey).尝试通过SSH连接到github或尝试克隆存储库时,即使重新构建了ssh密钥并将其添加到我帐户中的“ SSH密钥”后,我仍然收到错误消息。

这是我今天尝试做十次却没有成功的事情:

  1. 使用ssh-keygen创建密钥。
  2. 使用Gedit或Notepad ++打开〜/ .ssh / id_rsa.pub并复制内容。
  3. 转到github.com上的帐户设置
  4. 转到SSH密钥
  5. 单击添加密钥按钮。
  6. 给钥匙一个标题
  7. 将密钥粘贴到密钥框中。
  8. 保存密钥(输入我的github密码进行验证)。

而现在,当我尝试执行ssh github.com此操作时将不起作用。我现在是不是太累了还是想念东西?

这是来自的输出 ssh -vvv github.com

OpenSSH_5.9p1, OpenSSL 1.0.0f 4 Jan 2012
debug1: Reading configuration data /etc/ssh/ssh_config
debug2: ssh_connect: needpriv 0
debug1: Connecting to github.com [207.97.227.239] port 22.
debug1: Connection established.
debug3: Incorrect RSA1 identifier
debug3: Could not load "/home/trusktr/.ssh/id_rsa" as a RSA1 public key
debug1: identity file /home/trusktr/.ssh/id_rsa type 1
debug1: identity file /home/trusktr/.ssh/id_rsa-cert type -1
debug1: identity file /home/trusktr/.ssh/id_dsa type -1
debug1: identity file /home/trusktr/.ssh/id_dsa-cert type -1
debug1: identity file /home/trusktr/.ssh/id_ecdsa type -1
debug1: identity file /home/trusktr/.ssh/id_ecdsa-cert type -1
debug1: Remote protocol version 2.0, remote software version OpenSSH_5.1p1 Debian-5github2
debug1: match: OpenSSH_5.1p1 Debian-5github2 pat OpenSSH*
debug1: Enabling compatibility mode for protocol 2.0
debug1: Local version string SSH-2.0-OpenSSH_5.9
debug2: fd 3 setting O_NONBLOCK
debug3: load_hostkeys: loading entries for host "github.com" from file "/home/trusktr/.ssh/known_hosts"
debug3: load_hostkeys: found key type RSA in file /home/trusktr/.ssh/known_hosts:16
debug3: load_hostkeys: loaded 1 keys
debug3: order_hostkeyalgs: prefer hostkeyalgs: ssh-rsa-cert-v01@openssh.com,ssh-rsa-cert-v00@openssh.com,ssh-rsa
debug1: SSH2_MSG_KEXINIT sent
debug1: SSH2_MSG_KEXINIT received
debug2: kex_parse_kexinit: ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521,diffie-hellman-group-exchange-sha256,diffie-hellman-group-exchange-sha1,diffie-hellman-group14-sha1,diffie-hellman-group1-sha1
debug2: kex_parse_kexinit: ssh-rsa-cert-v01@openssh.com,ssh-rsa-cert-v00@openssh.com,ssh-rsa,ecdsa-sha2-nistp256-cert-v01@openssh.com,ecdsa-sha2-nistp384-cert-v01@openssh.com,ecdsa-sha2-nistp521-cert-v01@openssh.com,ssh-dss-cert-v01@openssh.com,ssh-dss-cert-v00@openssh.com,ecdsa-sha2-nistp256,ecdsa-sha2-nistp384,ecdsa-sha2-nistp521,ssh-dss
debug2: kex_parse_kexinit: aes128-ctr,aes192-ctr,aes256-ctr,arcfour256,arcfour128,aes128-cbc,3des-cbc,blowfish-cbc,cast128-cbc,aes192-cbc,aes256-cbc,arcfour,rijndael-cbc@lysator.liu.se
debug2: kex_parse_kexinit: aes128-ctr,aes192-ctr,aes256-ctr,arcfour256,arcfour128,aes128-cbc,3des-cbc,blowfish-cbc,cast128-cbc,aes192-cbc,aes256-cbc,arcfour,rijndael-cbc@lysator.liu.se
debug2: kex_parse_kexinit: hmac-md5,hmac-sha1,umac-64@openssh.com,hmac-sha2-256,hmac-sha2-256-96,hmac-sha2-512,hmac-sha2-512-96,hmac-ripemd160,hmac-ripemd160@openssh.com,hmac-sha1-96,hmac-md5-96
debug2: kex_parse_kexinit: hmac-md5,hmac-sha1,umac-64@openssh.com,hmac-sha2-256,hmac-sha2-256-96,hmac-sha2-512,hmac-sha2-512-96,hmac-ripemd160,hmac-ripemd160@openssh.com,hmac-sha1-96,hmac-md5-96
debug2: kex_parse_kexinit: none,zlib@openssh.com,zlib
debug2: kex_parse_kexinit: none,zlib@openssh.com,zlib
debug2: kex_parse_kexinit: 
debug2: kex_parse_kexinit: 
debug2: kex_parse_kexinit: first_kex_follows 0 
debug2: kex_parse_kexinit: reserved 0 
debug2: kex_parse_kexinit: diffie-hellman-group-exchange-sha256,diffie-hellman-group-exchange-sha1,diffie-hellman-group14-sha1,diffie-hellman-group1-sha1
debug2: kex_parse_kexinit: ssh-rsa,ssh-dss
debug2: kex_parse_kexinit: aes128-cbc,3des-cbc,blowfish-cbc,cast128-cbc,arcfour128,arcfour256,arcfour,aes192-cbc,aes256-cbc,rijndael-cbc@lysator.liu.se,aes128-ctr,aes192-ctr,aes256-ctr
debug2: kex_parse_kexinit: aes128-cbc,3des-cbc,blowfish-cbc,cast128-cbc,arcfour128,arcfour256,arcfour,aes192-cbc,aes256-cbc,rijndael-cbc@lysator.liu.se,aes128-ctr,aes192-ctr,aes256-ctr
debug2: kex_parse_kexinit: hmac-md5,hmac-sha1,umac-64@openssh.com,hmac-ripemd160,hmac-ripemd160@openssh.com,hmac-sha1-96,hmac-md5-96
debug2: kex_parse_kexinit: hmac-md5,hmac-sha1,umac-64@openssh.com,hmac-ripemd160,hmac-ripemd160@openssh.com,hmac-sha1-96,hmac-md5-96
debug2: kex_parse_kexinit: none,zlib@openssh.com
debug2: kex_parse_kexinit: none,zlib@openssh.com
debug2: kex_parse_kexinit: 
debug2: kex_parse_kexinit: 
debug2: kex_parse_kexinit: first_kex_follows 0 
debug2: kex_parse_kexinit: reserved 0 
debug2: mac_setup: found hmac-md5
debug1: kex: server->client aes128-ctr hmac-md5 none
debug2: mac_setup: found hmac-md5
debug1: kex: client->server aes128-ctr hmac-md5 none
debug1: SSH2_MSG_KEX_DH_GEX_REQUEST(1024<1024<8192) sent
debug1: expecting SSH2_MSG_KEX_DH_GEX_GROUP
debug2: dh_gen_key: priv key bits set: 122/256
debug2: bits set: 510/1024
d    ebug1: SSH2_MSG_KEX_DH_GEX_INIT sent
debug1: expecting SSH2_MSG_KEX_DH_GEX_REPLY
debug1: Server host key: RSA 16:27:ac:a5:76:28:2d:36:63:1b:56:4d:eb:df:a6:48
debug3: load_hostkeys: loading entries for host "github.com" from file "/home/trusktr/.ssh/known_hosts"
debug3: load_hostkeys: found key type RSA in file /home/trusktr/.ssh/known_hosts:16
debug3: load_hostkeys: loaded 1 keys
debug3: load_hostkeys: loading entries for host "207.97.227.239" from file "/home/trusktr/.ssh/known_hosts"
debug3: load_hostkeys: found key type RSA in file /home/trusktr/.ssh/known_hosts:16
debug3: load_hostkeys: loaded 1 keys
debug1: Host 'github.com' is known and matches the RSA host key.
debug1: Found key in /home/trusktr/.ssh/known_hosts:16
debug2: bits set: 497/1024
debug1: ssh_rsa_verify: signature correct
debug2: kex_derive_keys
debug2: set_newkeys: mode 1
debug1: SSH2_MSG_NEWKEYS sent
debug1: expecting SSH2_MSG_NEWKEYS
debug2: set_newkeys: mode 0
debug1: SSH2_MSG_NEWKEYS received
debug1: Roaming not allowed by server
debug1: SSH2_MSG_SERVICE_REQUEST sent
debug2: service_accept: ssh-userauth
debug1: SSH2_MSG_SERVICE_ACCEPT received
debug2: key: /home/trusktr/.ssh/id_rsa (0x14cce60)
debug2: key: trusktr@rocketship (0x14ce2b0)
debug2: key: /home/trusktr/.ssh/id_dsa ((nil))
debug2: key: /home/trusktr/.ssh/id_ecdsa ((nil))
debug1: Authentications that can continue: publickey
debug3: start over, passed a different list publickey
debug3: preferred publickey,keyboard-interactive,password
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: /home/trusktr/.ssh/id_rsa
debug3: send_pubkey_test
debug2: we sent a publickey packet, wait for reply
debug1: Authentications that can continue: publickey
debug1: Offering RSA public key: trusktr@rocketship
debug3: send_pubkey_test
debug2: we sent a publickey packet, wait for reply
debug1: Authentications that can continue: publickey
debug1: Trying private key: /home/trusktr/.ssh/id_dsa
debug3: no such identity: /home/trusktr/.ssh/id_dsa
debug1: Trying private key: /home/trusktr/.ssh/id_ecdsa
debug3: no such identity: /home/trusktr/.ssh/id_ecdsa
debug2: we did not send a packet, disable method
debug1: No more authentication methods to try.
Permission denied (publickey).

1
如果向下滚动该说明页面,它会告诉您使用ssh-add来添加密钥。是你做的吗?
亚当·米哈尔辛

1
您是否正在尝试将ssh放入github,或通过ssh身份验证推/拉到存储库?
YenTheFirst'1

如果您使用的是Windows,是否已定义%HOME%?不管怎样,一个ssh -vvv github.com将帮助:stackoverflow.com/questions/6018551/...stackoverflow.com/questions/922210/...
VonC

1
@AdamMihalcin是的,我尝试过,但没什么区别。
trusktr'4

1
@YenTheFirst是的,我之前做过很多次都没有问题。
trusktr'4

Answers:


94

GitHub的SSH设置中提到的测试与GitHub的连接:

$ ssh -T git@github.com

遵循ssh uri语法(也在“此答案”中进行了说明)。

但是你做到了:

ssh github.com

(没有任何用户)。在这种情况下,ssh还原为SCP语法,该语法依赖于~/.ssh/config文件(带有“ github.com”部分)列出:

  • 用户
  • 主机名
  • (以及可选的公共密钥位置,但默认情况下它将尝试~/.ssh/id_rsa.pub

要将其更改为常规SSH URL,请勿直接编辑.git / config文件,如下所示。
使用命令git remote set-url

git remote set-url origin git@github.com:username/repo.git

我认为您的意思是git@guthub.com:port / repo.git。您已经在@符号之前提供了用户名,尤其是对于那些使用SSH服务器(可能使用自定义端口号)的git服务器(例如Atlassian的BitBucket这样做)的用户,在冒号通常是端口号之后。还是我在您的语法中缺少某些内容?
SeligkeitIstInGott

@SeligkeitIstInGott使用远程端口表示使用URI(en.wikipedia.org/wiki/Uniform_Resource_Identifier)而不是SCP语法(该格式早于OpenSSH URI-ssh.com/ssh/#history-of-the-ssh) -方案ssh://git@github.com:port/repo.git。如果不使用ssh://scheme,则它是SCP语法,其中端口是单独指定的。
VonC

我遇到了一个问题,我可以“连接”到sourcetree中的github帐户,但是如果我尝试克隆存储库,它将要求输入密码而不接受任何内容。运行ssh -T git@github.com之后,我立即能够在SourceTree中成功地从Github克隆一个仓库。我敢打赌,Atlassian(sourcetree)不想让与Github的连接变得容易,因为他们希望您使用Bitbucket。哦,很好,现在可以使用!
DiscDev'5

89

我有一个类似的问题,github没有使用我的SSH密钥。我总是必须输入我的用户名和密码。

我一直在看.git / config,在[remote“ origin”]下有:

    url = http://github.com/path/to/repository

要么

    url = https://github.com/path/to/repository

我把线改成了

    url = ssh://git@github.com/path/to/repository

然后它起作用了。


8
接得好。无需编辑配置文件的git方法如下:1. git remote,它将列出所有远程存储库。在我的情况下是origin 2。3 git remote remove <remote name that you found> .git remote add origin git@github.com:username/repository-name.git
nomad

1
除了@nomad的建议外,您还需要--set-upstream origin master在下次推送时(或在此之前)使用
Kyrstellaine,2017年

在Windows 10上为我工作
Janac Meena,

33

创建配置文件(~/.ssh/config)后,它开始工作。这是我必须输入的内容:

Host github.com
User git
Port 22
Hostname github.com
IdentityFile ~/.ssh/id_rsa
TCPKeepAlive yes
IdentitiesOnly yes

感谢@VonC在评论中带领我到达那里。

我不明白为什么我以前从来不需要它。


如果您的ssh地址以某种方式遵循SCP语法,则将需要该命令。有关更多详细信息,请参阅我的答案。
VonC'1

1
这救了我!经过数小时的尝试。谢谢你,伙计!
网站站长G

GitHub可移植性自动更新,我不再能够使用git。我不得不再次将git放在环境路径中,并添加此文件,然后所有文件再次运行。谢谢!
克雷格

这对我有帮助。我有一个旧版本的git(1.9.1),似乎并不尊重sshCommand。但是我可以使用这种技术来指定IdentityFile我要使用的。
joeytwiddle

太好了!如果用户有多个ssh密钥,这将特别有用。在我的情况下,我为IdentityFile指定了第二个密钥,它起作用了。
Mian Asbat Ahmad

14

如果它适用于其他存储库,但不适用于特定的存储库,那么您可能使用了错误的远程url(即https而不是git@github.com

  1. 首先,仔细检查您的git ssh连接是否正常工作:

    ssh -T git@github.com
    
  2. 如果可行,请检查您的遥控器:

    git remote -v
    

    它将显示如下内容:

    origin  https://github.com/username/repo(fetch)
    origin  https://github.com/username/repo(push)
    
  3. 如果遥控器https在开头指示,那么您需要使用以下命令更改此网址:

    git remote set-url origin git@github.com:usertname/repo.git
    

转到此处了解更多详细信息。


1

GitHub最近对所有密钥进行了审核。转到帐户的关键部分以重新批准它。


我已经批准/删除了所有SSH密钥。我现在要添加新的密钥(再次查看我的问题),但是它行不通...我已经做了很多次了,而且没有问题。
trusktr'4

1

对于ssh,您需要更改url。打开git配置文件,并将网址更改为

url = git@github.com:username/repository.git

1

从github复制克隆地址时,Windows中出现一些奇怪的行结尾问题。

注意git之前的多余字符。它没有出现在我的控制台中。它是看不见的。

git clone git@github.com:user/repo.git ./docker
Cloning into './docker'...
Warning: Permanently added the RSA host key for IP address '140.82.XXX.X' to the list of known hosts.
\302\226git@github.com: Permission denied (publickey).
fatal: Could not read from remote repository.

我花了一些时间注意到\302\226响应中的before git。看到它之后,我在git @之前退格了,并确保那里只有一个空格并且它可以工作。


0

使用Windows版Git从Windows 7迁移到Windows 10时,我遇到了类似的问题。

我的公司Gitlab的SSH密钥在旧计算机上运行,​​并且在Windows cmd或Git Bash中使用此ssh命令运行良好(用git.my_server.com替换为Git服务器域)-所以我的Windows是能够使用密钥,但是Windows的Git不能:

ssh -T git@git.my_server.com

(显示为:“欢迎使用GitLab,@ my_username !!)。但是,当尝试使用git进行克隆,推入或拉入操作时,我收到了“权限被拒绝(公钥)”错误消息。

最初,我找不到Git使用的SSH密钥的位置/环境,因此我尝试使用Git Bash将ssh密钥复制/粘贴到此环境中:

  1. 从Windows“开始”菜单(而不是从目录)中打开Git Bash。输入

    pwd

    后来我发现这将返回ssh密钥的位置。在我的情况下,它返回了“ / u /”,这是我的Windows帐户中安装为“ U:\”的网络驱动器。

  2. 键入cd .ssh,然后输入dir。这可能会列出您当前存在的id文件,例如id_rsa和id_rsa.pub。我删除了这些文件,因为我不再需要它们了(如果您在安装中成功使用了其他SSH密钥,例如对于其他Git服务器,则可能要跳过此文件):

    rm id_rsa

    rm id_rsa.pub

  3. 创建一个新的id_rsa文件(如果您已有一个id_rsa文件,则也可以使用另一个名称,例如id_rsa_gitlab_my_username或类似的名称。在此名称中添加.pub作为公共密钥):

    vi id_rsa 然后按键盘上的“ i”以切换到文本插入模式。现在复制您的私钥文件的内容(我在C:\ Users \ my_windows_username.ssh \ id_rsa中拥有我的位置,并使用Notepad ++复制了完整的内容,Windows记事本也可以正常工作)。按键盘上的Escape键退出文本插入模式,然后输入':'和'x',然后按Enter保存文件。对公用密钥文件重复此操作。

  4. 如果您使用多个SSH密钥或对id_rsa文件使用了另一个名称,则还应该创建一个“配置”文件或复制现有配置文件的内容:

    vi config

    (再次,按“ i”,插入文本,按“:”,“ x”,然后按Enter。)我的文件如下所示(使用您的服务器,用户和SSH文件名):

    #SCC Gitlab
        Host git.my_server.com
        HostName git.my_server.com
        User git
        IdentityFile ~/.ssh/id_rsa
    

现在,我的Windows Git能够再次顺利地进行推,拉和克隆。


0

首先,尝试一下(根据需要更改您的电子邮件地址)

 ssh-keygen -t rsa -b 4096 -C "you@yourdomain.com"

如果您使用Cygwin进行创建,则可能对主目录感到困惑,这对我来说就是这样,因为我指的是(复制到GitHub)另一个目录中的旧/错误密钥。因此,万一发生这种情况,请在创建密钥后执行以下操作:

$ explorer .

它将弹出一个Windows资源管理器窗口,显示您的完整/绝对路径。那是我看到〜目录实际上是我的Cygwin目录的时候

C:\Program Files\cygwin64\home\{your_username}\.ssh

然后,我能够复制我的私密SSH密钥并粘贴到GitHub中,然后进行克隆等。然后工作了。

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.