已知主机中的ssh密钥,但keygen -F无法正常工作

时间:2017-01-28 01:35:35

标签: openssh ssh-keygen

我在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中找到密钥,即使它们刚刚被添加。这是一个更大的问题。

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

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

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

2 个答案:

答案 0 :(得分:1)

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

[${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

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

更新:事实证明,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不会检测哈希的键条目......

但是,要获得类似的命令在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也在这里。 if if如果用-H生成密钥,则找不到密钥。

令人沮丧的是,行为因版本而异,并且最安全的散列版本无法正常工作。

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

答案 1 :(得分:1)

我发了一封电子邮件到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

如果这是我的上次更新,请假设这对我有用。