“主机密钥验证失败”时如何建立 ssh 密钥对

Posted

技术标签:

【中文标题】“主机密钥验证失败”时如何建立 ssh 密钥对【英文标题】:How to establish ssh key pair when "Host key verification failed" 【发布时间】:2011-05-08 20:58:23 【问题描述】:

我已经在我的桌面和两台服务器之间以及从服务器到我的桌面之间设置了 ssh 密钥对,但是在我的桌面上重新安装操作系统后,我无法通过以下方式重新建立进入我的桌面的密钥对这个:

mkdir ~/.ssh
chmod 700 ~/.ssh
ssh-keygen -t 
ssh-copy-id username@server

我收到以下错误:

斜体中的名称更改以保护无辜我的桌面是Ubuntu,我找不到答案 here)

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@@@@@ @警告:远程主机标识已更改! @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@@@@@@@@ 可能有人在做一些讨厌的事情! 有人现在可能正在窃听你(中间人 攻击)! 也有可能 RSA 主机密钥刚刚更改。 远程主机发送的 RSA 密钥的指纹是 ab:cd:ef:gh 请联系您的系统管理员。 在 /home/user/.ssh/known_hosts 中添加正确的主机密钥以获取 摆脱这个消息。 /home/user/.ssh/known_hosts:1 中的违规键 user.server 的 RSA 主机密钥已更改,您已请求严格 检查。 主机密钥验证失败。

【问题讨论】:

【参考方案1】:
ssh-keygen -R hostname

这将从known_hosts中删除有问题的键

手册页条目如下:

-R hostname 从 known_hosts 文件中删除属于主机名的所有键。此选项对于删除散列主机很有用(请参阅 -H 选项 以上)。

【讨论】:

我也有同样的问题,但合法。我的笔记本电脑在两个网络(家庭和工作)之间移动,并且有重叠。我在工作时需要ssh到机器A,在家时需要ssh到机器B,但是两台机器都有相同的IP地址。尽管存在 IP 地址冲突,是否可以将两者都保留为我的 known_hosts 文件中的有效条目? +1 "主机密钥验证失败"表示远程主机的主机密钥被更改。 ssh 将远程主机的主机密钥存储在 ~/.ssh/known_hosts 中。您可以手动编辑该文本文件并删除旧密钥(您可以在错误消息中看到行号),或使用 ssh-keygen -R hostname 注意:在本地机器上运行命令,而不是在远程服务器上运行。或者您可以在本地机器上打开~/.ssh/known_hosts 并手动删除该行。 man ssh-keygen: -R hostname 从 known_hosts 文件中删除属于 hostname 的所有密钥。此选项对于删除散列主机很有用(请参阅上面的 -H 选项)。【参考方案2】:

很可能,远程主机 ip 或 ip_alias 不在 ~/.ssh/known_hosts 文件中。你 可以使用以下命令将主机名添加到 known_hosts 文件中。

$ssh-keyscan -H -t rsa ip_or_ipalias >> ~/.ssh/known_hosts

另外,我生成了以下脚本来检查特定 ip 或 ipalias 是否在 know_hosts 文件中。

#!/bin/bash
#Jason Xiong: Dec 2013   
# The ip or ipalias stored in known_hosts file is hashed and   
# is not human readable.This script check if the supplied ip    
# or ipalias exists in ~/.ssh/known_hosts file

