鲁ICP备2024118681号
Collect from网页模板
Modified by 博客

SSH 免密登录:原理详解与实操指南

一、SSH 免密登录的原理

SSH(Secure Shell)支持多种身份验证方式,其中最常用的是:

  • 密码认证(Password Authentication)
  • 公钥认证(Public Key Authentication)

免密登录的核心就是使用“公钥认证”机制,其原理如下:

  1. 在本地生成一对密钥:
  2. 私钥(id_rsa:保存在本地,绝对不能泄露。
  3. 公钥(id_rsa.pub:可以公开,用于分发。

  4. 将本地的公钥内容追加到远程服务器的 ~/.ssh/authorized_keys 文件中。

  5. 当你通过 SSH 连接远程服务器时:

  6. 服务器会检查 authorized_keys 中是否有匹配的公钥;
  7. 如果有,服务器会向客户端发起一个“请求”;
  8. 客户端使用私钥签名响应;
  9. 服务器用对应的公钥验证签名;
  10. 验证通过 → 免密登录成功。

✅ 简单理解:
authorized_keys 文件就像是服务器的“白名单”,只有持有对应私钥的人才能通过验证。

此外,首次连接时,SSH 会将远程主机的指纹记录在本地的 ~/.ssh/known_hosts 文件中,防止中间人攻击。


二、配置步骤:从零开始设置 SSH 免密登录

第一步:本机安装并初始化 SSH

大多数 Linux 和 macOS 系统默认已安装 OpenSSH 客户端和服务端。如果未安装,可使用以下命令安装:

# Ubuntu/Debian
sudo apt update && sudo apt install openssh-client openssh-server -y

# CentOS/RHEL
sudo yum install openssh-clients openssh-server -y

生成 SSH 密钥对

运行以下命令生成 RSA 密钥(推荐使用更安全的 ed25519,见扩展建议):

ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
  • -t rsa:指定密钥类型为 RSA;
  • -b 4096:密钥长度为 4096 位(更安全);
  • -C "...":添加注释(通常是邮箱),便于识别。

执行后,系统会提示: - 保存路径(默认 ~/.ssh/id_rsa) - 是否设置私钥密码(可选,增强安全性)

🔐 建议:生产环境建议为私钥设置密码(passphrase),防止私钥被盗用。

生成完成后,你会看到两个文件: - ~/.ssh/id_rsa(私钥) - ~/.ssh/id_rsa.pub(公钥)


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

有两种主流方式将公钥上传到目标服务器。

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

这是最简单的方式,自动完成公钥上传和权限设置:

ssh-copy-id username@remote_host

# 示例
ssh-copy-id leon@192.168.1.2

系统会提示你输入一次远程用户的密码,之后公钥将被自动追加到 ~/.ssh/authorized_keys

✅ 优点:自动处理目录和文件权限,避免常见错误。

方法二:手动上传(适用于无 ssh-copy-id 的环境)

如果目标系统没有安装 ssh-copy-id,可以手动操作:

# 1. 复制公钥到远程服务器
scp ~/.ssh/id_rsa.pub leon@192.168.1.2:~/id_rsa.pub

# 2. 登录远程服务器并追加公钥
ssh leon@192.168.1.2

# 在远程服务器上执行
mkdir -p ~/.ssh
cat ~/id_rsa.pub >> ~/.ssh/authorized_keys
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys
rm ~/id_rsa.pub  # 清理临时文件

⚠️ 注意:~/.ssh 目录权限必须为 700authorized_keys 文件权限必须为 600,否则 SSH 会拒绝使用。


第三步:测试免密登录

配置完成后,尝试连接:

ssh leon@192.168.1.2

如果一切正常,你应该能直接登录,无需输入密码。


三、常见问题排查

问题 可能原因 解决方案
仍需输入密码 authorized_keys 权限错误 检查权限:chmod 700 ~/.ssh, chmod 600 ~/.ssh/authorized_keys
权限 denied (publickey) SSH 服务未启用公钥认证 检查 /etc/ssh/sshd_config
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys
连接被拒绝 SSH 服务未运行 sudo systemctl status sshd,确保服务启动
主机密钥变更警告 服务器重装或IP复用 删除本地 ~/.ssh/known_hosts 中对应行,或使用 ssh-keygen -R 192.168.1.2

四、安全建议

  1. 禁用密码登录(可选)
    在确认密钥登录稳定后,可编辑 /etc/ssh/sshd_configconf PasswordAuthentication no 重启 SSH 服务:sudo systemctl restart sshd

  2. 使用更安全的密钥类型
    推荐使用 Ed25519 替代 RSA: bash ssh-keygen -t ed25519 -C "your_email@example.com"

  3. 定期轮换密钥
    长期使用的密钥应定期更换,避免泄露风险。

  4. 保护私钥

  5. 不要将私钥上传到 GitHub 或共享设备;
  6. 使用 ssh-agent 管理私钥,避免重复输入 passphrase。

五、进阶技巧

1. 配置 SSH Config 文件(简化连接)

编辑 ~/.ssh/config

Host myserver
    HostName 192.168.1.2
    User leon
    IdentityFile ~/.ssh/id_rsa

之后只需输入:

ssh myserver

2. 批量部署公钥

可结合 Ansible、Shell 脚本等方式批量部署公钥到多台服务器。


总结

SSH 免密登录不仅是提升效率的工具,更是实现自动化运维的基础。掌握其原理与配置方法,能让你在管理服务器时更加得心应手。

✅ 核心要点回顾: 1. 本地生成密钥对(私钥 + 公钥) 2. 公钥上传至远程 ~/.ssh/authorized_keys 3. 正确设置文件权限 4. 测试连接并排查常见问题


📌 一句话口诀
本地生钥,公钥上传,权限设好,免密登船。


发表评论

评论列表,共 0 条评论

    暂无评论