重新生成SSH服务器端密钥方法

09/20/2015

理论上来说,每次安装服务器时SSH密钥(SSH Host Key)都是自动生成的,而生成出相同密钥的概率接近于0,这样避免了中间攻击等情况。但是,就是存在以下情况使得两台SSH密钥相同:

  • 在虚拟化技术中克隆了一台虚拟机;
  • 将原来的虚拟硬盘复制后新建虚拟机运行。

当然还有其他更加坑爹的情况,比如Kaijia碰到的VPS云服务器重装系统复制完模板数据后不重新生成SSH密钥的(某国内主流云提供商……),于是整个云平台所有的VPS都跑着相同的SSH密钥,如果要实现中间攻击只需要新建一台云就能获得私钥了。正是因为碰到了这种云主机,Kaijia研究了一下如何重新生成SSH服务器端密钥。

重设SSH密钥方法比较简单,首先第一步是要删除现有的密钥,在/etc/ssh/目录中存放了所有以ssh_host_开头的私钥和公钥文件,运行以下命令删除这些密钥:

接下来便是重新生成密钥,在Debian/Ubuntu系统中,可以使用dpkg命令重新配置SSH服务器包实现密钥的生成:

生成之后需要重启SSH服务使新的密钥生效:

而在CentOS系统中,这个操作则变得更加简单,只需要重启SSH服务,SSH服务便会在启动载入密钥时自动生成新的密钥:

在重启系统等情况下,只要发现密钥不存在,CentOS系统都可以自动生成密钥。

在CentOS系统中重置SSH密钥

在CentOS系统中重置SSH密钥

另外,值得提醒的是,更新后的SSH公钥和你的电脑中记录的公钥不同,因此在下一次登录SSH时,肯定会收到一下警告:

此时,只需要按照提示执行其中的ssh-keygen命令即可取消对原先密钥的信任,然后再次连接SSH便会提示有新密钥了。当然,虽然不推荐,简单粗暴地直接删除known_hosts文件:

也是可以的。