Reputation: 28767
Just sometime ago I started getting this warning when pushing to GitHub.
WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.
Is this normal and how do I resolve it?
Upvotes: 665
Views: 99056
Reputation: 141
This worked for me First, let's back up your current known_hosts file:
cp ~/.ssh/known_hosts ~/.ssh/known_hosts_backup
Now, let's try to identify and remove the problematic lines. We can use the sed command to do this:
sed -i.bak '/^#/d' ~/.ssh/known_hosts
If that doesn't work, we can try to create a new known_hosts file:
mv ~/.ssh/known_hosts ~/.ssh/known_hosts_old
touch ~/.ssh/known_hosts
After doing either step 2 or 3
run your server command again
ssh root@<your ip>
Upvotes: 0
Reputation: 1907
For Windows, you can use Powershell and run the following command to delete the known_hosts.
Remove-Item "C:\\Users\\<HOSTNAME>/.ssh/known_hosts"
Upvotes: 0
Reputation: 195
For Mac os, version-14.2.1
open /Users/{UserName}/.ssh/known_hosts
'bitbucket.org ssh-rsa AAAA......=' or 'github.com ssh-ed25519 AAA.... '
/Users/{UserName}/.ssh/**known_hosts**
) by using [Command + S]Are you sure you want to continue connecting (yes/no/[fingerprint])?
yes
and press Enter
Upvotes: 2
Reputation: 10938
If curl
commands are giving you an error just edit your ~/.ssh/known_hosts
' github.com
entry with:
github.com ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCj7ndNxQowgcQnjshcLrqPEiiphnt+VTTvDP6mHBL9j1aNUkY4Ue1gvwnGLVlOhGeYrnZaMgRK6+PKCUXaDbC7qtbW8gIkhL7aGCsOr/C56SJMy/BCZfxd1nWzAOxSDPgVsmerOBYfNqltV9/hWCqBywINIR+5dIg6JTJ72pcEpEjcYgXkE2YEFXV1JHnsKgbLWNlhScqb2UmyRkQyytRLtL+38TGxkxCflmO+5Z8CSSNY7GidjMIZ7Q4zMjA2n1nGrlTDkzwDCsw+wqFPGQA179cnfGWOWRVruj16z6XyvxvjJwbz0wQZ75XK5tKSb7FNyeIEs4TT4jk+S4dhPeAUC5y+bDYirYgM4GC7uEnztnZyaVWQ7B381AK4Qdrwt51ZqExKbQpTUNn+EjqoTwvqNj4kqx5QUCI0ThS/YkOxJCXmPUWZbhjpCg56i+2aB6CmK2JGhn57K5mj0MNdBXA4/WnwH6XoPWJzK5Nyu2zB3nAZp+S5hpQs+p1vN1/wsjk=
Upvotes: 0
Reputation: 53055
On Ubuntu 20.04, using an Ed25519 key on GitHub, even after running ssh-keygen -R github.com
, per the main answer, I kept seeing these notifications each time I ran git push
:
$ git push
Warning: the ECDSA host key for 'github.com' differs from the key for the IP address '140.82.112.4'
Offending key for IP in /home/gabriel/.ssh/known_hosts:14
Matching host key in /home/gabriel/.ssh/known_hosts:15
Are you sure you want to continue connecting (yes/no)? yes
Warning: the ECDSA host key for 'github.com' differs from the key for the IP address '140.82.112.4'
Offending key for IP in /home/gabriel/.ssh/known_hosts:14
Matching host key in /home/gabriel/.ssh/known_hosts:15
Are you sure you want to continue connecting (yes/no)? yes
Warning: the ECDSA host key for 'github.com' differs from the key for the IP address '140.82.112.4'
Offending key for IP in /home/gabriel/.ssh/known_hosts:14
Matching host key in /home/gabriel/.ssh/known_hosts:15
Are you sure you want to continue connecting (yes/no)? yes
So, I finally just removed my ~/.ssh/known_hosts
file by renaming it like this:
(Try @bk2204's answer instead of running the mv
cmd below. Thanks, @Guntram Blohm).
mv ~/.ssh/known_hosts ~/.ssh/known_hosts.bak
...and now git push
finally works just fine again! I don't care that I have to re-authenticate all my SSH destinations whenever I use SSH again to a particular server, so effectively removing the ~/.ssh/known_hosts
file is fine. I hardly use SSH except for pushing to GitHub and GitLab anyway.
Note: the first time I ran git push
after that I had to type yes
, as shown below:
$ git push
The authenticity of host 'github.com (140.82.112.4)' can't be established.
ECDSA key fingerprint is SHA256:p2QAMXNIC1TJYWeIOttrVc98/R1BUFWu3/LiyKgUfQM.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added 'github.com,140.82.112.4' (ECDSA) to the list of known hosts.
Everything up-to-date
Before typing yes
, however, I first verified on GitHub's website that the SHA256:p2QAMXNIC1TJYWeIOttrVc98/R1BUFWu3/LiyKgUfQM
fingerprint was correct, and from GitHub. GitHub has the fingerprints for each key type here: https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/githubs-ssh-key-fingerprints
These are GitHub's public key fingerprints:
SHA256:uNiVztksCsDhcc0u9e8BujQXVUpKZIDTMczCvj3tD2s
(RSA)SHA256:br9IjFspm1vxR3iA35FWE+4VTyz1hYVLIE2t1/CeyWQ
(DSA - deprecated)SHA256:p2QAMXNIC1TJYWeIOttrVc98/R1BUFWu3/LiyKgUfQM
(ECDSA)SHA256:+DiY3wvvV6TuJJhbpZisF/zLDA0zPMSvHdkr4UvCOqU
(Ed25519)
Upvotes: 16
Reputation: 19146
The GitHub blog suggests simply:
ssh-keygen -R github.com
Unfortunately, it's not that easy and I keep getting errors like the following, showing that GitHub servers are in my known_hosts file stored by IP address.
Warning: the ECDSA host key for 'github.com' differs from the key for the IP address '192.30.255.113'
Offending key for IP in /.ssh/known_hosts:19
Matching host key in /.ssh/known_hosts:178
Are you sure you want to continue connecting (yes/no)? yes
You'd have to search 1000's of IP addresses associated with github.com's services to clean them up... 😈
I devised a Ruby script to search for GitHub IP addresses published via the the GitHub meta API. It is limited—it skips the huge "actions" IP address ranges, and only works for IPv4, but hopefully it helps someone else not have to press yes
a bunch of times.
https://gist.github.com/jcward/5a64c17a6b61de0f7a4d85d004e7679e
It is reproduced here for archival purposes:
#!/usr/bin/env ruby
#
# https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/githubs-ssh-key-fingerprints
# https://stackoverflow.com/questions/75830783
#
# Scan for github IP addresses in your knwon_hosts and remove them
# - Takes ~1.5 minutes on my machine
# - Skips the huge "actions" IP ranges
# - Skips IPv6
require 'json'
meta = JSON.parse `curl -s https://api.github.com/meta`
def num_to_ipv4 v
(v >> 24 & 255).to_i.to_s + "." +
(v >> 16 & 255).to_i.to_s + "." +
(v >> 8 & 255).to_i.to_s + "." +
(v >> 0 & 255).to_i.to_s
end
def get_ips_for octals, bits
ips = []
base = (octals[0] << 24) | (octals[1] << 16) | (octals[2] << 8) | octals[3]
num = 2**(32-bits)
0.upto(num) { |add|
ips.push( num_to_ipv4( base + add ) )
}
return ips
end
meta.each { |key, value|
next if key=="actions" # These ranges are too large
if (value.is_a?(Array)) then
value.each { |ip|
if (ip.match(/(\d+)\.(\d+)\.(\d+)\.(\d+)\/(\d+)/)) then
octals = [$1, $2, $3, $4].map(&:to_i)
bits = $5.to_i
ips = get_ips_for(octals, bits)
puts "# Scanning #{ key } range -- #{ ips.length } IPs"
ips.each { |ip|
search = `ssh-keygen -H -F #{ ip }`
if (search.length > 10) then
puts "Running: ssh-keygen -R #{ ip }"
`ssh-keygen -R #{ ip }`
end
}
end
}
end
}
Upvotes: 15
Reputation: 3126
According to GitHub's blog post, their SSH key was leaked and therefore they regenerated their key.
You need to remove your stored key by running:
ssh-keygen -R github.com
Which should output something like:
# Host github.com found: line 1
.ssh/known_hosts updated.
If you want to be proactive, you can follow with a command to fetch their new key. This may not work on Windows and isn't required as without it. The next time you attempt to access GitHub, you will be prompted to save the new key.
curl -L https://api.github.com/meta | jq -r '.ssh_keys | .[]' | sed -e 's/^/github.com /' >> ~/.ssh/known_hosts
Once completed, you can rerun the git
command you were attempting.
Upvotes: 55
Reputation: 711
From GitHub's We updated our RSA SSH host key, What you can do:
At approximately 05:00 UTC on March 24 [2023], out of an abundance of caution, we replaced our RSA SSH host key used to secure Git operations for GitHub.com. We did this to protect our users from any chance of an adversary impersonating GitHub or eavesdropping on their Git operations over SSH. This key does not grant access to GitHub’s infrastructure or customer data. This change only impacts Git operations over SSH using RSA. Web traffic to GitHub.com and HTTPS Git operations are not affected.
Solution: Remove the old RSA SSH key of GitHub from file .ssh/known_hosts and update the new one.
Upvotes: 37
Reputation: 76874
Yes, GitHub updated their RSA host key as mentioned in their blog post. You can follow the directions there to update your keys.
However, some people find that OpenSSH has also saved the host key for IP addresses via the CheckHostIP
option. This was enabled by default before OpenSSH 8.5, but tends to be unhelpful since it makes rotation hard, and so it was disabled in that version. That being said, it can be worked around like so (on Linux and Git Bash):
$ sed -i -e '/AAAAB3NzaC1yc2EAAAABIwAAAQEAq2A7hRGmdnm9tUDbO9IDSwBK6TbQa+PXYPCPy6rbTrTtw7PHkccKrpp0yVhp5HdEIcKr6pLlVDBfOLX9QUsyCOV0wzfjIJNlGEYsdlLJizHhbn2mUjvSAHQqZETYP81eFzLQNnPHt4EVVUh7VfDESU84KezmD5QlWpXLmvU31\/yMf+Se8xhHTvKSCZIFImWwoG6mbUoWf9nzpIoaSjB+weqqUUmpaaasXVal72J+UX2B+2RPW3RcT0eOzQgqlJL3RKrTJvdsjE3JEAvGq3lGHSZXy28G3skua2SmVi\/w4yCE6gbODqnTWlg7+wC604ydGXA8VJiS5ap43JXiUFFAaQ==/d' ~/.ssh/known_hosts
and like so on macOS:
$ sed -i '' -e '/AAAAB3NzaC1yc2EAAAABIwAAAQEAq2A7hRGmdnm9tUDbO9IDSwBK6TbQa+PXYPCPy6rbTrTtw7PHkccKrpp0yVhp5HdEIcKr6pLlVDBfOLX9QUsyCOV0wzfjIJNlGEYsdlLJizHhbn2mUjvSAHQqZETYP81eFzLQNnPHt4EVVUh7VfDESU84KezmD5QlWpXLmvU31\/yMf+Se8xhHTvKSCZIFImWwoG6mbUoWf9nzpIoaSjB+weqqUUmpaaasXVal72J+UX2B+2RPW3RcT0eOzQgqlJL3RKrTJvdsjE3JEAvGq3lGHSZXy28G3skua2SmVi\/w4yCE6gbODqnTWlg7+wC604ydGXA8VJiS5ap43JXiUFFAaQ==/d' ~/.ssh/known_hosts
That removes the key wherever it's found, either for hostnames or IP addresses. Since GitHub uses multiple IP addresses, it's not really possible to enumerate all of them and remove them all with ssh-keygen
, so removing the key itself manually is the best option.
You can then follow the directions from the blog post to update the keys automatically:
$ curl -L https://api.github.com/meta | jq -r '.ssh_keys | .[]' | \
sed -e 's/^/github.com /' >> ~/.ssh/known_hosts
Upvotes: 48
Reputation: 28767
This happened because on the 24th of March 2023, GitHub updated their RSA SSH host key used to secure Git operations for GitHub.com because the private key was briefly exposed in a public GitHub repository. You will get that message if you had remembered GitHub’s previous key fingerprint in your SSH client before that date.
As per per the linked blog post, the solution is to remove the old key by running this command:
$ ssh-keygen -R github.com
Now the next git
connection (pull, push or clone) should ask if you trust the new SSH key. Before entering yes
, ensure the shown new key is valid, using the list:
Refer to the blog post for other ways to fix the issue.
Upvotes: 982