以下示例文章介绍了如何在 Linux 服务器(以 CentOS / Ubuntu 等常见发行版为例)上通过 SSH 密钥配置免密码登录。文中会包含完整的操作指令和说明,帮助你快速完成密钥下发并启用公钥认证。
一、前言
在日常运维或开发环境中,为了提高安全性以及简化登录流程,常常需要配置 SSH 免密登录。通过 SSH 密钥进行身份验证,可以避免在每次连接服务器时输入密码,同时也能有效地防止暴力破解等安全风险。
下面,我们将依次介绍如何生成 SSH 密钥、下发公钥到远程主机,以及如何在目标服务器上启用公钥认证并生效。
二、生成 SSH 密钥
在本地机器(一般是你的工作电脑或者跳板机)上执行以下命令,生成一对 RSA 公钥和私钥。
ssh-keygen -t rsa -b 4096 -C "ceph@cluster" -f ~/.ssh/id_rsa -N ""
参数解析:
ssh-keygen
:生成 SSH 密钥的命令行工具。-t rsa
:指定密钥类型为 RSA。-b 4096
:指定密钥长度为 4096 位。位数越大,加密强度也越高。-C "ceph@cluster"
:添加注释,方便标识此密钥。你可以自定义为自己的备注信息,如“user@hostname”。-f ~/.ssh/id_rsa
:指定生成的私钥和公钥文件的保存位置,分别是~/.ssh/id_rsa
和~/.ssh/id_rsa.pub
。-N ""
:设置密钥密码为空,即不为此密钥设置 passphrase(如果你希望在使用私钥时还需要输入密码,可以去掉-N ""
并在命令执行时输入一个复杂密码)。
执行完成后,你会在本地 ~/.ssh/
目录下得到两个文件:
- 私钥:
id_rsa
- 公钥:
id_rsa.pub
三、下发公钥到远程服务器
要实现免密码登录,需要将本地的公钥(~/.ssh/id_rsa.pub
)复制到远程服务器的 authorized_keys
中。可以使用以下命令完成自动复制:
ssh-copy-id root@1.1.1.1
参数解析:
ssh-copy-id
:自动将本地的公钥复制到远程服务器的~/.ssh/authorized_keys
文件中。root@1.1.1.1
:表示连接远程服务器1.1.1.1
的root
用户。实际使用时替换为目标服务器的 IP 和所需登录的用户名。
执行该命令后,会提示你输入远程服务器 root
用户的密码。输入正确后,公钥会被追加到远程服务器上。如果复制成功,下次登录就无需再输入密码。
如果你的系统中没有 ssh-copy-id
工具
可以使用手动方式复制公钥:
cat ~/.ssh/id_rsa.pub | ssh root@1.1.1.1 "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"
四、启用公钥认证
有些服务器默认可能没有启用公钥登录,需要在 SSH 配置文件 /etc/ssh/sshd_config
中启用。可以使用 sed
命令一键修改并使公钥认证生效,然后重启 SSH 服务。
sed -i '/^#*PubkeyAuthentication/s/.*/PubkeyAuthentication yes/' /etc/ssh/sshd_config && systemctl restart sshd
参数解析:
sed -i
:直接在文件内修改,不输出到屏幕。'/^#*PubkeyAuthentication/s/.*/PubkeyAuthentication yes/'
:匹配被注释或没被注释的PubkeyAuthentication
行,并替换为PubkeyAuthentication yes
。/etc/ssh/sshd_config
:SSH 服务配置文件。&& systemctl restart sshd
:只有在修改成功后才重启 SSH 服务,让修改立即生效。
五、测试免密码登录
完成以上步骤后,你可以从本地再次执行:
ssh root@1.1.1.1
如果之前一切配置正确,且本地私钥没有设置密码或已正确解锁,你将直接登录到远程服务器,而无需输入密码。
六、注意事项
安全性:
- 如果你没有给私钥设置 passphrase,那么任何能获取到你的私钥文件(
id_rsa
)的用户都可以随意使用它登录到对应的服务器。 - 建议你妥善保管私钥,必要时可将其权限设置为 600 (
chmod 600 ~/.ssh/id_rsa
),并在需要时使用加密工具或安全存储来保存私钥。
- 如果你没有给私钥设置 passphrase,那么任何能获取到你的私钥文件(
Root 登录限制:
- 部分服务器默认禁止
root
用户直接使用 SSH 登录。如果你的服务器已在/etc/ssh/sshd_config
中禁用PermitRootLogin yes
,需要先启用(或使用非 root 用户 + sudo 的方式登录)。
- 部分服务器默认禁止
防火墙和端口:
- 确保服务器的防火墙放行 SSH 所在端口(默认 22),若不是默认端口,可在连接时使用
ssh -p 自定义端口 user@host
。
- 确保服务器的防火墙放行 SSH 所在端口(默认 22),若不是默认端口,可在连接时使用
七、结语
至此,你已经学会了如何生成 SSH 密钥、将公钥下发到远程服务器,以及在服务器端启用并生效公钥认证,实现 SSH 免密登录。
这一方法能有效提升安全性和效率,避免在每次登录时输入密码,也能减少密码泄露的风险。祝你在使用 SSH 时更加轻松和安全!
如有疑问或出现任何错误提示,可查看 ssh-copy-id
或 ssh-keygen
的帮助文档(通过 man ssh-copy-id
或 man ssh-keygen
命令)。