用身边的一台电脑连接到千里之外的一台主机上进行操作,追溯历史可以到计算机的圆谷十七了。虽然操作方式是简单的,甚至可以说是有点儿深不可测的命令行,但不得不说,在今天操作远程主机依然是主要采用的方法。无论是登录到服务器上还是向 GitHub 的代码库 push 代码,基本上都离不开 SSH(security shell) 这个协议。

  SSH 好比一根 “水管”, 担负起 数据的 “水流” 的通道。 那么,这跟 “水管” 的安全性就不言而喻了。 一般来说, 我们可能会使用密码 (password) 来验证自己的身份,接着就可以进入远程主机的命令行了。 相比密码来说,使用一对密钥(公钥 + 私钥)进行身份验证,既安全又省心。具体密钥的验证方法不在我们本文讨论之列。

  公钥可以放置到被登录的一方上,私钥可以放到本地,但需要得到妥善保护,就相当于你的密码一样。

开始之前

  如果你使用的是 Windows 10 操作系统,并且你的版本号大于等于 1803 的话,可以直接在 Cmd 下使用 OpenSSH 客户端套件中的各类工具。 除了 OpenSSH 套件, 在 Windows 上也可以采用 Putty 作为你的 SSH 客户端。 Putty 的使用方法可以自行研究。

  对于 Linux 等 类 Unix 操作系统的人,  可以直接使用 OpenSSH 客户端套件工具。

  本文已 Windows 10 使用自带 OpenSSH 套件作为客户端,已 Gnu/Debian 9 操作系统的服务器作为被连接的对象,还会连接到 GitHub 上 clone 一份代码。

密钥的生成

  生成一对密钥很简单,只要用 "ssh-keygen" 命令就可以了。不键入参数会使用 RSA 2048位 作为密钥验证方式。也可参考下面的参数,生成一个加密强度更大的密钥。

  可以使用 "-t" 来自定义密钥的算法,使用 "-b" 指定密钥的位数。

  下面的表格简略介绍了这些算法以及可以使用的位数。

名称可用的位数简略介绍
rsa2048(至少)、4096(推荐)一种基于难分解大树的老旧算法。 推荐使用至少 2048 位的长度, 4096 更好。 在因数分解方面的进展, 促使 RSA 算法在变若, 所以你应该选择适当的算法保护不被破解。 在可以看到的将来, rsa 算法会变得很脆弱。
dsa1024一种古老的美国政府签名算法。 基于离散对数计算的困难设计的。 通常使用 1024 位的大小。 dsa 的原始形式的算法已经不再推荐。
ecdsa256、384、521(推荐)一种由美国政府标准话的新算法。 基于椭圆曲线的计算。 对于当前的应用程序来说,这可能是一个不错的算法。 推荐使用 521 位的长度, 虽然长度比较短,但能带来不亚于 rsa 算法的安全性。 大多数 SSH 工具可以支持该算法。
ed25519----这是 OpenSSH 中添加的新算法, 不同的客户端支持情况不同,所以不应该在通用的领域中采用此算法。

  创建密钥一般还可以用到下面的参数:

  •   -f [filename]    指定密钥文件输出文件名,如果不使用该参数,在创建时会让你键入一个文件名。
  •   -C [Comment]    密钥文件的注释信息,会写入到你的公钥文件中
  •   --h    获取所有的可用参数

  这里我用 “ssh-keygen -C "Comment"” 做例子。按下 Enter 之后会让你填写密钥文件放置的位置和保护私钥的密码,这里我就直接 Enter 默认下去走了。 如果你的私钥保存的电脑不太安全的话,可以设置密码来多上一把锁。生成完毕之后会告诉你诸如指纹、密钥算法等信息,并且会生成以下两个文件,已默认情况来说会放到你用户文件夹下面的 ".ssh" 文件夹下:

.   id_rsa    你的私钥文件,必须妥善保管。需要妥善保管。需要妥善保管。重要的事情往往要多说几遍。

.   id_rsa.pub    公钥文件,需要放到被连接的一方那儿。

让 Debian 认识“我”

  怎么让被连接的一方 “认识” 我们呢?就需要把我们的 公钥 告诉我们的服务器了。类比以一下的话, ssh 中私钥的作用是要是,公钥的作用就是锁了。

  这一步可以使用 “ssh-copy-id” 命令。格式是这样的: “ssh-copy-id -i [identity_file user@hosts]”, “identity_file” 是你的密钥的文件名。可以使用 “-p [port]” 指定端口号。

  也可以使用 scp 命令丢到服务器上面去。像这样: “scp .ssh/id_rsa.pub username@hosts:” 可以使用 “-P [port]” 指定端口号。

  接着使用 ssh 连接到你的主机,像这样 : “ssh username@hosts”, 可以使用 “-p [port]” 指定端口号。 然后使用下面的命令把你的公钥合并到允许访问的列表中去: “cat id_rsa.pub >> ~/ssh/authorized_keys

  最后,,退出你的 ssh,然后尝试重新登录,没有问题的话就可以使用你的私钥验证你的身份了。

与 Github 挥手

  要想与 GitHub 挥手也需要你把 “锁” 放到 Github那边去。

  登录你的 GitHub 账户,然后点击你的头像(View profile and more), 接着点击 “Settings -> SSH and GPG keys”;

  在管理 keys 的页面点击 “New SSH key” 进入添加新公钥界面,填写标题(title) 和你的公钥文件的内容(key)然后点击 “Add SSH key” 按钮,接着可能需要验证你的密码等,完成之后你就可以使用 ssh 协议 clone 你的仓库了。

  使用 “git clone git@github.com:username/repository.git” 就可以把你的远程仓库 clone 到本地了。

多个远程主机的配置

  配置了公钥之后, ssh 在连接主机的时候会尝试使用你的用户文件夹下的 “.ssh/id_rsa” 这样的文件验证身份。那么问题就来了:

  我有多个主机需要连接怎么办? 我既需要连接我的服务器,也需要到 Github Clone 代码,我应该怎么办呢?并且我还希望用不同的密钥对。

  你可以在你的用户文件夹下的 “.ssh” 文件夹下创建一个 “config” 的纯文本文件,并且按照下面的格式填写你的信息并且保存:

Host github.com
User git
IdentityFile ~/.ssh/github_id_rsa

Host www.domain.com
User username
IdentityFile ~/.ssh/server_id_rsa

  就是这样子。快去试一下吧。

  P.S., 无论 Windows 还是 Linux 都可以使用 “~” 代指用户文件夹的路径。

参考资料

  How to use ssh-keygen to generate a new SSH key | SSH.COM

  配置SSH使用多个id_rsa密钥的方法 – 刘彪博客

标签: Linux, SSH, GitHub, Putty, git

添加新评论