【问题标题】:ssh keys in known hosts, but keygen -F not working已知主机中的 ssh 密钥,但 keygen -F 不起作用
【发布时间】:2017-06-13 19:38:28
【问题描述】:

我在 stackoverflow 的其他地方找到了这段代码:

if [ -z "`ssh-keygen -F ${wPCS_IP}`" ]; then  
  ssh-keyscan -p ${wPCS_PT} -H ${wPCS_IP} >> ~/.ssh/known_hosts
fi

我在使用代码时遇到了两个问题:

  1. 即使成功,此代码也会生成错误 ($?=1)。

  2. 如果我在添加 known_hosts 后再次运行 ssh-keygen -F ${wPCS_IP},它不会在 known_hosts 中找到密钥,即使它们是刚刚添加的。这是更大的问题。

本地机器是 Ubuntu Server 16.04 LTS,远程机器是 Ubuntu Server 14.04 LTS。

我的代码和我找到的代码示例之间的主要区别在于我使用了端口选项 -p。

另外,我注意到 known_hosts 文件没有按名称或 IP 地址列出机器。这与我的 Gentoo 笔记本电脑不同。

【问题讨论】:

  • 尝试告诉ssh-keygen known_hosts 文件在哪里。更好的方法是if ! ssh-keygen -F ${wPCS_IP} -f ~/.ssh/known_hosts > /dev/null 2>&1; then ssh-keyscan -p ${wPCS_PT} ${wPCS-IP} >> ~/.ssh/known_hosts; fi
  • 感谢您的回复。我完全按原样使用了您的命令,并且产生了相同的结果。它添加了 known_hosts 所需的行,但是当再次运行时,它不会检测到 known_hosts 文件中的主机并再次生成它们。
  • 在 Ubuntu 16.04 服务器上,known_hosts 文件列出了远程机器的端口号。我想知道是否需要以某种方式指定端口才能使 ssh-keygen -F 工作?

标签: openssh ssh-keygen


【解决方案1】:

所以事实证明,当 ssh 有备用端口时,它会以这种格式作为 IP 地址的一部分存储在 known_hosts 文件中:

[${WPCS_IP}]:WPCS_PT

这意味着要使 if 语句起作用,它需要如下所示:

if ! ssh-keygen -F "[${wPCS_IP}]:${WPCS_PT}" -f ~/.ssh/known_hosts > /dev/null 2>&1; then ssh-keyscan -p ${wPCS_PT} ${wPCS-IP} >> ~/.ssh/known_hosts; fi

感谢 alvits 让我朝着正确的方向前进...

更新:事实证明 Ubuntu 16.04 加密了远程主机的 IP 地址(但不加密端口)。我仍在尝试弄清楚如何适应这种差异。

另一个更新:事实证明 -H 选项是失败的。一旦你散列了密钥,它就再也找不到了。这适用于 Ubuntu 14.04:

if ! ssh-keygen -F ${IP_ADDR} -f ~/.ssh/known_hosts > /dev/null 2>&1; then ssh-keyscan -p ${PORT} ${IP_ADDR} >> ~/.ssh/known_hosts; fi
# IP_ADDR SSH-2.0-OpenSSH_7.2p2 Ubuntu-4ubuntu2.1
# IP_ADDR SSH-2.0-OpenSSH_7.2p2 Ubuntu-4ubuntu2.1
if ! ssh-keygen -F ${IP_ADDR} -f ~/.ssh/known_hosts > /dev/null 2>&1; then ssh-keyscan -p ${PORT} ${IP_ADDR} >> ~/.ssh/known_hosts; fi

可以看到第一个if语句生成keyscan数据,第二个没有,因为keyscan数据是正确的,但是如果加上-H,keygen不会检测到hashed key entry...

但是,要让类似的命令在 Ubuntu 16.04 上运行,必须更改 if:

if ! ssh-keygen -F [${IP_ADDR}]:${PORT} -f ~/.ssh/known_hosts > /dev/null 2>&1; then ssh-keyscan -p ${PORT} ${IP_ADDR} >> ~/.ssh/known_hosts; fi
# IP_ADDR:PORT SSH-2.0-OpenSSH_6.6.1p1 Ubuntu-2ubuntu2.8
# IP_ADDR:PORT SSH-2.0-OpenSSH_6.6.1p1 Ubuntu-2ubuntu2.8
# IP_ADDR:PORT SSH-2.0-OpenSSH_6.6.1p1 Ubuntu-2ubuntu2.8
if ! ssh-keygen -F [${IP_ADDR}]:${PORT} -f ~/.ssh/known_hosts > /dev/null 2>&1; then ssh-keyscan -p ${PORT} ${IP_ADDR} >> ~/.ssh/known_hosts; fi

在这种情况下 known_hosts 文件必须包含端口...

-H 也在这里。如果使用 -H 生成,if 将找不到密钥。

令人沮丧的是,行为因版本而异,最安全的哈希版本不起作用。

另一个编辑:当远程服务器在 sshd_config 中使用非标准端口时,可能是在 known_hosts 中指定了端口。这可能是预期的行为。

【讨论】:

    【解决方案2】:

    我向 open-ssh 列表发送了一封电子邮件,并提出了一些很好的建议。基本上,依赖 ssh-keygen -F 和 ssh-keyscan -H 并不好,因为文件格式和位置往往因系统而异。

    我今天将实施的真正解决方案是为每台服务器生成证书,以便它们相互识别。这对我来说很有效,因为我可以完全控制两台服务器。

    我收到了一个链接,说明如何设置服务器证书:

    https://blog.habets.se/2011/07/OpenSSH-certificates.html

    这是一个专门针对 Ubuntu 的链接。 https://www.digitalocean.com/community/tutorials/how-to-create-an-ssh-ca-to-validate-hosts-and-clients-with-ubuntu

    如果这是我的最后一次更新,假设这对我有用。

    【讨论】:

      猜你喜欢
      • 2020-11-10
      • 2020-08-06
      • 1970-01-01
      • 2021-09-10
      • 1970-01-01
      • 2018-09-08
      • 2014-10-22
      • 2019-01-10
      • 1970-01-01
      相关资源
      最近更新 更多