这篇文章上次修改于 2142 天前,可能其部分内容已经发生变化,如有疑问可询问作者。

我们常使用一般密码方式登录 SSH 客户端来远程管理 Linux 服务器,但该方式存在易被密码暴破的风险。所以,我们会禁用 root 账户登录或将 SSH 的端口设置为默认 22 以外的端口。其实,可以使用密钥方式登录来保证安全,放心地用 root 账户进行远程登录管理。

密钥登录的原理:利用密钥生成器制作一对密钥——一只公钥和一只私钥。将公钥添加到服务器的某个账户,然后在客户端利用私钥即可完成认证并登录。如果将公钥复制到其他账户甚至主机,利用私钥也可以登录。

下面来讲解如何制作密钥对,将公钥添加给账户,设置 SSH,最后通过客户端登录。

1.制作密钥对

使用OpenSSH在Windows端创建密钥对,当然你也可以在服务器端使用 ssh-keygen 创建,方法大体相同。

获取[Win32-OpenSSH]并将其解压,在解压得到的文件夹中打开终端,然后执行以下命令:

PS D:\省略路径\OpenSSH-Win64> ssh-keygen -t rsa -b 4096 <== 建立密钥对 [-b 参数为rsa秘钥对的长度bit]
Generating public/private rsa key pair.
Enter file in which to save the key (C:\Users\用户名/.ssh/id_rsa): <== 按 Enter
Enter passphrase (empty for no passphrase): <== 输入密钥锁码,或直接按 Enter 留空
Enter same passphrase again: <== 再输入一遍密钥锁码
Your identification has been saved in C:\Users\用户名/.ssh/id_rsa. <== 私钥
Your public key has been saved in C:\Users\用户名/.ssh/id_rsa.pub. <== 公钥
The key fingerprint is:
SHA256:hZqJr5VKd8Wz48Cxxxxxx/n2sRCY8BMOfqR0lxxxxxx 用户名@设备名
The key's randomart image is:
+---[RSA 4096]----+
|       . .o+o    |
|        E. . .   |
|       o= = o    |
|     . *.@ =     |
|    . + S @ .    |
|     + o + = .   |
|    o B = * . .  |
|   . B + + o.. o |
|    =oo   ....o  |
+----[SHA256]-----+

密钥锁码会在使用私钥时要求输入,保护私钥不被盗用。当然,也可以留空,实现无密码登录。
在 C:\Users\用户名.ssh\ 中已经生成了两个密钥文件。id_rsa 为私钥,id_rsa.pub 为公钥。

2.在服务器上配置公钥

在需要配置的用户目录中建立 .ssh 的隐藏目录,上传公钥到服务并 cat 到对应 .ssh 目录中的 authorized_keys 文件内。

上传公钥到用户目录后,键入以下命令:

[root@host ~]$ cd .ssh
[root@host .ssh]$ cat ../id_rsa.pub >> authorized_keys

为了确保连接成功,请保证以下文件权限正确:

[root@host .ssh]$ chmod 600 authorized_keys
[root@host .ssh]$ chmod 700 ~/.ssh

3.修改 SSH 配置文件,打开密钥登录功能

编辑 /etc/ssh/sshd_config 文件,修改如下项:

PubkeyAuthentication yes
RSAAuthentication yes 
#该项可能已被启用,若不存在则忽略就好

设置完成后重启 SSH 服务:

[root@host .ssh]$ service sshd restart

4.SSH客户端使用私钥登录

这里使用刚才的 OpenSSH 进行登录,在 OpenSSH 打开终端,键入以下命令:

ssh -i {parivate-rsa-path} {username}@{host} -p {port}

{}部分请自行替换,然后即可登录,过程中可能需输入密钥锁码。

如需在成功连接后关闭一般密码方式登录,可以编辑 /etc/ssh/sshd_config 文件,修改如下项:

PasswordAuthentication no

完成后再次重启 SSH 服务即可。

注:

[Win32-OpenSSH]:https://github.com/PowerShell/Win32-OpenSSH/releases

其实这次折腾也是为了配置 VSCode:Remote-SSH 进行开发做准备QwQ