SSH 密钥创建大法

无论是实现 SSH 免密登录,还是想要 SCP 免密发送文件,还是 Git 免密提交代码,都需要用到 SSH 密钥。本文简单介绍 SSH 密钥的生成方法。

科普几个基本概念

密钥

在密码学中, 密钥 1 Key 是指某个用来完成加密、解密、完整性验证等密码学应用的秘密信息。在 对称密钥算法 Symmetric-key algorithm 中,加密和解密用的是同一个钥匙,因此钥匙需要保密。而在 公开密钥密码学 Public-key cryptography 中,加密和解密用的钥匙不同,一个是公开密钥,称为 公钥 Public key ,另一个是私有密钥,称为 私钥 Private key

对称密钥算法

对称密钥算法 Symmetric-key algorithm 又称为对称加密、私钥加密、共享密钥加密,是密码学中的一类加密算法。这类算法在加密和解密时使用相同的密钥,或是使用两个可以简单地相互推算的密钥。

公开密钥密码学

公开密钥密码学 Public-key cryptography ,也称 非对称式密码学 Asymmetric cryptography ,是密码学的一种算法,它需要两个密钥,一个是公开密钥,称为 公钥 Public key ,另一个是私有密钥,称为 私钥 Private key 。公钥用作加密,私钥则用作解密。使用公钥把明文加密后所得的密文,只能用相对应的私钥才能解密并得到原本的明文,最初用来加密的公钥不能用作解密。由于加密和解密需要两个不同的密钥,故被称为非对称加密;不同于加密和解密都使用同一个密钥的对称加密。公钥可以公开,可任意向外发布;私钥不可以公开,必须由用户自行严格秘密保管,绝不透过任何途径向任何人提供,也不会透露给被信任的要通信的另一方。

公钥

公钥 Public key私钥 Private key 是通过 公开密钥密码学 Public-key cryptography 的某种算法得到的、相互对应形成一对密钥对。其中可以向外界公开的,称为公钥;另个自己妥善保管,万万不可随意共享、传输给他人,称为私钥。通过这种算法得到的密钥对能保证在世界范围内是唯一的。使用这对密钥对的时候,使用公钥来对数据进行加密,使用私钥来对数据进行解密。

私钥

私钥 Private key 详见上述 公钥 Public key 的描述。

1

「密钥」中的「钥」为多音字。其在文言文中有文白异读的现象。1985年12月,中华人民共和国国家语委、国家教委和广播电视部联合发布的《普通话异读词审音表》将其标注为 yào(语)和 yuè(文)两种读音。《现代汉语词典(第7版)》中将其注明为「【密钥】mìyuè(口语中多读 mìyào)」。

警告

同学们一定要保护好自己的密钥文件,尤其是私钥文件,不要轻易分享给他人!

当本文使用「密钥」这个词时,指的是一对公钥和私钥相互对应形成的「密钥对」,如果使用「公钥」、「私钥」这样的词,则特指「公钥」、「私钥」。

ssh-keygen 简介

ssh-keygen 命令用于生成、管理和转换 SSH 所支持的认证密钥,它支持 RSADSA 两种认证密钥。

语法格式

ssh-keygen [参数]

常用参数

参数

含义

-b

指定密钥长度

-e

读取openssh的私钥或者公钥文件

-f

指定用来保存密钥的文件名

-t

指定要创建的密钥类型

-C

添加注释

生成 SSH 密钥

打开 终端 Terminal ,首先确认当前用户的 home 目录下有没有一个叫 .ssh 的目录, 不存在的话请先创建,并赋予 700 的权限。

cd ~
mkdir -p ~/.ssh
chmod 700 ~/.ssh

直接使用 ssh-keygen 命令,不带任何参数,生成一对默认的公钥和私钥。

ssh-keygen

由于我们没有使用 -f 参数指定路径和文件名,程序会有如下提示。

Generating public/private rsa key pair.
Enter file in which to save the key (/Users/tony/.ssh/id_rsa):

直接敲回车,使用默认路径和文件名。 程序又会有如下提示,询问是否为密钥文件设置密码。

Enter passphrase (empty for no passphrase):
Enter same passphrase again:

我们为了免密使用密钥,对于这两条提示都直接敲空格。如果有特殊的用途需要设置密码,那么请一定要将密码妥善保管。

警告

若没有为密钥设置密码(密码为空,直接两次敲了空格),请一定要保护好自己的私钥文件,不要轻易分享给他人!

小技巧

若要为密钥设置密码,强烈建议使用密码生成器自动生成强密码,并使用密码管理工具,例如 Apple 平台的「钥匙串」。

设置密码后,程序会提示如下,表明公钥和私钥文件已经创建完成。

Your identification has been saved in /Users/tony/.ssh/id_rsa.
Your public key has been saved in /Users/tony/.ssh/id_rsa.pub.
The key fingerprint is:
...(此处省略内容视实际情况)

id_rsa 文件即是密钥文件, id_rsa.pub 即是公钥文件。

从这个示例来看,不带任何参数的情况下, ssh-keygen 会默认生成一对 RSA 类型的公钥和私钥。

当然,你还可以使用 -t 参数手动指定生成 RSA 类型的公钥和私钥。

ssh-keygen -t rsa

其他示例

使用 -t 参数手动指定生成 RSA 类型的公钥和私钥,并使用 -C 参数添加注释,例如邮箱地址:

ssh-keygen -t rsa -C "your_email_address@example.com"

使用 -e 参数读取 openssh 的私钥或者公钥文件:

ssh-keygen -e