SSH(Secure Shell)是一种网络协议,用于在不安全的网络中提供安全的远程登录和其他网络服务。SSH 密钥认证是一种比传统密码认证更安全的登录方式。
一、SSH 密钥的生成、配置、使用。
生成 SSH 密钥
通常使用 ssh-keygen
工具来生成 SSH 密钥对,密钥对包含公钥和私钥。以下是在不同操作系统上生成密钥对的步骤:
Linux/macOS
打开终端,执行以下命令:
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
-t rsa
:指定密钥类型为 RSA。-b 4096
:指定密钥长度为 4096 位。-C "your_email@example.com"
:为密钥添加注释,方便识别。
执行命令后,会提示你选择密钥保存的位置和设置密码(可留空不设置)。默认情况下,密钥会保存在 ~/.ssh/id_rsa
(私钥)和 ~/.ssh/id_rsa.pub
(公钥)。
Windows
在 Windows 上可以使用 Git Bash 或 PowerShell 来生成 SSH 密钥,命令与 Linux/macOS 相同: powershell
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
配置 SSH 公钥到远程服务器
生成密钥对后,需要将公钥配置到远程服务器上,这样才能使用私钥进行认证登录。
Linux/macOS
可以使用 ssh-copy-id
命令将公钥复制到远程服务器:
ssh-copy-id user@remote_server_ip
user
:远程服务器的用户名。remote_server_ip
:远程服务器的 IP 地址。
执行该命令后,会提示输入远程服务器的密码,输入密码后,公钥会被自动复制到远程服务器的 ~/.ssh/authorized_keys
文件中。
Windows
如果使用 Git Bash,也可以使用 ssh-copy-id
命令。如果使用 PowerShell,可以手动将公钥内容复制到远程服务器的 ~/.ssh/authorized_keys
文件中。
- 打开公钥文件
~/.ssh/id_rsa.pub
,复制其中的内容。 - 使用 SSH 客户端(如 PuTTY)登录到远程服务器。
- 创建或编辑
~/.ssh/authorized_keys
文件,将复制的公钥内容粘贴到该文件中。
配置 SSH 客户端
为了方便使用 SSH 密钥登录,可以在本地的 SSH 配置文件 ~/.ssh/config
中进行配置。
打开 ~/.ssh/config
文件(如果文件不存在,可以手动创建),添加以下内容:
Host remote_server
HostName remote_server_ip
User user
IdentityFile ~/.ssh/id_rsa
Host remote_server
:定义一个别名,方便后续使用。HostName remote_server_ip
:远程服务器的 IP 地址。User user
:远程服务器的用户名。IdentityFile ~/.ssh/id_rsa
:指定使用的私钥文件。
配置完成后,就可以使用以下命令登录远程服务器:
ssh remote_server
测试 SSH 密钥登录
配置完成后,可以尝试使用 SSH 密钥登录远程服务器:
ssh user@remote_server_ip
如果配置正确,将无需输入密码即可登录到远程服务器。
注意事项
- 私钥文件非常重要,要妥善保管,不要泄露给他人。
- 如果需要在多台设备上使用 SSH 密钥,可以将私钥复制到其他设备上,但要确保私钥的安全性。
- 可以定期更换 SSH 密钥,以提高安全性。
二、如何在服务器上生成SSH密钥?
在服务器上生成 SSH 密钥的过程与在客户端生成类似,通常使用 ssh-keygen
工具。以下是详细步骤,以 Linux 服务器为例进行说明:
1. 打开终端
使用具有相应权限的用户账户登录到服务器的终端。如果需要以 root
用户身份执行操作,可以先使用 sudo -i
命令切换到 root
用户。
2. 生成 SSH 密钥对
在终端中执行 ssh-keygen
命令来生成密钥对。常用的命令格式如下:
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
参数说明:
-t rsa
:指定密钥类型为 RSA,RSA 是一种广泛使用的非对称加密算法,目前大多数场景都适用。-b 4096
:指定密钥的长度为 4096 位,密钥长度越长,安全性相对越高,但生成时间也会相应增加。-C "your_email@example.com"
:为密钥添加注释信息,通常使用电子邮件地址,方便识别该密钥的用途或所有者。
3. 选择密钥保存位置
执行上述命令后,系统会提示你选择密钥保存的位置,默认路径是 ~/.ssh/id_rsa
(私钥)和 ~/.ssh/id_rsa.pub
(公钥)。如果你想使用默认位置,直接按回车键即可;若要指定其他位置,输入完整的路径和文件名。例如:
Enter file in which to save the key (/root/.ssh/id_rsa): /root/.ssh/my_custom_key
4. 设置密钥密码(可选)
接下来,系统会提示你设置一个用于保护私钥的密码。这个密码可以增加私钥的安全性,即使私钥文件被泄露,没有密码也无法使用。如果你想设置密码,输入密码并确认;若不想设置,直接按回车键跳过。
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
5. 完成密钥生成
当你完成上述步骤后,ssh-keygen
会生成 SSH 密钥对,并显示类似以下的信息:
Your identification has been saved in /root/.ssh/my_custom_key.
Your public key has been saved in /root/.ssh/my_custom_key.pub.
The key fingerprint is:
SHA256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx your_email@example.com
The key's randomart image is:
+---[RSA 4096]----+
| . |
| o . |
| o o . |
| . o + . |
| . S = . |
| o + = |
| . + * . |
| . o + o |
| . E . |
+----[SHA256]-----+
6. 查看生成的密钥文件
生成完成后,你可以使用以下命令查看生成的私钥和公钥文件:
ls ~/.ssh
如果使用了默认路径,会看到 id_rsa
和 id_rsa.pub
文件;若指定了自定义路径,会看到相应的文件。
7. 配置公钥用于其他用途(可选)
如果你生成密钥是为了方便从该服务器连接到其他服务器,可以将公钥内容添加到目标服务器的 ~/.ssh/authorized_keys
文件中,具体方法可参考之前提到的将公钥复制到服务器的步骤。
不同密钥类型
除了 RSA 密钥,ssh-keygen
还支持其他类型的密钥,例如:
- ED25519:这是一种较新的椭圆曲线加密算法,具有更高的安全性和更快的生成速度。生成 ED25519 密钥的命令如下:
ssh-keygen -t ed25519 -C "your_email@example.com"
使用方法与 RSA 密钥基本相同。 通过以上步骤,你就可以在服务器上成功生成 SSH 密钥对。
三、如何在服务器上配置SSH密钥?
在服务器上配置 SSH 密钥主要涉及接收并存储客户端的公钥,以便客户端可以使用对应的私钥进行安全的身份验证登录。以下为你详细介绍具体步骤:
前提条件
确保服务器已经安装并运行了 SSH 服务,一般 Linux 发行版默认都会安装 OpenSSH 服务。你可以通过以下命令检查 SSH 服务的运行状态:
systemctl status sshd # 适用于使用 systemd 的系统,如 CentOS 7 及以上、Ubuntu 16.04 及以上
若服务未运行,可使用以下命令启动:
systemctl start sshd
若想让 SSH 服务在系统启动时自动运行,可使用以下命令:
systemctl enable sshd
配置步骤
1. 创建或检查 .ssh
目录
在服务器上,每个用户都有自己的 SSH 配置目录,通常是用户主目录下的 .ssh
目录。首先要确保该目录存在,并且权限设置正确。使用以下命令进行操作:
mkdir -p ~/.ssh
chmod 700 ~/.ssh
mkdir -p ~/.ssh
:如果.ssh
目录不存在,则创建它。-p
选项确保即使父目录不存在也能正确创建。chmod 700 ~/.ssh
:将.ssh
目录的权限设置为只有用户本身可以读写和访问。
2. 接收客户端公钥
客户端生成 SSH 密钥对后,需要将公钥内容传输到服务器。常见的传输方法有以下两种:
方法一:使用 ssh-copy-id
命令(适用于客户端和服务器可以直接通信的情况)
在客户端机器上执行以下命令:
ssh-copy-id username@server_ip
username
:服务器上的用户名。server_ip
:服务器的 IP 地址。
执行该命令后,系统会提示输入服务器用户的密码,输入正确密码后,客户端的公钥就会被自动复制到服务器的 ~/.ssh/authorized_keys
文件中。
方法二:手动复制公钥内容
- 在客户端上,打开公钥文件(通常是
~/.ssh/id_rsa.pub
),复制其中的内容。 - 在服务器上,使用文本编辑器(如
vim
或nano
)打开~/.ssh/authorized_keys
文件,如果文件不存在则创建它:
nano ~/.ssh/authorized_keys
- 将从客户端复制的公钥内容粘贴到
authorized_keys
文件中,然后保存并退出编辑器。
3. 设置 authorized_keys
文件权限
确保 authorized_keys
文件的权限设置正确,只有用户本身可以读写:
chmod 600 ~/.ssh/authorized_keys
4. 验证 SSH 密钥登录
在客户端上,尝试使用 SSH 密钥登录服务器:
ssh username@server_ip
如果配置正确,此时无需输入密码即可登录到服务器。
其他配置(可选)
禁用密码登录(增强安全性)
为了进一步提高服务器的安全性,可以在服务器上禁用 SSH 密码登录,只允许使用 SSH 密钥登录。编辑 /etc/ssh/sshd_config
文件:
sudo nano /etc/ssh/sshd_config
找到以下行并进行修改:
PasswordAuthentication no
保存并退出编辑器,然后重启 SSH 服务:
sudo systemctl restart sshd
多用户和多密钥管理
如果服务器上有多个用户需要使用 SSH 密钥登录,每个用户都需要在自己的主目录下完成上述配置步骤。此外,如果一个用户需要使用多个 SSH 密钥进行不同的操作,只需将多个公钥内容依次添加到 ~/.ssh/authorized_keys
文件中即可。