Linux命令——ssh-keygen

1. 说明

ssh-keygen 命令用于生成 SSH 密钥对,其中包括公钥和私钥。这对密钥可用于实现安全的身份验证和加密通信。生成的公钥可以被共享,并在远程主机上配置以实现无密码登录等功能。

2. 语法

1
ssh-keygen [选项]

3. 选项

  • -t 类型:指定密钥类型

    • 示例:ssh-keygen -t rsa
  • -b 位数:指定密钥位数(位数越高,安全性越高,但性能越差)

    • 示例:ssh-keygen -t rsa -b 2048
  • -C 注释:添加注释

    • 示例:ssh-keygen -t rsa -b 2048 -C "user@example.com"
  • -f 文件名:指定密钥文件的名称

    • 示例:ssh-keygen -f /path/to/custom_key
  • -N 密码:设置密码

    • 示例:ssh-keygen -t rsa -b 2048 -N "passphrase"
  • -q:静默模式(不显示进度信息)

    • 示例:ssh-keygen -t rsa -b 2048 -q
  • -E 哈希算法:指定哈希算法

    可以是md5sha256,默认为:sha256

    • 示例:ssh-keygen -t rsa -b 2048 -E sha256
  • -y:从私钥生成公钥

    查看或提取私钥文件对应的公钥,而无需重新生成密钥对。

    • 示例:ssh-keygen -y -f ~/.ssh/id_rsa
  • -i:将私钥文件的格式转换为 OpenSSH 格式

    • 示例:ssh-keygen -i -f ~/.ssh/id_rsa

具体参数说明参见:具体参数说明

4. 简单示例

  • 生成默认类型(RSA)的密钥对:

    1
    
    ssh-keygen
  • 生成指定类型(DSA)和位数(1024)的密钥对:

    1
    
    ssh-keygen -t dsa -b 1024
  • 生成带注释的密钥对:

    1
    
    ssh-keygen -t rsa -b 2048 -C "user@example.com"
  • 生成密钥对并指定文件名:

    1
    
    ssh-keygen -f /path/to/custom_key
  • 生成带密码保护的密钥对:

    1
    
    ssh-keygen -t rsa -b 2048 -N "passphrase"

5.实例

1
ssh-keygen -t rsa -b 2048 -C "test"

生成一个 2048 比特的 RSA 密钥对,同时添加了一个注释 “test”(存在于公钥文件中)。

image-20240118152218305

由于上面的命令我们没有指定生成的密钥对的路径和名称,所以这里提示我们指定密钥对的路径和名称。

我们可以有下面几种选择:

  • 直接回车。

    使用默认的文件路径和文件名。如果是root用户,则会存放于/root/.ssh文件夹中,私钥文件名为:id_rsa,公钥文件名为:id_rsa.pub

  • 只指定文件名,如:test

    生成的两个密钥文件就会存放于执行当前命令的文件夹中,私钥文件名为:test,公钥文件名为:test.pub

  • 指定路径和文件名,如:/root/rsa_keys/test

    生成的两个密钥文件的存放路径为:/root/rsa_keys,私钥文件名为:test,公钥文件名为:test.pub

然后进入下一步,指定私钥的密码。

image-20240118153904183

可以选择输入密码(确认密码),也可以直接回车跳过此步(不设置密码)。

image-20240118154618826

然后就可以看到密钥对生产的位置啦!

6.具体参数说明

密钥类型

