在 Ubuntu/Debian 等 Linux 系统中,实现SSH 密钥登录涉及生成密钥对、配置密钥认证、修改SSH服务配置等步骤。以下是详细操作指南。
一、生成 SSH 密钥对
使用 ssh-keygen 命令生成。推荐使用更安全的 Ed25519 算法(如果系统支持),否则使用 RSA 4096 位。
1. 生成 Ed25519 密钥(推荐)
ssh-keygen -t ed25519 -C "your_email@example.com"
-t ed25519:指定密钥类型。
-C "注释":通常填写邮箱或用途说明,便于识别。
2. 生成 RSA 密钥(兼容性更好)
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
-b 4096:指定密钥长度(默认 3072,推荐 4096)。
3. 交互过程
保存位置:默认保存在
~/.ssh/ 目录,文件名如id_ed25519(私钥)和id_ed25519.pub(公钥)。直接按回车使用默认路径。密码短语:建议设置一个强密码,增加安全性。按回车跳过则无密码。
生成后,会在 ~/.ssh/ 目录下得到两个文件:
私钥(如
id_ed25519):必须保密,不要泄露。公钥(如
id_ed25519.pub):可公开,用于配置远程服务器。
二、使用 SSH 密钥进行认证
1. 将公钥添加到远程服务器
方法一:使用 ssh-copy-id(最简单)
ssh-copy-id user@remote_host
该命令会将本地默认公钥
~/.ssh/id_*.pub)追加到远程服务器的~/.ssh/authorized_keys 文件中,并自动设置正确权限。
方法二:手动复制
cat ~/.ssh/id_ed25519.pub | ssh user@remote_host "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"
然后确保远程服务器上 ~/.ssh 目录和 authorized_keys 文件权限正确:
ssh user@remote_host "chmod 700 ~/.ssh && chmod 600 ~/.ssh/authorized_keys"
2. 测试 SSH 密钥登录
ssh user@remote_host
如果设置了密码短语,会提示输入。若未设置且配置正确,应直接登录成功。
3. (可选)使用 ssh-agent 管理私钥
如果私钥设置了密码短语,不想每次输入,可将私钥添加到 ssh-agent:
eval "$(ssh-agent -s)" # 启动 agent
ssh-add ~/.ssh/id_ed25519 # 添加私钥,输入一次密码
之后本次会话中所有 SSH 连接都不会再要求输入密码。
三、常见问题与注意事项
权限问题
私钥权限必须为 600
chmod 600 ~/.ssh/id_ed25519~/.ssh 目录权限应为 700
chmod 700 ~/.ssh若权限过宽,SSH 会拒绝使用该私钥。
公钥格式
公钥是一行文本,通常以ssh-ed25519或ssh-rsa 开头,后面跟着密钥字符串和注释。
不要修改公钥文件内容,否则无法使用。多密钥管理
可以在~/.ssh/config 中为不同主机指定使用不同私钥:Host github.com HostName github.com User git IdentityFile ~/.ssh/id_ed25519_github Host myserver HostName 192.168.1.100 User admin IdentityFile ~/.ssh/id_rsa_legacy检查本地 SSH 代理
若遇到Permission denied (publickey),可尝试:ssh -vT user@remote_host # 查看详细调试信息
要配置 OpenSSH 服务器仅允许密钥登录并关闭密码登录,需要修改 SSH 服务端的配置文件 /etc/ssh/sshd_config,并重启服务。以下是详细步骤,适用于 Ubuntu/Debian 系统。
四、修改 SSH 服务端配置
操作前的重要提醒
在禁用密码登录之前,请确保:
您已经将本地公钥正确添加到了服务器的
~/.ssh/authorized_keys 文件中。您已经使用密钥成功登录过一次,以验证配置正确。
保持一个已登录的终端会话(如通过现有 SSH 连接)作为“保底”,防止配置错误导致无法登录。
1. 编辑 SSH 服务端配置文件
使用 root 或具有 sudo 权限的用户编辑 /etc/ssh/sshd_config:
sudo nano /etc/ssh/sshd_config
2. 修改相关配置项
找到并设置以下指令(如果文件中没有,则手动添加):
# 禁用密码认证(核心设置)
PasswordAuthentication no
# 禁用质询-响应认证(避免某些情况下仍然允许密码)
ChallengeResponseAuthentication no
# 确保公钥认证已启用(默认即为 yes,可显式设置)
PubkeyAuthentication yes
# (可选)如果系统使用了 PAM(默认启用),可能需要禁用 PAM 的密码认证部分
# 注意:完全禁用 UsePAM 可能会影响其他认证方式(如 Kerberos),请根据实际需求决定
UsePAM no
补充说明:
PasswordAuthentication no 直接禁止了密码登录。ChallengeResponseAuthentication no 可以防止某些配置下仍允许通过键盘交互式(如密码)认证。UsePAM no 会绕过 PAM 模块,如果您的系统没有其他特殊认证需求(如 LDAP),可以设置此项。如果保留UsePAM yes,则仍需确保 PAM 配置(如/etc/pam.d/sshd)不会允许密码登录。通常设置前两项已足够。
3. 检查并调整其他相关选项
PermitRootLogin:如果您希望禁止 root 直接密码登录,可以设为prohibit-password(或without-password),仅允许 root 使用密钥登录。PermitRootLogin prohibit-password如果希望完全禁止 root 登录,可设为 no。
AuthenticationMethods(可选):如果想强制指定认证方法,可以添加:AuthenticationMethods publickey
4. 保存文件并重启 SSH 服务
sudo systemctl restart sshd
对于较旧的系统(使用 SysVinit):
sudo service ssh restart
5. 验证配置
在另一个终端窗口中尝试使用密码登录(应当被拒绝),然后使用密钥登录验证是否正常:
# 测试密码登录(应提示 Permission denied)
ssh -o PreferredAuthentications=password user@server
# 测试密钥登录(应成功)
ssh user@server
如果密钥登录失败,请检查:
本地私钥路径和权限是否正确
~/.ssh/id_rsa 权限应为 600)。服务器上
~/.ssh/authorized_keys 文件是否存在且权限正确(600),.ssh 目录权限为 700。SSH 服务日志
sudo journalctl -u sshd 或sudo tail -f /var/log/auth.log 查看详细错误。
补充:使用 sshd 配置测试
在重启服务前,可以使用 sshd -t 测试配置文件语法是否正确:
sudo sshd -t
若无输出,说明语法正确。
五、总结
完成以上步骤后,您的 SSH 服务器将只接受密钥认证,密码登录被彻底禁用。这种方式可以显著提高服务器安全性,避免暴力破解密码的风险。