Contents

在Linux中生成SSH密钥

1.概述

在本教程中,我们将介绍 SSH 密钥的基础知识以及如何在 Linux 中生成 SSH 密钥对。

2. 安全外壳 (SSH)

Secure Shell (SSH) 是一种安全的远程登录协议,它利用公钥密码术来加密客户端和服务器之间的通信。

2.1. 公钥加密

通常,公钥加密(也称为非对称加密)需要一对密钥 - 公钥和私钥 - 作为彼此的补充。我们使用公钥来解密用相应的私钥加密的消息,反之亦然

请注意,我们无法使用加密消息的相同密钥来解密消息。因此,如果相应的私钥加密了消息,我们就无法使用私钥解密消息。

同样,如果同一个公钥加密了消息,我们就不能使用公钥解密消息。因此,我们可以自由共享公钥,只要我们不共享私钥,因为两者都需要加密和解密消息。

2.2. 验证发件人

SSH 使用公钥加密来确保客户端与其声称的身份相符。首先,客户端必须通过将客户端的公钥发送到服务器来向服务器注册。然后服务器将这个公钥记录在经过身份验证的客户端列表中,并为其分配一个 ID。服务器和客户端都知道这个 ID。

注册完成后,客户端稍后可以使用以下步骤向服务器进行身份验证:

  1. 客户端和服务器使用Diffie-Hellman 密钥交换算法 就密钥达成一致。
  2. 客户端向服务器发送其 ID。
  3. 服务器检查以确保收到的 ID 在其经过身份验证的客户端列表中。
  4. 服务器创建一个随机数,使用与收到的 ID 对应的客户端公钥对其进行加密,然后将其发送给客户端。
  5. 客户端用自己的私钥解密随机数。
  6. 客户端将随机数与密钥组合,散列,然后发送给服务器。
  7. 服务器计算组合的随机数和秘密的哈希值。
  8. 服务器将计算出的散列值与从客户端收到的散列值进行比较。

如果计算出的哈希值和接收到的哈希值匹配,则身份验证成功。

从本质上讲,SSH 是通过使用记录的公钥加密一些数据,将其发送给客户端,并要求客户端解密并发回相同的数据来测试客户端的。如果客户端可以成功解密并发回相同的数据,则它必须拥有与记录的公钥相关联的私钥。因此,客户就是它声称的那个人。

3. 生成 SSH 密钥

毫不奇怪,许多最受欢迎的网站,包括GitHubGitLab ,都使用 SSH 身份验证。

要在这些网站上使用这种机制,我们必须创建一个 SSH 密钥对。要为当前用户生成密钥对,请执行:

ssh-keygen

我们将被提示输入一个位置来保存密钥对、密码和密码确认。通过在每次提示时按 Enter 键为所有三个选择默认值。

默认情况下,ssh-keygen会将密钥对保存到 ~/.ssh。在该目录中,我们看到两个文件——id_rsa和 id_rsa.pub——分别对应于私钥和公钥。

请注意,私钥 ( id_rsa ) 永远不应共享。

此外,我们可以通过执行cat ~/.ssh/id_rsa.pub查看公钥的内容。输出将类似于:

ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQD1Y6mRUepVaEZ+6ghg+ju/iirHQqQbuE3Wy6aEb+b
nKlzqFgAyGFuQSw+DuDqyZkWFd9O4Al4TOr7bQsS6Xji2GUt0ikr9/gv2pVwUd9LBiEAks+HEfb4tMO
77FMGQ4BytU9ssYCjCRT4F7rx0li0qUqhgao7syaxu4PTI+p+Auz1Y1wwVf7T4Pwd9YFcThTa6+Lr5r
vbft8Ws2KwHDEzNH2lf9UoiN1Lcd5szHpT1iXz9jvb3Fmd2I8d8seThde5WHI7N6t+ojyqntIc9bMW9
TL2uw/kFtZfIsC4/OKDVscWRBxY7xkb/4N5UJJ9OL2cpu1fZBHL9T6TG4lOyIEMj
[[email protected]](/cdn_cgi/l/email_protection)

3.1. 更改默认位置

要将密钥对保存到特定位置,我们执行 ssh-keygen并在提示时输入位置:

Enter file in which to save the key (/home/my-username/.ssh/id_rsa):

虽然提示仅包含私钥的名称,ssh-keygen将在同一目录中生成扩展名为.pub 的*公钥文件*。

我们还可以使用*-f*标志在当前目录中生成具有特定文件名的密钥对 :

ssh-keygen -f example

上面的命令会在当前目录下生成一对example和 example.pub的密钥 。

3.2. 添加密码

此外,我们可以要求一个密码来解锁我们生成的密钥对。要添加密码,我们执行ssh-keygen并在出现提示时输入密码:

Enter passphrase (empty for no passphrase):

ssh-keygen将提示我们确认密码。如果密码不匹配,ssh-keygen会提示我们输入密码并再次确认。

3.3. 选择算法和长度

除非另有说明,ssh-keygen在生成密钥对时使用Rivest–Shamir–Adleman (RSA)算法 。我们可以使用*-t*标志指定另一种算法 。例如:

ssh-keygen -t dsa

默认情况下,这将生成一对密钥 id_dsa和 id_dsa.pub。通常,生成的对的默认文件名格式为 *id_*和 id_.pub

我们可以通过提供*–help*标志来查看支持的算法列表:

ssh-keygen --help

这将导致类似于以下内容的输出:

usage: ssh-keygen ... [-t dsa | ecdsa | ed25519 | rsa]
    ...

如果需要,也可以使用*-b*标志以字节为单位指定生成密钥的长度:

ssh-keygen -b 4096