-t参数指定生成密钥的类型,不同的密钥类型在 SSH 中使用不同的算法,以下是对每种密钥类型(rsa1rsadsaecdsaed25519)的简要介绍:

  1. rsa1(已过时):

    • 算法: 使用 RSA 算法,但是是早期版本。
    • 安全性: 目前不再推荐使用,因为它的安全性较低,容易受到攻击。
    • 使用场景: 仅在与旧系统或特殊需求的兼容性问题中使用。
  2. rsa:

    • 算法: 使用 RSA(Rivest–Shamir–Adleman) 算法。
    • 安全性: RSA 是一种常见、广泛使用的非对称加密算法,提供良好的安全性,RSA的安全性基于大整数的质因数分解问题的困难性。
    • 使用场景: 适用于一般的 SSH 密钥对生成,是默认的密钥类型
  3. dsa:

    • 算法: 使用数字签名算法(Digital Signature Algorithm)。
    • 安全性: DSA 提供了数字签名和验证的功能,但相对于 RSA,长度相对较短,通常在 512 到 1024 位之间。
    • 使用场景: 在一些特定的环境中使用,但较少见。
  4. ecdsa:

    • 算法: 使用椭圆曲线数字签名算法(Elliptic Curve Digital Signature Algorithm)。
    • 安全性: 提供与传统算法相似的安全性,但使用更短的密钥长度,因此具有更好的性能。其安全性基于椭圆曲线离散对数问题的困难性。
    • 使用场景: 适用于资源受限的环境,如嵌入式系统。
  5. ed25519:

    • 算法: 使用 Ed25519 曲线。
    • 安全性: Ed25519算法具有较高的性能和较小的密钥长度,同时提供了强大的安全性。它在许多应用中被广泛使用,包括数字签名、密钥交换等。。
    • 使用场景: 由于其性能和安全性的优势,Ed25519逐渐成为了一种常见的非对称加密算法,推荐用于新的密钥生成

选择密钥类型的建议:

  • 如果不确定,使用默认的 rsa 类型通常是一个不错的选择。
  • 对于更高的安全性和性能,可以考虑使用 ed25519 类型。
  • 避免使用已过时的 rsa1 类型,除非与旧系统或特殊需求兼容。

密钥位数

-b参数指定要创建的密钥中的位数。

  • RSA密钥,最小大小为1024位,默认值为2048位,一般认为2048位是足够的。
  • DSA密钥,必须是1024位(FIPS 186-2 标准的要求)。
  • ECDSA密钥,-b 参数用于指定椭圆曲线的位数,而不是直接指定密钥的位数。必须从三种椭圆曲线大小(256、384或521)中选择一个值,使用其他值将导致密钥创建失败。
  • ED25519密钥,具有固定长度 256 位,-b标志将被忽略。

添加注释

-C 参数用于向生成的 SSH 密钥添加一个注释(comment)。注释通常用于标识该密钥的用途或属主。注释字符串会被保存在生成的公钥文件中,以便用户在管理密钥时可以更容易地理解密钥的用途。这对于在一个系统上管理多个密钥,或在多个系统上使用相同密钥时,能够更好地组织和识别密钥。

指定密钥文件路径

-f 参数用于指定生成的密钥文件的名称和路径。通过 -f 参数,你可以自定义生成的密钥文件的存储位置和名称。这在需要为不同用途、不同用户或不同主机生成多个密钥对时非常有用。

如果不指定 -f 参数,生成的密钥文件将使用默认路径。默认路径取决于操作系统和用户的家目录。通常情况下,SSH 密钥文件的默认路径如下:

  1. 私钥文件默认路径:

    • Linux 和 macOS: ~/.ssh/id_rsa
    • Windows: C:\Users\YourUsername\.ssh\id_rsa
  2. 公钥文件默认路径:

    • Linux 和 macOS: ~/.ssh/id_rsa.pub
    • Windows: C:\Users\YourUsername\.ssh\id_rsa.pub

在这里,~ 表示用户的家目录。

私钥文件添加密码

-N 参数用于生成 SSH 密钥对时为私钥文件添加一个密码,以提高密钥的安全性。

  • 如果不提供 -N 参数,或者提供空的密码(-N ""),则生成的私钥文件将不加密,即没有密码保护。
  • 在使用密码保护的私钥文件时,每次访问时都需要输入密码,这可以增加密钥的安全性,特别是在私钥文件可能被未经授权的人访问的情况下。
0%