在Linux中生成SSH密钥
1.概述
在本教程中,我们将介绍 SSH 密钥的基础知识以及如何在 Linux 中生成 SSH 密钥对。
2. 安全外壳 (SSH)
Secure Shell (SSH) 是一种安全的远程登录协议,它利用公钥密码术来加密客户端和服务器之间的通信。
2.1. 公钥加密
通常,公钥加密(也称为非对称加密)需要一对密钥 - 公钥和私钥 - 作为彼此的补充。我们使用公钥来解密用相应的私钥加密的消息,反之亦然。
请注意,我们无法使用加密消息的相同密钥来解密消息。因此,如果相应的私钥加密了消息,我们就无法使用私钥解密消息。
同样,如果同一个公钥加密了消息,我们就不能使用公钥解密消息。因此,我们可以自由共享公钥,只要我们不共享私钥,因为两者都需要加密和解密消息。
2.2. 验证发件人
SSH 使用公钥加密来确保客户端与其声称的身份相符。首先,客户端必须通过将客户端的公钥发送到服务器来向服务器注册。然后服务器将这个公钥记录在经过身份验证的客户端列表中,并为其分配一个 ID。服务器和客户端都知道这个 ID。
注册完成后,客户端稍后可以使用以下步骤向服务器进行身份验证:
- 客户端和服务器使用Diffie-Hellman 密钥交换算法 就密钥达成一致。
- 客户端向服务器发送其 ID。
- 服务器检查以确保收到的 ID 在其经过身份验证的客户端列表中。
- 服务器创建一个随机数,使用与收到的 ID 对应的客户端公钥对其进行加密,然后将其发送给客户端。
- 客户端用自己的私钥解密随机数。
- 客户端将随机数与密钥组合,散列,然后发送给服务器。
- 服务器计算组合的随机数和秘密的哈希值。
- 服务器将计算出的散列值与从客户端收到的散列值进行比较。
如果计算出的哈希值和接收到的哈希值匹配,则身份验证成功。
从本质上讲,SSH 是通过使用记录的公钥加密一些数据,将其发送给客户端,并要求客户端解密并发回相同的数据来测试客户端的。如果客户端可以成功解密并发回相同的数据,则它必须拥有与记录的公钥相关联的私钥。因此,客户就是它声称的那个人。
3. 生成 SSH 密钥
毫不奇怪,许多最受欢迎的网站,包括GitHub 和GitLab ,都使用 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