发布于: 2025-11-6最后更新: 2025-11-6字数 3238阅读时长 9 分钟

什么是 SSH 密钥认证

SSH 密钥认证是一种使用公钥加密技术进行身份验证的方法,无需每次输入密码即可安全登录远程服务器。

传统密码登录 vs 密钥登录

特性
密码登录
密钥登录
安全性
中等(可能被暴力破解)
高(几乎无法破解)
便利性
每次需要输入密码
一次配置,永久免密
自动化
难以自动化脚本
可用于自动化任务
密钥长度
通常 8-16 字符
2048-4096 位或更长

工作原理

SSH 密钥认证使用非对称加密(也称公钥加密):

认证流程

  1. 客户端发起连接:向服务器发送登录请求
  1. 服务器发送挑战:生成一段随机数据
  1. 客户端用私钥签名:使用私钥对数据进行加密签名
  1. 服务器验证签名:用公钥尝试解密
  1. 验证成功:如果解密成功,证明客户端拥有对应的私钥,允许登录
关键点
  • 私钥永远不会传输,只在本地使用
  • 即使有人截获通信数据,也无法伪造私钥
  • 公钥可以公开,不会泄露任何安全信息

优势

1. 安全性更高

  • 抗暴力破解:密钥长度远超密码(如 ED25519 是 256 位)
  • 防中间人攻击:即使通信被截获也无法伪造身份
  • 无密码泄露风险:没有密码可以被钓鱼或键盘记录窃取

2. 使用便捷

  • 一次配置,永久使用
  • 支持多台服务器使用同一密钥
  • 可配合 SSH config 实现一键登录

3. 适合自动化

  • 脚本可以自动 SSH 连接(无需交互输入密码)
  • CI/CD 流程中的远程部署
  • 定时任务的远程执行

完整配置步骤

前提条件

  • 客户端已安装 SSH 客户端(Linux/macOS 自带,Windows 10+ 自带或使用 WSL)
  • 服务器已安装并运行 SSH 服务器
  • 有服务器的用户名和密码(首次配置需要)

步骤 1: 生成 SSH 密钥对

客户端(你的电脑)上执行:

参数说明

  • t ed25519:指定密钥类型为 ED25519(推荐)
    • 其他选项:rsa(传统,需要更长密钥)、ecdsa
    • ED25519 是最新、最安全、最快的算法
  • C "注释":添加注释标识这个密钥,通常用邮箱或描述
    • 示例:C "work-laptop"C "john@company.com"

交互提示

执行命令后会出现以下提示:
1. 保存位置
  • 直接按 Enter:使用默认路径 ~/.ssh/id_ed25519
  • 或输入自定义路径(不推荐新手)
2. 设置密码(passphrase)
  • 留空(直接按 Enter):实现完全免密登录
  • 设置密码:额外一层保护,但每次使用密钥时需要输入(可用 ssh-agent 管理)
3. 确认密码
  • 再次按 Enter(如果留空)或重复输入密码

生成结果

成功后会显示:
生成的文件:
  • ~/.ssh/id_ed25519私钥(🔑 绝密!不要分享)
  • ~/.ssh/id_ed25519.pub公钥(🔓 可以公开,复制到服务器)

步骤 2: 复制公钥到服务器

有三种方法,推荐方法 1(最简单)。

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

示例:
优点
  • 自动处理所有配置
  • 自动设置正确的文件权限
  • 避免手动错误
输入密码:这是最后一次需要输入密码,之后就免密了!

方法 2: 手动复制(如果没有 ssh-copy-id)

步骤 2.1:查看公钥内容
输出类似:
步骤 2.2:复制整行内容(包括 ssh-ed25519 开头和邮箱结尾)
步骤 2.3:登录服务器
步骤 2.4:在服务器上执行
步骤 2.5:粘贴公钥内容,保存退出(Ctrl+O, Enter, Ctrl+X)
步骤 2.6:设置文件权限
步骤 2.7:退出服务器

方法 3: 一条命令完成(Linux/macOS)

输入密码后,配置完成。

步骤 3: 测试免密登录

成功标志
  • 不要求输入密码
  • 直接登录到服务器
如果还要求密码,请查看故障排查部分。

高级配置

1. SSH Config 配置文件

创建或编辑 ~/.ssh/config 文件可以简化 SSH 命令。

基本配置

使用:

多服务器配置

常用配置选项

