SSH keygen 生成密钥对的完整教程

SSH Keygen 生成密钥对的完整教程

一、前言

在网络安全中,SSH(Secure Shell)协议广泛应用于远程登录、文件传输等操作。为了提高登录的安全性,SSH采用了公钥认证机制。生成 SSH 密钥对是实现公钥认证的第一步。通过 SSH 密钥对,用户可以避免在每次连接时输入密码,且密钥加密提供了比传统密码更强的安全性。

本教程将详细介绍如何使用 ssh-keygen 工具生成 SSH 密钥对,并将公钥添加到远程服务器中进行配置。教程假设你已经拥有 Linux、macOS 或 Windows 的基础操作技能,并安装了相关工具。

二、什么是 SSH 密钥对

SSH 密钥对包含一对密钥:

  1. 公钥(public key):可以安全地分享给别人,通常用于存储在服务器上,用来验证客户端。
  2. 私钥(private key):只能由拥有者保管,不应泄露给任何人。私钥用于加密会话,只有拥有正确私钥的客户端才能通过公钥认证。

在 SSH 连接过程中,客户端通过私钥进行身份验证,服务器使用公钥来验证客户端的身份,从而实现安全的无密码登录。

三、使用 ssh-keygen 生成密钥对

ssh-keygen 是用于生成 SSH 密钥对的命令行工具。它支持多种密钥类型(如 RSA、ECDSA、Ed25519 等),并且可以设置密钥长度。

1. 打开终端

根据操作系统的不同,打开终端的方式也不同:

  • Linux/macOS:直接打开系统的终端(Terminal)。
  • Windows:可以使用 PowerShell 或 Git Bash(需要安装 Git Bash)。

2. 运行 ssh-keygen 命令

在终端中输入以下命令来生成 SSH 密钥对:

bash
ssh-keygen -t rsa -b 4096 -C "[email protected]"

其中:
- -t rsa:指定密钥类型为 RSA,RSA 是一种常用的公钥加密算法。你也可以选择其他类型,如 ed25519(一种现代的安全算法)或 ecdsa
- -b 4096:指定密钥的位数,RSA 算法的推荐位数为 4096 位,越长的密钥安全性越高,但也会略微影响性能。
- -C "[email protected]":为密钥添加一个注释,通常是与密钥关联的邮箱地址,用于标识密钥的用途或所有者。

3. 设置密钥存储位置

执行命令后,ssh-keygen 会提示你指定密钥文件的存储位置:

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

  • 如果你按下 Enter 键,则会将密钥保存在默认位置 ~/.ssh/id_rsa(Linux/macOS)或 C:\Users\youruser\.ssh\id_rsa(Windows)中。
  • 如果你希望将密钥保存在其他位置,可以输入自定义路径。

4. 设置密钥保护密码(可选)

接下来,ssh-keygen 会要求你输入一个密码来保护私钥:

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

  • 空密码:如果你不想设置密码保护,可以直接按 Enter 键跳过。
  • 设置密码:如果你希望设置密码保护,可以输入一个密码,这样每次使用私钥时都会要求输入密码。

设置密码可以增加安全性,但也会在每次使用私钥时增加一些操作步骤。一般建议使用密码,但如果你有自动化需求(如使用脚本连接),可以选择不设置密码。

5. 完成密钥生成

完成上述步骤后,ssh-keygen 会生成两个文件:
- 私钥:通常为 id_rsa(或你选择的其他文件名),位于 ~/.ssh/ 目录下。
- 公钥:通常为 id_rsa.pub,与私钥文件位于同一目录。

例如,输出类似以下内容:

Your identification has been saved in /home/youruser/.ssh/id_rsa.
Your public key has been saved in /home/youruser/.ssh/id_rsa.pub.

四、将公钥添加到远程服务器

完成密钥对生成后,接下来的步骤是将公钥添加到远程服务器的 ~/.ssh/authorized_keys 文件中,以便能够通过公钥认证进行无密码登录。

1. 查看公钥内容

使用以下命令查看公钥内容:

bash
cat ~/.ssh/id_rsa.pub

将输出的公钥内容(通常以 ssh-rsa 开头)复制到剪贴板。

2. 将公钥上传到服务器

你可以手动将公钥添加到远程服务器,或者使用 ssh-copy-id 命令自动上传。

手动添加:
  1. 登录到远程服务器:
    bash
    ssh user@remote_host

  2. 在远程服务器上,确保 ~/.ssh/ 目录存在(如果不存在,则创建它):
    bash
    mkdir -p ~/.ssh

  3. 编辑 ~/.ssh/authorized_keys 文件,将本地公钥粘贴到文件中:
    bash
    nano ~/.ssh/authorized_keys

  4. 将公钥内容粘贴到文件中,保存并退出。

使用 ssh-copy-id 命令:

如果你已经在本地生成了密钥对,可以使用 ssh-copy-id 命令将公钥自动上传到远程服务器:

bash
ssh-copy-id user@remote_host

这将会自动将公钥添加到远程服务器的 ~/.ssh/authorized_keys 文件中。

3. 设置正确的权限

确保 ~/.ssh/ 目录和 authorized_keys 文件的权限设置正确。否则,SSH 可能无法读取公钥认证信息。

在远程服务器上,执行以下命令:

bash
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys

五、测试 SSH 登录

现在,你已经成功地将公钥添加到远程服务器,可以尝试通过 SSH 使用密钥对进行登录:

bash
ssh user@remote_host

如果一切设置正确,你应该不再需要输入密码,而是直接通过公钥认证进行登录。

六、常见问题和故障排除

  • 权限问题:确保本地和远程 ~/.ssh 目录及文件权限正确,特别是 ~/.ssh 目录应该具有 700 权限,authorized_keys 文件应该具有 600 权限。
  • 公钥没有被正确添加:如果遇到认证失败的问题,请检查公钥是否正确地添加到了远程服务器的 authorized_keys 文件中,且格式正确。
  • 私钥权限问题:本地的私钥文件应具有 600 权限,确保它没有被其他用户读取。

七、总结

通过使用 ssh-keygen 工具生成 SSH 密钥对,你能够实现更安全、更便捷的远程连接。通过公钥认证,你可以免去频繁输入密码的麻烦,并且大大提高了远程登录的安全性。本教程涵盖了如何生成密钥对、将公钥添加到远程服务器以及相关的权限配置,帮助你更好地理解和应用 SSH 密钥认证机制。

THE END