使用证书代替密码登录 SSH 应该已经是家常便饭,是最基本的安全保护措施之一。这里简单记录一下,主要是为了实现 VS Code 的 Remote-SSH 可以免密码打开远程代码。

创建证书

证书无所谓在哪里哪里,客户端 服务端 第三者 都可以,重点是要有 ssh-keygen

  1. 首先执行 ssh-keygen 开始生成证书;
  2. 提示 Enter file in which to save the key: 输入证书的保存文件名;
  3. 提示 Enter passphrase (empty for no passphrase): 输入证书密码;
  4. 提示 Enter same passphrase again: 同上;

这里的密码不是 SSH 的密码,而是每次使用证书时需要输入的密码。可以直接回车生成无密码证书,但有些安全性要求较高的平台是不接受无密码的证书的(好像 GitHub 就不接受)。

完成后会发现有两个文件,例如 vscodevscode.pub,它们分别是证书的私钥 Private Key 和公钥 Public Key,区别和作用这里就不废话了,网上很多。

服务器添加证书

有了证书,我们需要把 Public Key 添加到登录的目标服务器的 ~/.ssh/authorized_keys 中,服务器才知道我们要凭这对证书进行登录。

  1. 先确定有没有 .ssh 目录,如果没有就先 mkdir ~/.ssh 创建;
  2. 执行 cat vscode.pub >> ~/.ssh/authorized_keys 添加证书,注意是带 .pub 的文件;
  3. 执行 chmod 700 ~/.sshchmod 600 ~/.ssh/authorized_keys 修改权限;

PS. 修改权限并非必须,也不是每次都要做,但执行一下可以减少一些疑难杂症。

客户端使用证书登录

现在我们可以在客户端先用 ssh -i <private_key> <host> 试一下能否登录。如果没问题,则把 Private Key 也拷贝到客户端的 ~/.ssh 目录中;如果是 Windows 则拷贝到 %USERPROFILE%\.ssh 目录。

然后编辑 .ssh 目录中的 config 文件,如果没有则创建一个,按以下格式添加:

Host <主机名>
  HostName <主机的 IP 地址或域名>
  User <用户名>
  IdentityFile <私钥存的路径>

现在,无论是在 terminal 中使用 ssh <主机名> 登录服务器,还是在 VS Code 中打开远程代码,都不再需要输入密码咯,搬砖效率大大提升~