选项
说明
示例
Host
别名
Host myserver
HostName
实际主机地址
HostName 192.168.1.100
User
登录用户名
User admin
Port
SSH 端口
Port 2222
IdentityFile
指定私钥
IdentityFile ~/.ssh/custom_key
ServerAliveInterval
保持连接(秒)
ServerAliveInterval 60
Compression
启用压缩
Compression yes
ForwardAgent
SSH Agent 转发
ForwardAgent yes
设置文件权限:

2. 管理多个密钥

不同服务使用不同密钥(更安全):

生成不同密钥

在 config 中指定


3. 使用 SSH Agent(密钥有密码时)

如果你的私钥设置了密码(passphrase),每次使用都需要输入。使用 SSH Agent 可以只输入一次。

启动 SSH Agent

永久启动(添加到 .bashrc 或 .zshrc)


4. 为服务器配置多用户访问

如果多人需要访问同一服务器:

5. 跳板机配置(ProxyJump)

通过跳板机访问内网服务器:
使用:

故障排查

问题 1: 仍然要求输入密码

检查 1:公钥是否正确复制

在服务器上检查:
应该包含你的公钥内容。

检查 2:文件权限是否正确

应该显示:

检查 3:SELinux 问题(CentOS/RHEL)

检查 4:SSH 服务器配置

在服务器上检查 /etc/ssh/sshd_config
确保以下选项启用:
如果修改了配置,重启 SSH 服务:

检查 5:查看详细日志

在服务器上查看日志:

问题 2: Permission denied (publickey)

原因:服务器拒绝了密钥认证。
解决
  1. 确认公钥已正确添加到服务器
  1. 检查文件权限(见上方)
  1. 确认使用了正确的私钥:

    问题 3: Host key verification failed

    原因:服务器的主机密钥改变了(可能是重装系统或 MITM 攻击)。
    解决(确认安全后):

    问题 4: 密钥文件权限问题

    错误信息
    解决

    问题 5: 连接超时

    检查
    1. 服务器是否运行
    1. 防火墙是否开放 SSH 端口(默认 22)
    1. 网络是否畅通

    安全建议

    1. 保护私钥安全 🔒

    • 永远不要分享私钥:私钥就像密码,只能自己知道
    • 为私钥设置密码:即使电脑被盗,也无法使用密钥
    • 备份私钥:存储在安全的位置(加密 U 盘、密码管理器)
    • 定期更换密钥:建议每年或在设备更换时更换

    2. 服务器安全配置

    在服务器的 /etc/ssh/sshd_config 中:
    修改后重启服务:

    3. 使用强密钥算法

    推荐优先级
    1. ED25519(最佳选择):ssh-keygen -t ed25519
    1. RSA 4096ssh-keygen -t rsa -b 4096
    1. 避免:DSA(已废弃)、RSA 1024(不安全)

    4. 限制 authorized_keys

    在服务器的 ~/.ssh/authorized_keys 中可以为每个密钥添加限制:

    5. 启用双因素认证(2FA)

    安装 Google Authenticator PAM 模块:

    6. 监控登录日志

    定期检查异常登录:

    7. 使用 fail2ban 防止暴力破解


    常见使用场景

    场景 1: GitHub/GitLab 密钥配置

    添加:
    测试:

    场景 2: 自动化部署脚本


    场景 3: 批量服务器管理


    快速参考

    常用命令速查

    重要文件路径

    权限要求


    总结

    SSH 密钥认证是一种安全、便捷、高效的远程登录方式:
    优点
    • 无需记忆和输入密码
    • 安全性远超密码认证
    • 支持自动化脚本和批量操作
    • 可以为不同服务使用不同密钥
    ⚠️ 注意事项
    • 妥善保管私钥,不要泄露
    • 定期更新密钥
    • 为私钥设置密码增加安全性
    • 禁用服务器的密码登录
    🎯 最佳实践
    1. 使用 ED25519 算法
    1. 为私钥设置密码并使用 SSH Agent
    1. 配置 SSH config 简化使用
    1. 在服务器禁用密码认证
    1. 定期审计 authorized_keys

    相关资源


    Loading...
    修改 OpenSSH 的端口号 (Windows)

    修改 OpenSSH 的端口号 (Windows)


    从单人开发到正规流程:一个 IT 开发者的自我升级指南

    🗒️从单人开发到正规流程:一个 IT 开发者的自我升级指南

    这篇文章整理了我与Claude的对话,涵盖了正规软件开发流程的核心实践,以及如何在单人开发的环境下落地这些实践。内容包括开发流程概览、Docker 开发环境搭建、测试入门、代码复用策略,以及从开发到生产的完整部署流程。