在Linux中生成SSH密钥的10个示例(ssh-keygen)

时间:2020-01-09 10:38:44  来源:igfitidea点击:

我们使用ssh-keygen工具生成SSH密钥,该密钥用于基于SSH的基于公钥的身份验证。
在撰写本文时,SSH可以使用6种不同类型的身份验证方法。

但是公钥身份验证是跨生产环境使用的最常用的身份验证方法之一。

要使用基于公钥的身份验证,我们将需要一个公钥和私钥对。

  • 公钥内容必须添加到服务器的" authorized_keys"文件中

  • 私钥将存储在客户端上

因此,当客户端尝试建立安全连接时,它将使用此私钥和公钥对组合来建立连接

ssh-keygen概述

  • ssh-keygen是由openssh rpm提供的实用程序,默认情况下应将其安装在所有Linux发行版中。

  • ssh-keygen生成,管理和转换ssh版本2.0及更高版本的身份验证密钥

  • 该工具支持不同的参数,可根据需要用于创建密钥

  • 如果我们希望将SSH与公钥认证一起使用,则只需使用一次即可在~/.ssh/id_dsa,~~ ..ssh/id_ecdsa,~~ ..ssh/id_ed25519或者~/.ssh/id_rsa

  • 如果我们忘记了密码,则无法重置密码,我们必须重新创建新的密码并将其密钥对放置在相应的位置以重新激活公共密钥身份验证

让我们探索" ssh-keygen"工具,以在Linux中生成不同类型的密钥对。

1.生成不带任何参数的ssh密钥

  • 我们可以执行不带任何参数的ssh-keygen,默认情况下会使用RSA算法生成密钥对

  • 该工具将提示我们输入存储RSA密钥对的位置。

  • 默认位置将位于用户的主文件夹中,位于.ssh下,即~/.ssh。

  • 如果目录不存在,该工具将创建~/.ssh

  • 私有RSA密钥使用的默认命名语法为id_rsa,公共密钥为id_rsa.pub

  • 接下来提供密码,我们可以按Enter键以创建较少密码的密钥对

# ssh-keygen

2.定义密钥类型

  • 默认情况下," ssh-keygen"将创建RSA类型的密钥

  • 我们可以使用dsaecdsaed25519或者rsa类型创建密钥

  • 使用-t <key>参数定义键的类型

  • 在此示例中,我将创建" ED25519"类型的密钥对

# ssh-keygen -t ed25519

3.定义位大小

默认情况下,ssh-keygen生成SSH密钥,其比特大小为2048. 我们还可以使用-b &lt;bit_size>指定用于键的位数。

在此示例中,我将生成4096位大小的密钥

# ssh-keygen -b 4096

4.分配密码短语

默认情况下,ssh-keygen将在创建密钥对之前提示输入密码。
但是我们也可以使用-P &lt;your_password>来分配密码。

# ssh-keygen -P "MyPassw0rd"

5.更改私钥的密码短语

  • 我们还可以更改私钥的现有密码短语

  • ssh-keygen-p一起使用,这将提示我们输入私钥文件的位置

  • 接下来,提供私钥的现有密码短语

  • 如果提供的密码正确,则将提示我们将新密码分配给现有私钥

# ssh-keygen -p
Enter file in which the key is (/root/.ssh/id_rsa):
Enter old passphrase:
Key has comment '[email protected]'
Enter new passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved with the new passphrase.

提示:

要使这一步骤自动化,我们可以使用带有-f的ssh-keygen提供私钥文件,使用-P定义旧密码,使用-N定义新密码。

# ssh-keygen -p -f ~/.ssh/id_rsa  -P "old_password" -N "new_password"
Key has comment '[email protected]'
Your identification has been saved with the new passphrase.

6.使用自定义文件名创建密钥

  • 默认情况下," ssh-keygen"会创建名称为" id_rsa"的私钥,并将公钥创建为" id_rsa.pub"。

  • 我们还可以使用-f <file_name>创建具有自定义文件名的密钥。

  • 这将在执行ssh-keygen工具的位置创建并保留证书在当前位置

  • 在此示例中,我的私钥将是" my-own-rsa-key",而公钥将是" my-own-rsa-key.pub"。

# ssh-keygen -f my-own-rsa-key

7.将自定义注释添加到密钥

我们还可以将自定义注释添加到私钥中以进行更多标识。
使用-C &lt;comment>来生成带有自定义注释的密钥

# ssh-keygen -C "This is for server1.example.com"

我们可以使用-l来打印私钥的指纹和注释

# ssh-keygen -l 
Enter file in which the key is (/root/.ssh/id_rsa):
3072 SHA256:JxBpArCDsIVME0HDtQG7FqFQefaS9ommeohVoEmg39g This is for server1.example.com (RSA)

8.更改键的注释

我们还可以使用-c参数更改私钥的现有注释。

