无论是登录远程主机修改一些配置文件,还是向 GitHub 代码库 push 代码,基本上都离不开 SSH 认证。如果你觉得每一次都输入密码比较麻烦,可以继续阅读此文,了解使用密钥对认证的配置方法。

  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 更好。
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密钥的方法 – 刘彪博客

标签: SSH, GitHub, Putty, git

添加新评论