if [[ $# != 2 ]]; then
   echo "Usage: ./search_known_hosts -i ip_or_ipalias"
   exit;
fi
ip_or_alias=$2;
known_host_file=/home/user/.ssh/known_hosts
entry=1;

cat $known_host_file | while read -r line;do
  if [[ -z "$line" ]]; then
    continue;
  fi   
  hash_type=$(echo $line | sed -e 's/|/ /g'| awk 'print $1'); 
  key=$(echo $line | sed -e 's/|/ /g'| awk 'print $2');
  stored_value=$(echo $line | sed -e 's/|/ /g'| awk 'print $3'); 
  hex_key=$(echo $key | base64 -d | xxd -p); 
  if  [[ $hash_type = 1 ]]; then      
     gen_value=$(echo -n $ip_or_alias | openssl sha1 -mac HMAC \
         -macopt hexkey:$hex_key | cut -c 10-49 | xxd -r -p | base64);     
     if [[ $gen_value = $stored_value ]]; then
       echo $gen_value;
       echo "Found match in known_hosts file : entry#"$entry" !!!!"
     fi
  else
     echo "unknown hash_type"
  fi
  entry=$((entry + 1));
done

【讨论】:

这对我有用。我正在使用 CI,我想通过 Deployer/Envoy 进行 SSH,所以我需要先添加主机。【参考方案3】:

第一步:$Bhargava.ssh#

ssh-keygen -R 199.95.30.220

第二步:$Bhargava.ssh #

ssh-copy-id 主机名@199.95.30.220

          Enter the the password.........

第三步:Bhargava .ssh #

ssh 主机名@199.95.30.220

Welcome to Ubuntu 14.04.3 LTS (GNU/Linux 3.13.0-68-generic x86_64) * Documentation: https://help.ubuntu.com/ Ubuntu 14.04.3 LTS server : 228839 ip : 199.95.30.220 hostname : qt.example.com System information as of Thu Mar 24 02:13:43 EDT 2016 System load: 0.67 Processes: 321 Usage of /home: 5.1% of 497.80GB Users logged in: 0 Memory usage: 53% IP address for eth0: 199.95.30.220 Swap usage: 16% IP address for docker0: 172.17.0.1 Graph this data and manage this system at: https://landscape.canonical.com/ Last login: Wed Mar 23 02:07:29 2016 from 103.200.41.50

主机名@qt:~$

【讨论】:

谢谢!但这与现有的answer above 有什么不同吗?【参考方案4】:

如果您确定服务器是正确的,sed -i 1d ~/.ssh/known_hosts 将删除您本地 ~/.ssh/known_hosts 的第 1 行。下次连接时,新的正确密钥将添加到文件中。

【讨论】:

不错的解决方案。但这不是假设有问题的服务器(在这种情况下是我的桌面)是文件的第一行吗?我发现“ssh-keygen -F hostname”告诉该行主机名密钥已打开,所以如果 n 是行号,sed -i nd ~/.ssh/know_hosts 可能会起作用' @David:您在上面粘贴的输出显示“/home/user/.ssh/known_hosts:1 中的密钥有问题”。您已经知道行号是什么,不必运行ssh-keygen -F 我没有意识到这个数字是多少...感谢您指出这一点。【参考方案5】:

有时您在串行控制台上工作时也会出现这种情况,然后在详细模式下检查上述命令-v 会显示 /dev/tty 不存在,而它确实存在。

在上述情况下,只需删除 /dev/tty 并创建 /dev/ttyS0 到 /dev/tty 的符号链接。

【讨论】:

【参考方案6】:

这意味着您的远程主机密钥已更改(可能是主机密码更改),

您的终端建议以 root 用户身份执行此命令

$ ssh-keygen -f "/root/.ssh/known_hosts" -R [www.website.net]:4231

您必须从您的电脑/服务器上的主机列表中删除该主机名。复制建议的命令并以 root 用户身份执行。

$ sudo su                                                            // Login as a root user

$ ssh-keygen -f "/root/.ssh/known_hosts" -R [www.website.net]:4231   // Terminal suggested command execute here
Host [www.website.net]:4231 found: line 16 type ECDSA
/root/.ssh/known_hosts updated.
Original contents retained as /root/.ssh/known_hosts.old

$ exit                                                               // Exist from root user

$ sudo ssh root@www.website.net -p 4231                              // Try again

我希望这可行。

【讨论】:

【参考方案7】:

当主机密钥过期或更改时会出现此问题。您可以删除主机正在使用的密钥并再次尝试 ssh,以便添加客户端和服务器都知道的新密钥。

您可以使用 cat /.ssh/known_hosts 检查与您的主机关联的密钥。现在,您可以手动删除主机密钥或使用 ssh-keygen 选项。您可以执行以下任一选项。

    手动删除键

    vim /.ssh/known_hosts

删除与您的主机关联的密钥。

    使用 ssh-keygen 删除密钥

    ssh-keygen -R your_host_or_host_ip

这将删除与主机关联的密钥。

现在,您可以像往常一样通过 ssh 连接到您的主机,系统会询问您是否要继续连接到该主机。输入 yes 后,该主机将使用更新的密钥添加到 your/.ssh/known_hosts。现在,你应该是你的主人了。

【讨论】:

【参考方案8】:

首先您应该删除现有的密钥。大多数基于 Linux 的操作系统中的 SSH 密钥将保存在此文件“/root/.ssh/known_hosts”中,因此为了删除与主机相关的密钥,将使用以下命令:

ssh-keygen -f "/root/.ssh/known_hosts" -R [Hostname]

问候 K1

【讨论】:

【参考方案9】:
rm -f /home/user/.ssh/known_hosts

或打开它并删除有问题的 ip/主机名的条目

(P.S. 它会在您发布的错误消息中准确地告诉您这一点)

【讨论】:

我已经尝试过了,但是从主机(我的桌面)而不是来宾(我从桌面登录的服务器)中删除了文件。谢谢提醒... 您不必删除整个文件... @ephemient:在如何删除整个文件的示例之后适当地指出了这一点;)我在我的计算机上打开了 known_hosts 文件,它对我来说看起来很神秘。我很喜欢你的回答。只是看起来我稍微击败了你! @ephemient 另外,我很想知道您是否知道删除整个文件会带来不利影响的任何情况,除了(下一次)第一次尝试连接到 IP 时的小警告在 known_hosts 中。它真的会破坏任何东西还是只是一个有点烦人的警告?【参考方案10】:

当您尝试使用 ssh 连接远程服务器时:

$ ssh username@ip_address

然后出现错误,解决它:

$ ssh-keygen -f "/home/local_username/.ssh/known_hosts" -R "ip_address"

【讨论】:

【参考方案11】:

任务无密码身份验证。

错误:主机密钥验证失败。

来源:10.13.1.11 目标:10.13.1.35

临时解决方法:

[user@server~]$ ssh user@10.13.1.35 无法确定主机“10.13.1.35 (10.13.1.35)”的真实性。 RSA 密钥指纹为 b8:ba:30:46:a9:ab:70:12:1a:f2:f1:61:69:73:0a:19。 您确定要继续连接(是/否)?是的 警告:将“10.13.1.35”(RSA) 永久添加到已知主机列表中。

再次尝试对用户进行身份验证...它将起作用。

【讨论】:

以上是关于“主机密钥验证失败”时如何建立 ssh 密钥对的主要内容,如果未能解决你的问题,请参考以下文章

WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! --主机密钥验证失败

PM2 (Node.js) 部署 - 主机密钥验证失败

标准错误:主机密钥验证失败 | GitHub |詹金斯 |视窗

GitLab runner 获取子模块的“主机密钥验证失败”

Gitlab-ci alpine图像:主机密钥验证失败

无法“git pull” - 主机密钥验证失败