密钥与远程¶
Warning
该文章仍未经过正式校正
Note
本文作者:username
在初阶课程中,我们已经知道了密钥是什么东西,并且知道了在大多数的情况下要使用密钥而不是密码来进行身份验证。但是关于“怎么使用和管理”密钥,则没有进行详细介绍。在本节中,我将会详细地介绍密钥的使用和管理。
密钥是一种加密技术,用于保护数据的安全性和完整性。密钥的设计通常基于非常困难的数学问题,例如大数分解、椭圆曲线等。密钥通常分为两种类型:对称密钥和非对称密钥。对称密钥使用相同的密钥进行加密和解密,可以理解为家里的每一个人都使用同一把钥匙来开门,如果钥匙丢了(密钥泄漏)则加密的数据就不再安全。非对称密钥使用一对密钥进行加密和解密,通常称为公钥和私钥,可以理解为旧式邮箱,所有人都可以往信箱里投信(公钥),但是只有邮递员(私钥)可以打开信箱取信。非对称密钥的安全性更高,因为即使公钥泄漏,私钥依然是安全的。
现代加密技术往往使用混合加密方式,即使用非对称密钥来交换对称密钥,然后使用对称密钥来加密数据。这样可以兼顾安全性和效率。
对于个人而言,最常用的加密方式是以SSH为代表的非对称密钥加密方式。SSH(Secure Shell)是一种网络协议,用于在不安全的网络上进行安全的远程登录和其他网络服务。SSH 使用非对称密钥加密技术来保护数据的安全性和完整性。
SSH密钥的生成¶
在Windows上,我们需要安装系统功能OpenSSH Client来进行密钥的初步使用。在Linux和Mac上,OpenSSH通常是预装的。如果没有安装,请自行查找相关资料进行安装。
在安装完成后,我们可以使用以下命令来生成密钥对:
ssh-keygen -t rsa -b 4096 -C "<你的邮箱地址>"
上述命令会生成一个 RSA 密钥对,密钥长度为 4096 位,并且会在密钥中添加一个注释(通常是你的邮箱地址)。执行该命令后,会提示你输入密钥的保存路径和密码。默认情况下,密钥对会保存在 ~/.ssh/id_rsa
和 ~/.ssh/id_rsa.pub
中。
RSA密钥对是最常用的密钥对之一,不过因为 RSA 密钥对的安全性已经不如以前了,因此现在推荐使用 Ed25519 密钥对。可以使用以下命令生成 Ed25519 密钥对:
ssh-keygen -t ed25519 -C "<你的邮箱地址>"
生成密钥对后,我们需要将公钥(id_rsa.pub
或 id_ed25519.pub
)添加到远程服务器或服务(例如 GitHub、GitLab、CLab 等)的 SSH 密钥列表中。我们可以使用任何喜欢的编辑器打开上述公钥文件,复制其中的内容,并将其粘贴到指定的位置。同时,私钥(id_rsa
或 id_ed25519
)必须保密,绝对不能泄露给任何人!
如果我们本地是Linux或者Mac且能够直接访问远程服务器,可以使用以下命令将公钥复制到远程服务器上:
ssh-copy-id user@remote-server
我们也可以手动将公钥复制到远程服务器的 ~/.ssh/authorized_keys
文件中。我们可以使用记事本或者code等编辑器打开公钥文件,复制其中的内容,然后在远程服务器上使用以下命令将其添加到 ~/.ssh/authorized_keys
文件中。以上方法适用于无法使用 ssh-copy-id 命令的情况,例如Windows系统。
为了保护私钥的安全,我们可以为私钥设置一个密码。这样,在使用私钥进行身份验证时,需要输入密码才能解锁私钥。可以在生成密钥对时设置密码,也可以在后续使用 ssh-keygen
命令修改密码。
设置密码的方式非常简单。在生成密钥对时,系统会提示你输入密码。如果你不想设置密码,可以直接按 Enter 键跳过。
如果你已经生成了密钥对,但没有设置密码,可以使用以下命令为私钥设置密码:
ssh-keygen -p -f ~/.ssh/id_rsa
实际上如果保密需求不是非常高的话,我们可以不设置密码。因为使用密钥除了安全性以外,最大的好处是可以免去每次连接远程服务器时输入密码的麻烦。而如果设置了密码,则每次连接远程服务器时都需要输入密码,这样就失去了使用密钥的便利性。
密钥的使用¶
在生成密钥对并将公钥添加到远程服务器或服务后,我们就可以使用密钥进行身份验证了。使用密钥进行身份验证的方式与使用密码类似,只不过需要指定私钥文件。
连接到远程服务器¶
可以使用以下命令连接到远程服务器:
ssh -i ~/.ssh/id_rsa user@remote-server
id_rsa
替换为 id_ed25519
。
如果你已经将私钥添加到 SSH Agent(实际上这确实是更一般的情况)中,可以直接使用以下命令连接到远程服务器:
ssh user@remote-server
Git托管¶
GitHub的有两种托管代码的方式:HTTPS 和 SSH。HTTPS 是通过用户名和密码进行身份验证,而 SSH 是通过密钥进行身份验证。我们建议使用 SSH 进行身份验证,因为它更加安全和方便,且无需忍受网络代理的折磨。
我们需要将公钥添加到 GitHub 的 SSH 密钥列表中。可以在 GitHub 的设置页面中找到 SSH 密钥列表,然后点击“添加 SSH 密钥”按钮,将公钥粘贴到文本框中。
如果你使用的是 Windows 系统,可能需要将公钥转换为 OpenSSH 格式。可以使用以下命令将公钥转换为 OpenSSH 格式:
ssh-keygen -i -f ~/.ssh/id_rsa.pub
添加公钥后,我们就可以使用 SSH 进行身份验证了。在某些情况下,我们可能需要手动指定使用的哪一个密钥文件。可以使用以下命令将 SSH 密钥添加到 SSH Agent 中:
ssh-add ~/.ssh/id_rsa
这样可以免去每次连接远程服务器时指定密钥文件的麻烦。
使用VS Code建立SSH连接¶
除了使用终端建立SSH连接到远程服务器以外,还可以使用一些其他的工具来建立SSH连接。这时候我们还要请出那位大神:VS Code(怎么哪都有你)。
VS Code 提供了一个名为 Remote-SSH 的扩展,可以帮助我们通过 SSH 连接到远程服务器,并在远程服务器上进行开发。这样,可以在SSH连接中使用一个很方便的图形化界面,以进行和Windows相似的便捷操作。
安装 Remote-SSH 扩展后,我们可以在 VS Code 的界面找到远程连接的选项,一般是左下角的蓝色按钮,图标类似这个<>
数学符号。点击这个按钮后,会弹出一个菜单,点选“连接到主机”选项,会让你输入user@host
类似的远程服务器地址。输入完成后,如果是一个新的远程服务器,Code会让你把它加入到已知主机列表中,用户可以视情况添加到系统配置文件或者其他的配置文件中。
然后,Code会弹出一个新的窗口,试图连接到远程服务器,可能会要求你输入远程服务器的密码和系统类型等信息。连接完成后,就可以在远程服务器上进行开发了。此时,Code会在左侧的资源管理器中显示远程服务器的文件系统(当然你需要打开一个文件夹)。
在Code中,如果不是用终端而是用Code的图形界面来打开新的文件夹,那么每一次打开文件夹都会重新进行一次身份验证。如果你使用的是密码,则需要反复输入,非常麻烦。这时我们一定要尽可能地使用密钥进行登录。