# ssh-keygen -c
Enter file in which the key is (/root/.ssh/id_rsa):
Key now has comment 'This is for server1.example.com'
Enter new comment: This is for rhel-8.example.com
The comment in your key file has been changed.

检查私钥的新评论

# ssh-keygen -l
Enter file in which the key is (/root/.ssh/id_rsa):
3072 SHA256:JxBpArCDsIVME0HDtQG7FqFQefaS9ommeohVoEmg39g This is for rhel-8.example.com (RSA)

9.散列known_hosts文件的内容

  • 每次对另一台服务器执行SSH时,用于安全连接的SSH指纹都会添加到客户端的~/.ssh/known_hosts文件中

  • 这用于验证SSH连接的真实性

  • known_hosts文件的内容将采用这种格式

# cat .ssh/known_hosts
10.10.10.10 ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDGlXmWjH3Ly6ty9O3hYeg8p/ld7Isl65DaoxqTclbPrAdvDKrsB12MJlJS7oNur2TNUKfU24N+UKn7fqyUeEGWZrIh2DIaPC2Msq132x2P3IBeposynhfBmk6ZoJi58WjddIInQnaAJ/OJZB2waOp+RdtW53lP7zkPTny6yOUYUmFuC93mEMTAf6CpHEoBsNB/OH8km11kpjbbZ4QUx/1shXNnXo5El0/2Cqn7g/s0hi1EuDysDxAj2BkH8fsNyHitNhattf6NIL4akKagcZUhY/9Oj3TikM05MR5Jf72w8EQTtr9vNMTkxlaz/G66GeJR0TAd7CUCux+7KJ8KSH6r
192.168.43.22 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBCGtytDuWTzCZJ4FGy5OBKTgYwllftrmgZ3Z+mSTTRmNVlTCEDygSzALLdtC7MEilv/ezTN2uA3HIC72jYegrMc=
  • 任何入侵者都可以使用此信息来获取各个"主机名"的指纹详细信息。

  • 我们可以使用-s参数,使用ssh-keygen来对" known_hosts"文件中的"主机名"条目进行哈希处理

  • 该选项不会修改现有的散列主机名,因此可以安全地用于混合了散列名和非散列名的文件。

  • 这将在同一位置创建扩展名为.old的备份文件。

# ssh-keygen -H

接下来检查known_hosts文件的内容

# cat .ssh/known_hosts
|1|DnQfHwXX0E78Kqd9sM+jhKICLhM=|A7gki0vPIUajFlROxDljIxE6rGM= ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDGlXmWjH3Ly6ty9O3hYeg8p/ld7Isl65DaoxqTclbPrAdvDKrsB12MJlJS7oNur2TNUKfU24N+UKn7fqyUeEGWZrIh2DIaPC2Msq132x2P3IBeposynhfBmk6ZoJi58WjddIInQnaAJ/OJZB2waOp+RdtW53lP7zkPTny6yOUYUmFuC93mEMTAf6CpHEoBsNB/OH8km11kpjbbZ4QUx/1shXNnXo5El0/2Cqn7g/s0hi1EuDysDxAj2BkH8fsNyHitNhattf6NIL4akKagcZUhY/9Oj3TikM05MR5Jf72w8EQTtr9vNMTkxlaz/G66GeJR0TAd7CUCux+7KJ8KSH6r
|1|RK+RdFcebk+2EK81Rs16e9Im6Hk=|b7QKZly3lm6mBEzIvsLDps4x44I= ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBCGtytDuWTzCZJ4FGy5OBKTgYwllftrmgZ3Z+mSTTRmNVlTCEDygSzALLdtC7MEilv/ezTN2uA3HIC72jYegrMc=

如我们现在所见,由于主机名是散列的,因此无法理解。
备份文件也在同一位置创建

# ls -l ~/.ssh/known_hosts*
-rw------- 1 root root 664 Jan 23 18:37 /root/.ssh/known_hosts
-rw-r--r-- 1 root root 568 Mar 27 13:09 /root/.ssh/known_hosts.old

10.从known_hosts文件中删除主机名的键

  • 每次执行SSH时,用于各自"主机名"的SSH连接的RSA密钥都存储在"~/.ssh/known_hosts"文件中

  • 但是,如果我们重新安装目标服务器并尝试执行SSH,则SSH可能由于指纹不匹配而失败

  • 因此,我们可以从" known_hosts"文件中手动搜索并删除服务器的RSA指纹,也可以使用ssh-keygen来完成此工作

  • 使用-R &lt;hostname>known_hosts文件中自动搜索并删除提供的`hostname'的所有指纹和RSA密钥条目。

  • 例如,从" known_hosts"文件中删除与" 192.168.43.22"主机相关的所有密钥。

# ssh-keygen -R 192.168.43.22
# Host 192.168.43.22 found: line 2
/root/.ssh/known_hosts updated.
Original contents retained as /root/.ssh/known_hosts.old