ChatGPT解决这个技术问题 Extra ChatGPT

Git: How to solve Permission denied (publickey) error when using Git?

I'm on Mac Snow Leopard and I just installed git.

I just tried

git clone git@thechaw.com:cakebook.git

but that gives me this error:

Initialized empty Git repository in `/Users/username/Documents/cakebook/.git/`
Permission denied (publickey).
fatal: The remote end hung up unexpectedly

What am I missing?
I've also tried doing ssh-keygen with no passphase but still same error.

have you tried to upload the public key that you have generated via ssh-keygen?
My problem was that I tried clone from sudo - this is another user with another public key.
same error. I previously created a public key through github, then generated another key-pair with the ssh-keygen utility. Deleting the old public key in personal settings on github and adding my ssh generated id_rsa.pub key to SSH and GPG keys fixed the cloning permission issues.
If you're running bash screen and have done everything in every available website, there's a high chance you might have logged out from the session you created the screen session. A quick workaround is to restart the screen session: see superuser.com/q/180148
There's a page in the documentation that offers some guidance - docs.github.com/en/authentication/troubleshooting-ssh/…

R
Rufinus

If the user has not generated a ssh public/private key pair set before

This info is working on theChaw but can be applied to all other git repositories which support SSH pubkey authentications. (See [gitolite][1], gitlab or github for example.)

First start by setting up your own public/private key pair set. This can use either DSA or RSA, so basically any key you setup will work. On most systems you can use ssh-keygen.

First you'll want to cd into your .ssh directory. Open up the terminal and run: cd ~/.ssh && ssh-keygen Next you need to copy this to your clipboard. On OS X run: cat id_rsa.pub | pbcopy On Linux run: cat id_rsa.pub | xclip On Windows (via Cygwin/Git Bash) run: cat id_rsa.pub | clip On Windows (Powershell) run: Get-Content id_rsa.pub | Set-Clipboard (Thx to @orion elenzil) Add your key to your account via the website. Finally setup your .gitconfig. git config --global user.name "bob" git config --global user.email bob@... (don't forget to restart your command line to make sure the config is reloaded) That's it you should be good to clone and checkout.

Further information can be found at https://help.github.com/articles/generating-ssh-keys (thanks to @Lee Whitney) [1]: https://github.com/sitaramc/gitolite

-

If the user has generated a ssh public/private key pair set before

check which key have been authorized on your github or gitlab account settings

determine which corresponding private key must be associated from your local computer

eval $(ssh-agent -s)

define where the keys are located

ssh-add ~/.ssh/id_rsa


Ok. This is actually not a git but an ssh synchronization problem. I got the same with Assembla and you link helped me resolving it. Thanks !
I experienced a problem with the keygen. It is sensitive to the email address in a global env variable. In case you are having this problem, you will want to specify the email address for your github account in the first step: ssh-keygen -t rsa -C "your_email@youremail.com"
If that still doesn't work, you'll need to ssh-add ~/.ssh/id_rsa.
Copying using xclip on Linux only worked by doing the following xclip -sel clip < ~/.ssh/id_rsa.pub which is listed here: help.github.com/articles/generating-ssh-keys
if you're using PowerShell, that 'copy to your clipboard' step can be cat id_rsa.pub | Set-Clipboard, or to be even more powershelly, Get-Content id_rsa.pub | Set-Clipboard.
s
stevek-pro

More extensive troubleshooting and even automated fixing can be done with:

ssh -vT git@github.com

Alternatively, according to below comments, we could issue:

ssh -vT git@gitlab.com

or substitute gitlab/github with whatever Git Instance your organisation is running.

Source: https://help.github.com/articles/error-permission-denied-publickey/


My problem had to do with having a different key for my server. Once I used the above command to determine the issue, I fixed the IdentifyFile in my config file and it worked.
Showed which key github was trying to use to authenticate. v helpful
This doesn't fix anything. I still get the error in OP's question.
The command is there to help you troubleshoot the issue, it isn't a magic fix-this-for-me switch.
I can't say this solved anything, but it is a hell of an interesting command and works with GitHub Enterprise as well.
k
kavinyao

