今天我突然发现服务器自带的密钥无法登陆,并且从服务器提供商 DMIT 的官网上也无法重新下载密钥。好在 DMIT 的帮助文档中有本地生成 SSH 密钥并上传至服务器的教程,在本文中我就以 MacOS 为例详细说明如何清除旧的 SSH 登陆记录,并使用自己生成的 SSH 密钥登陆服务器后台。因为操作基本在命令行中进行,使用 Windows 或 Linux 系统的操作也应该是一样的。
本文是对关于建站的文章「零基础『快速』搭建个人博客?不存在的...…」的补充。如果你没有使用 SSH 密钥登陆服务器的需求,就不用看下面的内容了。
生成 SSH 密钥
SSH 密钥由公钥和私钥两部分组成。公钥就好比挂在门口的锁,不具有保密性,每个路过大门的人都能看到。而私钥就像是钥匙,是开门的唯一方式。当公钥绑定服务器之后,必须使用私钥才能访问它。当然这需要服务器支持 SSH 密钥登陆才可以。
生成密钥的操作需要在命令行工具中进行,比如 MacOS 和 Linux 系统里的终端,和 Windows 系统的 PowerShell。接下来我以 MacOS 为例进行说明。
在终端中输入 ssh-keygen
指令即可开始生成 SSH 密钥:
ssh-keygen -t rsa
这里的 rsa 是我选择的加密算法。用 rsa 就可以。这个指令还有一些其他的配置项,可以更改密钥长度,增加注释等,但这些都不是必要的。如果你想了解的话可以参考这篇文章:传送门。
指令运行后,终端中会出现如下提示:
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/yourname/.ssh/id_rsa):
第一行提示的意思是要开始生成使用 rsa 加密的公钥和私钥了。第二行是让你输入密钥的存储位置。括号里的是默认的存储位置,如果不想改就直接按回车进入下一步输入二级密码:
Enter passphrase (empty for no passphrase):
直接回车跳过就是不设置二级密码,只用私钥就能登陆服务器;在这里输入密码并回车就能设置二级密码,这样只使用私钥是无法登陆服务器的,还需要再输入这个二级密码才可以。如何设置取决于你自己的工作环境,如果觉得私钥被盗取的风险比较高,就可以设置二级密码。接下来屏幕上会出现:
Enter same passphrase again:
重新输入刚才的密码并回车就可以。如果上一步没设置密码就直接回车跳过。这样 SSH 密钥就生成完成,屏幕中会出现提示:
Your identification has been saved in /Users/yourname/.ssh/id_rsa
Your public key has been saved in /Users/yourname/.ssh/id_rsa.pub
The key fingerprint is:
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
The key's randomart image is:
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
接下来打开访达,进入 /Users/yourname/.ssh/
就能看到公钥文件 id_rsa.pub
和私钥文件 id_rsa
。如果你看不到 .ssh
文件夹,是因为这是个隐藏文件夹。按快捷键 ⌘ + Shift + .
就能显示出来了。
上传 SSH 公钥至服务器
先打开公钥文件 id_rsa.pub
,复制里面的内容。再进入服务器运营商的网站,找到新增 SSH Key 的地方,把公钥粘贴到这里并添加。

添加之后还需要和服务器绑定,往往还需要重启一次服务器才能生效。因为每个服务器提供商的界面都不一样,按照系统提示操作就可以。
清除本地的旧密钥信息
由于我先前使用的是服务器自带的 SSH 密钥,直接用新的私钥登陆服务器会出现如下报错:
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.
The fingerprint for the xxxxxxxx key sent by the remote host is
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.
Please contact your system administrator.
Add correct host key in /Users/yourname/.ssh/known_hosts to get rid of this message.
Offending ECDSA key in /Users/yourname/.ssh/known_hosts:3
Host key for 11.11.111.11 has changed and you have requested strict checking.
Host key verification failed.
这里可以看出问题所在,也就是
这个本地文件中保存了服务器主机的旧公钥信息,我们用新的私钥自然是打不开这把旧锁的。所以就需要先清除老的公钥信息:known_hosts
ssh-keygen -R 11.11.111.11
指令还是 ssh-keygen
,但是参数项使用的是 -R
,功能即把指定的服务器公钥消息移出
文件。后面的 known_hosts
11.11.111.11
就是目标服务器的 IP 地址。之后终端中显示如下信息就说明成功了:
# Host 11.11.111.11 found: line 1
# Host 11.11.111.11 found: line 2
# Host 11.11.111.11 found: line 3
/Users/yourname/.ssh/known_hosts updated.
Original contents retained as /Users/yourname/.ssh/known_hosts.old
接下来我们就可以使用新的私钥登陆服务器了。输入:
ssh -i //Users/yourname/.ssh/id_rsa root@11.11.111.11
其中 //Users/yourname/.ssh/id_rsa
用于选择私钥保存的路径和私钥文件。如果你觉得默认的位置不方便,可以把私钥剪切到其他文件,这里的路径也要做相应的修改。
然后就会出现成功登陆服务器的提示。不同的服务器提供商的界面会有所不同,但通常会出现 Welcome to xxxx
,或者 Last login: Date Time xxxx
等字样。如果有遇到疑难杂症,可以在评论区留言。
文章评论