![将 ssh 密钥从一台服务器复制到另一台服务器](https://linux22.com/image/1346330/%E5%B0%86%20ssh%20%E5%AF%86%E9%92%A5%E4%BB%8E%E4%B8%80%E5%8F%B0%E6%9C%8D%E5%8A%A1%E5%99%A8%E5%A4%8D%E5%88%B6%E5%88%B0%E5%8F%A6%E4%B8%80%E5%8F%B0%E6%9C%8D%E5%8A%A1%E5%99%A8.png)
我有一台服务器(假设它的 IP 是 abcd),允许用户通过 ssh 登录。现在我想更换物理机,保持 IP 不变。这样新机器仍然可以被用户访问,就像这样
$ssh abcd
问题是,每次用户尝试登录时,都会收到以下 ssh-key 不匹配错误。
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ 警告:远程主机标识已更改!@ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 可能有人正在做一些恶意的事情! 现在可能有人正在窃听您(中间人攻击)! RSA 主机密钥也可能刚刚被更改。 远程主机发送的 RSA 密钥的指纹是 02:dc:c6:18:1b:34:b7:1d:fa:90:ab:e1:95:48:69:84。 请联系您的系统管理员。 在 /home/user/.ssh/known_hosts 中添加正确的主机密钥以摆脱此消息。 /home/user/.ssh/known_hosts:37 中的违规密钥 校友的 RSA 主机密钥已更改,您已请求严格检查。 主机密钥验证失败。
我知道用户可以从文件 ~/.ssh/known_hosts 中删除第 37 行,下次她会收到是/否提示。我想要的是让用户不知道整个机器替换过程,而只需收到输入密码的提示。
怎么做?
答案1
作为埃莎贝尔如上所述,您可以将当前主机密钥复制到新服务器。
您可以通过打开文件找到主机密钥sshd_config
(在我的 Ubuntu 12.04 机器上是/etc/ssh/sshd_config
)。在配置文件中查找HostKey
条目。这些条目将告诉您主机密钥文件的位置。您应该能够将这些文件复制到新服务器并更新新服务器sshd_config
以指向复制的密钥(或仅覆盖新服务器上已存在的文件)。
另外,请注意sshd_config
手册页中的这一部分,特别是有关权限的部分:
指定包含 SSH 使用的私有主机密钥的文件。
/etc/ssh/ssh_host_key
对于协议版本 1, 默认值为/etc/ssh/ssh_host_dsa_key
,/etc/ssh/ssh_host_ecdsa_key
对于/etc/ssh/ssh_host_rsa_key
协议版本 2,默认值为 。请注意,如果文件是组/全局可访问的,sshd(8) 将拒绝使用该文件。可以有多个主机密钥文件。“rsa1”密钥用于 SSH 协议的版本 1,“dsa”、“ecdsa”或“rsa”用于 SSH 协议的版本 2。
答案2
如果您有原始主机密钥,您可以恢复它,这将停止错误。
或者,您可以在 sshd 配置文件中关闭 StrictHostKeyChecking。
...然而,这样做是一个非常非常糟糕的想法。
如果有一种方法可以让你只ssh-keygen -R server.example.com
在客户端机器上运行,那将是最好的方法——因为关闭主机密钥检查就像说,“嘿。攻击我。”当事情发生变化时,我想要模糊性,但安全性应该是第一要务,而不是模糊变化。
答案3
你可以这样尝试
cat ~/.ssh/id_rsa.pub | ssh <user>@<hostname> 'cat >> .ssh/authorized_keys && echo "Key copied"'
请注意,如果文件夹 .ssh 尚不存在,则上述命令将失败。此外,在创建文件时设置最小权限(基本上只有所有者可以读写)可能会更好。以下是更高级的命令:
cat ~/.ssh/id_rsa.pub | ssh <user>@<hostname> 'umask 0077; mkdir -p .ssh; cat >> .ssh/authorized_keys && echo "Key copied"'
要进一步了解此问题,请访问此网站:SSH 主机密钥更改错误