SSH 密钥认证:免密登录与安全配置

FreeGuideOnline 最新 2026-06-18

SSH 密钥认证:从原理到免密登录的完整配置指南

在远程管理 Linux 服务器时,SSH(Secure Shell)是最常用的工具。传统的密码登录不仅繁琐,还存在暴力破解的风险。SSH 密钥认证提供了一种更安全、更便捷的验证方式,让你无需每次输入密码即可安全登录。本教程将带你从零开始,理解密钥对的工作原理,完成免密登录配置,并掌握关键的安全强化设置。

什么是 SSH 密钥对?

SSH 密钥对由两个文件组成,它们就像一把特制的锁和钥匙:

  • 私钥(Private Key):严密保管在你的本地电脑上,相当于“钥匙”。绝不能泄露
  • 公钥(Public Key):安装在远程服务器上,相当于一把“锁”。它可以公开分发,但只有对应的私钥才能打开。

登录时,服务器会用它保存的公钥加密一段随机数据发送给你的客户端。只有持有对应私钥的客户端才能解密并返回正确的响应,从而完成身份验证。这个过程全程不传输私钥,从根本上杜绝了中间人攻击和密码泄露的风险。

第一步:在本地生成 SSH 密钥对

任何 Linux、macOS 或 Windows 10 以上系统的终端都可以执行此操作。我们将使用 ssh-keygen 命令生成一对 Ed25519 算法密钥,它比传统的 RSA 更快、更短且更安全。

打开终端,输入以下命令(将注释文字替换为你的邮箱,便于识别):

ssh-keygen -t ed25519 -C "your_email@example.com"

按回车后,系统会依次提示:

  1. 文件保存位置:直接按 Enter 接受默认路径(~/.ssh/id_ed25519)。如有多个密钥,可修改文件名。
  2. 设置口令(passphrase):为私钥添加一层额外的保护。即使私钥文件被盗,不知道口令也无法使用。日常使用中,可配合 ssh-agent 避免重复输入。本教程为简单起见,可先留空直接回车,但生产环境强烈建议设置。

生成成功后,终端会显示密钥指纹和随机图像。此时在 ~/.ssh/ 目录下会多出两个文件:

  • id_ed25519 (私钥,权限必须为 600)
  • id_ed25519.pub (公钥,内容以 ssh-ed25519 开头)

第二步:将公钥上传到远程服务器

要让服务器认可你的“锁”,需要把公钥内容追加到远程服务器上指定用户的 ~/.ssh/authorized_keys 文件中。有几种简便方法:

方法一:使用 ssh-copy-id(推荐)

绝大多数系统自带此工具,它会自动完成公钥复制并设置正确的文件权限。

ssh-copy-id -i ~/.ssh/id_ed25519.pub username@remote_host

替换 usernameremote_host 为实际的登录用户名和服务器 IP 或域名。过程中需要输入一次该用户在远程服务器上的登录密码,之后即可免密登录。

方法二:手动复制(适合无 ssh-copy-id 的场景)

首先查看并复制你的公钥内容:

cat ~/.ssh/id_ed25519.pub

然后登录远程服务器,确保用户的 home 目录下存在 .ssh 文件夹,且权限为 700:

mkdir -p ~/.ssh
chmod 700 ~/.ssh

用文本编辑器(如 vimnano)打开(或创建)authorized_keys 文件:

nano ~/.ssh/authorized_keys

将复制好的公钥内容(一整行)粘贴进去,保存退出。最后务必设置该文件的严格权限:

chmod 600 ~/.ssh/authorized_keys

第三步:验证免密登录

现在,尝试用 SSH 连接远程服务器:

ssh username@remote_host

如果一切顺利,无需输入密码即可直接进入系统。如果你在生成密钥时设置了私钥口令,系统会提示你输入该口令(而不是服务器密码)。后续可以配置 ssh-agent 来暂存口令,一次输入,多次使用。

第四步:为安全加固 SSH 配置

配置完密钥登录后,建议进一步增强服务器的 SSH 安全性,彻底关闭密码登录功能,杜绝暴力破解。

1. 备份并编辑 SSH 服务端配置文件

以 root 权限或使用 sudo 编辑 /etc/ssh/sshd_config

sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
sudo nano /etc/ssh/sshd_config

2. 修改关键安全参数

找到并修改以下配置项,若行首有 # 请删除以取消注释。

  • 禁用密码认证:确保已经成功配置并测试过密钥登录,否则会将自己锁在服务器外。

    PasswordAuthentication no
    
  • 禁止空密码登录

    PermitEmptyPasswords no
    
  • 禁用 root 用户直接登录:养成使用普通用户 + sudo 的习惯。先创建一个普通用户并配置好密钥,再修改此项。

    PermitRootLogin no
    
  • 启用密钥认证(通常默认开启,但最好显式确认):

    PubkeyAuthentication yes
    

3. 重启 SSH 服务使配置生效

sudo systemctl restart sshd

重要提醒:在关闭当前会话前,另开一个终端窗口测试新配置能否正常连接。如果出现问题,还能通过原终端修复配置,避免被锁在服务器外。

第五步(进阶):使用 SSH 配置别名简化登录

频繁输入用户名和 IP 也很麻烦。可以在本地创建 ~/.ssh/config 文件,为服务器设置别名。

编辑该文件:

nano ~/.ssh/config

写入如下格式内容:

Host myserver
    HostName 192.168.1.100
    User john
    Port 22
    IdentityFile ~/.ssh/id_ed25519

保存后,直接用 ssh myserver 就能登录。你可以为多台服务器添加多个 Host 段落。

常见问题与注意事项

  • 权限错误:如果配置后仍然提示输入密码,90% 的可能是远程服务器上的目录或文件权限不正确。请严格检查:
    • 用户 home 目录:权限 755 或更严格(不能是 777)。
    • ~/.ssh 目录:权限 700。
    • ~/.ssh/authorized_keys 文件:权限 600。
  • 私钥丢失:私钥一旦丢失,若没有备用登录方式(如控制台 Web 端),将无法登录。请将私钥妥善备份在安全的地方。
  • 多个密钥管理:为不同服务生成不同密钥对,并在 ~/.ssh/config 中为每个 Host 指定 IdentityFile,做到密钥隔离。

恭喜!你已经掌握了 SSH 密钥认证的完整流程。从此告别频繁输入密码,享受安全、高效的远程管理体验。这份技能将是你系统管理和 DevOps 学习之路上的重要基石。