This error can happen when you are accessing the SSH URL (Read/Write) instead of Git Read-Only URL but you have no write access to that repo.

Sometimes you just want to clone your own repo, e.g. deploy to a server. In this case you actually only need READ-ONLY access. But since that's your own repo, GitHub may display SSH URL if that's your preference. In this situation, if your remote host's public key is not in your GitHub SSH Keys, your access will be denied, which is expected to happen.

An equivalent case is when you try cloning someone else's repo to which you have no write access with SSH URL.

In a word, if your intent is to clone-only a repo, use HTTPS URL (https://github.com/{user_name}/{project_name}.git) instead of SSH URL (git@github.com:{user_name}/{project_name}.git), which avoids (unnecessary) public key validation.

Update: GitHub is displaying HTTPS as the default protocol now and this move can probably reduce possible misuse of SSH URLs.


With the https://github.com git url, it still says SSL certificate problem: self signed certificate in certificate chain. git -c http.sslVerify=false clone ... seems like a dangerous move. Chrome doesn't give any ssl warnings though. Thoughts?
@uosɐſ Sorry but I never encountered this problem. Maybe the first thing to do is to try the same command from a different machine and see if the problem persists.
This did it for me, too. Thanks. In order to clone my git repo onto my shared hosting account (1and1) I had to use git clone https://github.com/MyUserName/MyRepo.git Simply click on the text links beneath the repo URL to the right of the Github page where it says "You can clone with HTTPS, SSH, or Subversion.". (Click HTTPS to get the link instead of the default SSH.)
I had this exact same issue; I have (write) access to a public-facing repo with an SSH key but needed read-only access to clone LFS objects. Replacing the ssh address with the HTTPS URL solved my issue.
I don't understand.. why does SSL URL require both read AND write permissions to clone?
j
jarora

The github help link helped me sort out this problem. Looks like the ssh key was not added to the ssh-agent. This is what I ended up doing.

Command 1:

Ensure ssh-agent is enabled. The command starts the ssh-agent in the background:

eval "$(ssh-agent -s)"

Command 2:

Add your SSH key to the ssh-agent:

ssh-add ~/.ssh/id_rsa

After upgrade to OSx El Capitan to Sierra this worked for me.
This worked for me on Raspberry Pi, where ssh-add has a "-k" flag instead of "-K", apparently. But once I added my deployment key, I was able to successfully clone my repo using its SSH link.
This is the real solution and it was copied+pasted to the accepted answer 4 years later (on Jan 11 ' 19), so this deserves all our upvotes!
stackoverflow.com/questions/17846529/…. See if you can find something here or just restart your system and see if it works.
"Adding the SSH key to the ssh-agent" solved my problem!
P
Promise Preston

Got the same error report.

Fixed with using the HTTPS instead of the SSH protocol. Since I don't want to set "SSH keys" for a test PC.

Change URL to HTTPS when clone:

git clone https://github.com/USERNAME/REPOSITORY.git

My problem is a little bit different: I have the URL set to SSH when adding an existing local repo to remote, by using:

git remote add origin ssh://github.com/USERNAME/REPOSITORY.git

To fix it, reset the URL to HTTPS:

git remote set-url origin https://github.com/USERNAME/REPOSITORY.git

BTW, you may check your URL using the command:

git remote -v
origin  https://github.com/USERNAME/REPOSITORY.git (fetch)
origin  https://github.com/USERNAME/REPOSITORY.git (push)

Hope this will help some one like me. :D


I did it this way. It was all ok till I wanted to push an amended commit... and it failed. I got stuck, as no new commits could be used because it's protected against such activity.
Thanks! Not sure why my repo was suddenly configured for SSH, I had only ever used HTTPS so I'm glad you proposed this fix.
c
crimbo

Another possibility on Windows, which is not covered in any of these answers, and is not covered in the git or github docs on troubleshooting:

git may be using a different openssh executable than you think it is.

I was receiving the Permission denied (public key) error when trying to clone or pull from github and ssh.dev.azure.com, and I'd followed all the instructions and verified that my SSH keys were setup correctly (from SSH's standpoint) using ssh -vT git@github.com and ssh -vT git@ssh.dev.azure.com. And was still getting these errors:

git@github.com: Permission denied (publickey).
fatal: Could not read from remote repository.

Please make sure you have the correct access rights
and the repository exists.

I eventually figured out that the problem is that Git for Windows, and Windows, both have their own versions of openssh. This is documented here: https://github.com/desktop/desktop/issues/5641

I was relying on the Windows ssh-agent service to store my ssh key passphrases, so git (with it's separate version of openssh) couldn't read my private keys. I consider it a bug that this error message is used - it's misleading.

The fix was:

git config --global core.sshCommand "'C:\Windows\System32\OpenSSH\ssh.exe'"

Or in your ~/.gitconfig:

[core]
    sshCommand = 'C:\\Windows\\System32\\OpenSSH\\ssh.exe'

Perhaps this will be fixed in git for Windows soon, but this is the 2nd time I've wasted time on this issue.


This also resolved it for me. Strange only one of my visual studio solutions, when I utilized Package Manager Console, with git pull I'd receive"Permission Denied (publickey)". However, on other Visual Studio solutions (projects of mine), I wouldn't have any problems... This solution makes sense, how the problem originated for only one of my projects is still a bit of a mystery.
Or you can modify C:\Program Files\Git\etc\gitconfig instead, if you use Cygwin git in parallel and want to leave ~/.gitconfig as-is.
This issue still exists on win11 (at least after upgrade from win10). Thanks for the solution! Docs can't help with it
Choose "Use external OpenSSH" instead of the default option "Use bundled OpenSSH" in the installation process.
Another thank-you! I ran into the same issue when updating to Git-2.35.1.2 (from Git-2.31.1), and this resolved it.
C
CBowe14

I was struggling with the same problem that's what I did and I was able to clone the repo. I followed this procedure for Mac.

First Step: Checking if we already have the public SSH key.

Open Terminal. Enter ls -al ~/.ssh to see if existing SSH keys are present:

Check the directory list to see if you already have a public SSH key. Default public is one of the following d_dsa.pub, id_ecdsa.pub, id_ed25519.pub, id_rsa.pub.

If you don't find then go to step 2 otherwise follow step 3

Step 2: Generating public SSH key

Open Terminal. Enter the following command with a valid email address that you use for github ssh-keygen -t rsa -b 4096 -C "your_email@example.com" You will see the following in your terminal Generating public/private rsa key pair. When it prompts to"Enter a file in which to save the key," press Enter. This accepts the default file location. When it prompts to Enter a file in which to save the key (/Users/you/.ssh/id_rsa): [Press enter] Just press enter again. At the prompt, "Type a secure passphrase. Enter passphrase (empty for no passphrase): [Type a passphrase]" press enter if you don't want to Enter same passphrase again: [Type passphrase again] press enter again

This will generate id_rsa.pub

Step 3: Adding your SSH key to the ssh-agent

Interminal type eval "$(ssh-agent -s)" Add your SSH key to the ssh-agent. If you are using an existing SSH key rather than generating a new SSH key, you'll need to replace id_rsa in the command with the name of your existing private key file. Enter this command $ ssh-add -K ~/.ssh/id_rsa Now copy the SSH key and also add it to you github account In terminal enter this command with your ssh file name pbcopy < ~/.ssh/id_rsa.pub This will copy the file to your clipboard Now open you github account Go to Settings > SSH and GPG keys > New SSH key Enter title and paste the key from clipboard and save it. Voila you're done.


Windows user copy via : cat ~/.ssh/id_rsa.pub | clip
Finally after reading here and there for an hour, step by step solution....works great. Remember to add your github password as the passphrase in the steps otherwise will have to add manually everytime
Great answer. I would also add it was helpful for me to get info on how to change my remote git details -- see this link for details: stackoverflow.com/a/63830575/1818235
Thank you! This worked well for me, except: instead of ssh-add -K ~/.ssh/id_rsa I ran ssh-add ~/.ssh/id_rsa The "-K" option prompted for a PIN, which I don't have.
W
Wouter Schoofs

This works for me:

ssh-add ~/.ssh/id_rsa

Could not open a connection to your authentication agent.
E
Ezra Siton

Visual guide (Windows)

1 of 2. Git batch side

https://i.stack.imgur.com/gcibV.png

1.2. Paste the text below (Change to your GitHub account email)

$ ssh-keygen -t rsa -b 4096 -C "your_email@example.com"

https://i.stack.imgur.com/PmaB0.png

https://i.stack.imgur.com/SrJtp.png

1.4. Click Enter Twice (Or set SSH key passphrases - Gitbub passphrases docs)

> Enter passphrase (empty for no passphrase): [Type a passphrase]
> Enter same passphrase again: [Type passphrase again]

1.5. The key generate:

Your identification has been saved in /c/Users/user/.ssh/id_rsa...

1.6. Copy the SSH key to your clipboard.

$ clip < ~/.ssh/id_rsa.pub

2 of 2. Github website user side

https://i.stack.imgur.com/1XG4T.png

https://i.stack.imgur.com/am12C.png

https://i.stack.imgur.com/8QQtz.png

Done :)

https://i.stack.imgur.com/uXfJa.png

If someone doesn't want to use SSH use HTTPS :

https://i.stack.imgur.com/aQ1kH.png

Github docs: https://docs.github.com/en/github/authenticating-to-github/connecting-to-github-with-ssh


M
Mason Bryant

Note that (at least for some projects) you must have a github account with an ssh key.

Look at the keys listed in your authentication agent (ssh-add -l)
(if you don't see any, add one of your existing keys with ssh-add /path/to/your/key (eg: ssh-add ~/.ssh/id_rsa))
(if you don't have any keys, first create one. See: http://rcsg-gsir.imsb-dsgi.nrc-cnrc.gc.ca/documents/internet/node31.html or just google ssh-keygen)

To verify that you have a key associated with your github account:

Go to: https://github.com/settings/ssh

You should see at least one key with a hash key matching one of the hashes you saw when you typed ssh-add -l just a minute ago.

If you don't, add one, then try again.


You know you have this problem if you have been asked to connect with an SSH key (url looks like git@github.company.com instead of https://github.company.com) but your Github settings don't have an SSH key. Github supplies step-by-step directions at docs.github.com/en/github/authenticating-to-github/….
w
wtj

If your problem appears out of the blue recently (the latter half of 2021), it may have been caused by incompatible hash algorithms.

As of this post (Oct 2021), the latest version of Git for windows is 2.33.1 (release note), who has embraced the latest OpenSSH 8.8p1 (release note), who in turn has deprecated SHA-1. Meanwhile, if your remote Git repository still sticks to SHA-1, you'll fail the authentication.

To see whether you could have fallen into this case, check the version of your software by:

ssh -V
git --version

Then you should check the "Potentially-incompatible changes" section of OpenSSH 8.8/8.8p release note.

TL;DR

Solution 1: Enable SHA-1 again by adding this to your ~/.ssh/config file:

Host <remote>
    HostkeyAlgorithms +ssh-rsa
    PubkeyAcceptedAlgorithms +ssh-rsa

Remember to replace <remote> with the hostname of your remote repository.

Solution 2: Regenerate your key pair using ECDSA or Ed25519, instead of RSA. For example:

ssh-keygen -t ecdsa -C <comment>

Remember to replace <comment> with your own mnemonic phrase. Then, upload the generated public key to your remote repository.

FYI, I encountered this prompt message when accessing Gitee.com, who uses golang.org/x/crypto/ssh on their server and has posted a page on this issue here (in Mandarin).

git@gitee.com: Permission denied (publickey).

I used Solution 2. Now I'm able to access to remote repo. Thanks a lot. That solution works for Git, TrotoiseGit and SourceTree configured to Git ssh instead of embedded one.
A
Amir

I met the same issue because of I was thought the difference between SSH and HTTPS is

https://github.com/USERNAME/REPOSITORY.git

ssh://github.com/USERNAME/REPOSITORY.git

So I changed from HTTPS to SSH just by changing https:// to ssh:// nothing on the end of the url was changed.

But the truth is:

https://github.com/USERNAME/REPOSITORY.git

git@github.com:USERNAME/REPOSITORY.git

Which means I changed ssh://github.com/USERNAME/REPOSITORY.git to git@github.com:USERNAME/REPOSITORY.git it works.

Stupid error but hope helps someone!


yes, i changed ssh://github.com/USERNAME/REPOSITORY.git to git@github.com:USERNAME/REPOSITORY.git it works.
I see because i just use ssh instead of https so i just changed 'https://' to 'ssh://` then i got the error. So change 'ssh://git/../` to 'git@../" : ) Edited my answer.
It works for me. Thank you very much! I tried https and then ssh but it still keeps denying my access until make it your way with "git clone git@github.com:/myusername/myproject.git".
S
Satishakumar Awati

These are the steps I followed in windows 10

Open Git Bash. Generate Public Key: ssh-keygen -t rsa -b 4096 -C "youremailaddress@xyz.com" Copy generated key to the clipboard (works like CTRL+C) clip < ~/.ssh/id_rsa.pub Browser, go to Github => Profile=> Settings => SSH and GPG keys => Add Key Provide the key name and paste clipboard (CTRL+V). Finally, test your connection (Git bash) ssh -T git@github.com

https://i.stack.imgur.com/dpYYk.png

Thanks!


Spot on Answer!!! Works perfectly.
R
Richipal

I had a slight different situation, I was logged on to a remote server and was using git on the server, when I ran any git command I got the same message

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

The way I fixed it was by changing the file /etc/ssh_config on my Mac. from

ForwardAgent no 

to

ForwardAgent yes

The error was occurring while trying to fetch gems from github from a VirtualBox VM. Updated my Vagrantfile to use config.ssh.forward_agent = true, restarted the VM, and now it works.
Might not be the best choice in terms of security according to this: heipei.github.io/2015/02/26/…
G
Gopala raja naika

Please try this if nothing is worked out

Generate personal Access token (Setting -> Developer settings -> Personal access tokens -> Generate new token) git remote set-url origin https://@github.com/USERNAME/REPOSITORY.git

Note: If a password popup comes, try to enter the token only (try twice)


K
Kandarp

I had to copy my ssh keys to the root folder. Google Cloud Compute Engine running Ubuntu 18.04

sudo cp ~/.ssh/* /root/.ssh/

K
KeshavDulal

Solution using gh i.e. Github's official CLI

gh installation

brew install gh

gh login or authentication via cli

gh auth login

repo clone

gh repo clone <username or orgname>/<repo-name>

Example: gh repo clone keshavdulal/sample-repo

Rant: I too was bashing my head when git clone suddenly decided not to work anymore and I don't have the patience or brainpower to relearn ssh/public keys/cryptography from scratch just to clone a freaking repo I already have access to. Also surprised no one mentioned gh in the answers yet


F
Fabian Lauer

Guys this is how it worked for me:

Open terminal and go to user [See attached image] Open .ssh folder and make sure it doesn't have any file like id_rsa or id_rsa.pub otherwise sometimes it wont properly rewrite files git --version [Check for git installation and version] git config --global user.email "your email id" git config --global user.name "your name" git config --list [make sure you have set your name & email] cd ~/.ssh ssh-keygen, it prompts for saving file, allow it cat ~/.ssh/id_rsa.pub [Access your public key & copy the key to gerrit settings]

Note: You should not be using the sudo command with Git. If you have a very good reason you must use sudo, then ensure you are using it with every command (it's probably just better to use su to get a shell as root at that point). If you generate SSH keys without sudo and then try to use a command like sudo git push, you won't be using the same keys that you generated

https://i.stack.imgur.com/ZVElb.png

https://i.stack.imgur.com/eO8bK.png


Thanks a lot -name changed in git repo to Deploy keys in repo setting
J
Jason

On Windows, make sure all your apps agree on HOME. Msys will surprisingly NOT do it for you. I had to set an environment variable because ssh and git couldn't seem to agree on where my .ssh directory was.


A
Andrew

Are you in a corporate environment? Is it possible that your system variables have recently changed? Per this SO answer, ssh keys live at %HOMEDRIVE%%HOMEPATH%\.ssh\id_rsa.pub. So if %HOMEDRIVE% recently changed, git doesn't know where to look for your key, and thus all of the authentication stuff.

Try running ssh -vT git@github.com. Take note of where the identity file is located. For me, that was pointing not to my normal \Users\MyLogin but rather to a network drive, because of a change to environment variables pushed at the network level.

The solution? Since my new %HOMEDRIVE% has the same permissions as my local files, I just moved my .ssh folder there, and called it a day.


this work for me. yesterday my ssh key working but today some setting of my system get changed. I just add shh key again and it's working now.
V
Vizllx

One of the easiest way

go to terminal-

  git push <Git Remote path> --all

d
duhaime

I hit this error because I needed to give my present working directory permissions 700:

chmod -R 700 /home/ec2-user/

H
Hrvoje

ALWAYS CHECK GITHUB FOR SSH-KEYS GENERATION PROCEDUR, NOT SOME OUTDATED BLOG

https://docs.github.com/en/authentication/connecting-to-github-with-ssh/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent

There you can see that keys are generated with:

ssh-keygen -t ed25519 -C "your_email@example.com"

So algorithm is ed25519 not rsa or anything else.


I used some old RSA Keys which didnt worked out because it has to be ed25519 as you stated. Thanks a lot for this hint. Your command did the trick, using no password.
g
gMale

The basic GIT instructions did not make a reference to the SSH key stuff. Following some of the links above, I found a git help page that explains, step-by-step, exactly how to do this for various operating systems (the link will detect your OS and redirect, accordingly):

http://help.github.com/set-up-git-redirect/

It walks through everything needed for GITHub and also gives detailed explanations such as "why add a passphrase when creating an RSA key." I figured I'd post it, in case it helps someone else...


N
Nizar B.

The easiest solution to this, when you are trying to push to a repository with a different username is:

 git remote set-url origin https://USERNAME@github.com/USERNAME/PROJECTNAME.git

C
Community

In addition to Rufinus' reply, the shortcut to copy your ssh key to the clipboard in Windows is:

type id_rsa.pub | clip

Refs:

Print to standard output

Copy command line output to clipboard


k
keios

If you have more than one key you may need to do ssh-add private-keyfile


[root@li566-238 hanjiyun]# ssh-add private-keyfile private-keyfile: No such file or directory
k
karthik339

Its pretty straight forward. Type the below command

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

Generate the SSH key. Open the file and copy the contents. Go to GitHub setting page , and click on SSH key . Click on Add new SSH key, and paste the contents here. That's it :) You shouldn't see the issue again.


T
TiiGRUS

I helped the following:

Open Terminal (Git Bash) Remove all files in directory .ssh or rename and create new .ssh folder. To follow in the steps of the instructions: Generating a new SSH key Adding your SSH key to the ssh-agent

System: Windows 10.


A
Anupam Chaplot

I deleted node_modules/ package-lock.json and yarn.lock files. Ran npm i again. This resolved the issue for me.