SSH 密钥管理
掌握 SSH 密钥的生成、分发、代理与高级配置,实现安全、便捷的无密码登录。
速查卡片
| 项目 | 内容 |
|---|---|
| 生成 Ed25519 密钥 | ssh-keygen -t ed25519 -C "my@email" |
| 生成 RSA 密钥 | ssh-keygen -t rsa -b 4096 -C "my@email" |
| 修改密码 | ssh-keygen -p -f ~/.ssh/id_ed25519 |
| 修改注释 | ssh-keygen -c -f ~/.ssh/id_ed25519 |
| 查看指纹 | ssh-keygen -l -f ~/.ssh/id_ed25519.pub |
| 提取公钥 | ssh-keygen -y -f ~/.ssh/id_ed25519 |
| 分发公钥 | ssh-copy-id user@host |
| 启动 ssh-agent | eval $(ssh-agent) |
| 添加密钥到 agent | ssh-add ~/.ssh/id_ed25519 |
| 列出 agent 中的密钥 | ssh-add -l |
| 删除 agent 中的密钥 | ssh-add -d ~/.ssh/id_ed25519 |
| 导出公钥(RFC4716) | ssh-keygen -e -m RFC4716 -f id_ed25519.pub |
| 搜索 known_hosts | ssh-keygen -F hostname |
| 删除 known_hosts 条目 | ssh-keygen -R hostname |
| 颁发证书 | ssh-keygen -s ca_key -I id -n user user_key.pub |
概述
SSH 密钥认证比密码认证更安全且更便捷。核心工作流:
text
1. ssh-keygen → 生成密钥对(私钥 + 公钥)
2. ssh-copy-id → 将公钥部署到远程主机 authorized_keys
3. ssh-agent → 缓存已解密私钥,免重复输入密码
4. 连接时自动认证密钥类型对比
| 类型 | 推荐度 | 默认长度 | 安全性 | 性能 | 备注 |
|---|---|---|---|---|---|
| Ed25519 | ⭐⭐⭐ | 256 位(固定) | 极高 | 极快 | 现代首选,抗侧信道攻击 |
| ECDSA | ⭐⭐ | 256/384/521 | 高 | 快 | 依赖系统随机数质量 |
| RSA | ⭐ | 3072 位 | 中 | 慢 | 传统方案,需足够位长 |
| Ed25519-SK | ⭐⭐⭐ | 固定 | 极高 | 快 | 需 FIDO/U2F 硬件令牌 |
| ECDSA-SK | ⭐⭐ | 固定 | 高 | 快 | 需 FIDO/U2F 硬件令牌 |
ssh-keygen —— 密钥生成与管理
示例一:生成密钥对
bash
# 推荐:Ed25519(现代、安全、快速)
ssh-keygen -t ed25519 -C "your_email@example.com"
# 兼容性优先:RSA 4096 位
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
# ECDSA
ssh-keygen -t ecdsa -b 521 -C "your_email@example.com"
# 生成 FIDO/U2F 硬件令牌密钥
ssh-keygen -t ed25519-sk生成的文件:
- 私钥:
~/.ssh/id_ed25519(权限必须为 600) - 公钥:
~/.ssh/id_ed25519.pub(可分享)
示例二:密码管理
bash
# 修改私钥密码
ssh-keygen -p -f ~/.ssh/id_ed25519
# 移除密码(不推荐)
ssh-keygen -p -P old_pass -N '' -f ~/.ssh/id_ed25519
# 增加 KDF 轮数(增强抗暴力破解)
ssh-keygen -p -a 100 -f ~/.ssh/id_ed25519示例三:公钥查看与格式转换
bash
# 从私钥提取公钥
ssh-keygen -y -f ~/.ssh/id_ed25519
# 查看指纹(SHA256)
ssh-keygen -l -f ~/.ssh/id_ed25519.pub
# 查看指纹(MD5,旧格式)
ssh-keygen -l -E md5 -f ~/.ssh/id_ed25519.pub
# 可视化的 ASCII 随机艺术指纹
ssh-keygen -lv -f ~/.ssh/id_ed25519.pub
# 导出为 RFC4716 格式(用于其他 SSH 软件)
ssh-keygen -e -m RFC4716 -f ~/.ssh/id_ed25519.pub
# 导出为 PEM 格式
ssh-keygen -e -m PEM -f ~/.ssh/id_ed25519.pub
# 从外部格式导入为 OpenSSH 格式
ssh-keygen -i -m RFC4716 -f external_key.pub > ~/.ssh/imported_key.pub示例四:known_hosts 管理
bash
# 搜索已知主机
ssh-keygen -F github.com
# 搜索含端口的条目
ssh-keygen -F "[hostname]:2222"
# 删除特定主机条目
ssh-keygen -R hostname
# 删除含端口的条目
ssh-keygen -R "[hostname]:2222"
# 哈希化 known_hosts(隐藏主机名)
ssh-keygen -H -f ~/.ssh/known_hosts命令行选项参考
| 选项 | 说明 |
|---|---|
-t type | 密钥类型:ed25519/ecdsa/rsa/ed25519-sk/ecdsa-sk |
-b bits | 密钥位长(RSA 默认 3072,ECDSA 可选 256/384/521) |
-C comment | 密钥注释 |
-f file | 指定密钥文件路径 |
-N passphrase | 新密码(命令行指定) |
-P passphrase | 旧密码(命令行指定) |
-p | 修改密码模式 |
-c | 修改注释模式 |
-l | 显示指纹 |
-lv | 显示指纹 + ASCII 艺术图 |
-E hash | 指纹哈希算法(md5/sha256) |
-y | 从私钥导出公钥 |
-e / -i | 导出/导入密钥格式 |
-m format | 指定格式(RFC4716/PKCS8/PEM) |
-R hostname | 从 known_hosts 删除主机 |
-F hostname | 在 known_hosts 中搜索主机 |
-H | 哈希化 known_hosts 文件 |
-a rounds | KDF 轮数(默认 16) |
-Z cipher | 加密私钥的密码算法(默认 aes256-ctr) |
-A | 生成所有类型的默认主机密钥 |
SSH 证书(Certificate)
OpenSSH 支持自建 CA 签发 SSH 证书,实现集中式密钥管理:
bash
# 1. 生成 CA 密钥
ssh-keygen -t ed25519 -f ca_key -C "My CA"
# 2. 签发用户证书
ssh-keygen -s ca_key -I "user_id" -n "username" \
-V "+52w" user_key.pub
# → 生成 user_key-cert.pub
# 3. 签发主机证书
ssh-keygen -s ca_key -I "host_id" -h \
-n "host.example.com" host_key.pub
# → 生成 host_key-cert.pub
# 4. 查看证书内容
ssh-keygen -L -f user_key-cert.pub
# 5. 服务端信任 CA(在 sshd_config 中)
# TrustedUserCAKeys /etc/ssh/ca_key.pub
# 客户端信任主机 CA(在 ~/.ssh/known_hosts 中)
# @cert-authority *.example.com <ca_public_key>证书选项限制(签发时可指定):
| 选项 | 说明 |
|---|---|
force-command=cmd | 强制执行指定命令 |
no-port-forwarding | 禁止端口转发 |
no-agent-forwarding | 禁止 agent 转发 |
no-pty | 禁止分配伪终端 |
no-x11-forwarding | 禁止 X11 转发 |
no-user-rc | 禁止执行 ~/.ssh/rc |
source-address=CIDR | 限制源 IP 范围 |
ssh-copy-id —— 公钥分发
将本机公钥部署到远程主机的 ~/.ssh/authorized_keys:
bash
# 默认分发(使用默认公钥)
ssh-copy-id user@remote-host
# 指定公钥文件
ssh-copy-id -i ~/.ssh/id_ed25519.pub user@remote-host
# 指定 SSH 端口
ssh-copy-id -p 2222 user@remote-host
# 使用特定 SSH 选项
ssh-copy-id -o StrictHostKeyChecking=no user@remote-host首次执行会提示输入远程用户密码,后续即可免密登录。
手动分发(当 ssh-copy-id 不可用时):
bashcat ~/.ssh/id_ed25519.pub | ssh user@host "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"
ssh-agent / ssh-add —— 密钥代理
ssh-agent 在后台缓存已解密的私钥,避免每次连接输入密码。
启动 agent
bash
# Linux / macOS 通用
eval $(ssh-agent)
# 直接启动(前台)
ssh-agent bash # 新 shell 中启动
# macOS(10.5+ 自带 ssh-agent 且 Keychain 已集成)
# 无需手动启动,系统自动运行添加密钥
bash
# 添加默认密钥
ssh-add
# 添加指定密钥
ssh-add ~/.ssh/id_ed25519
# 设置有效期(1 小时后自动移除)
ssh-add -t 3600 ~/.ssh/id_ed25519
# 确认模式(每次使用都需手动确认)
ssh-add -c ~/.ssh/id_ed25519
# macOS:密码存储在 Keychain 中
ssh-add --apple-use-keychain ~/.ssh/id_ed25519查看与管理
bash
# 列出已加载的密钥(含指纹)
ssh-add -l
# 列出公钥
ssh-add -L
# 删除所有密钥
ssh-add -D
# 删除指定密钥
ssh-add -d ~/.ssh/id_ed25519
# 锁定/解锁 agent(需要密码)
ssh-add -x # 锁定
ssh-add -X # 解锁ssh-agent 转发风险
bash
# 通过 ssh-agent 转发在跳板场景下使用本地密钥
ssh -A user@remote安全警告:-A(Agent Forwarding)会让远程机器的 root 用户使用你的密钥认证到其他服务器。在有安全顾虑的场景,优先使用 -J(ProxyJump)跳板模式。
authorized_keys 高级配置
~/.ssh/authorized_keys 文件每行一个公钥,可在公钥前添加选项限制权限。
常用选项
text
# 限制来源 IP
from="192.168.1.0/24,10.0.0.5" ssh-ed25519 AAAAC3...
# 强制执行特定命令(忽略用户指定的命令)
command="/usr/local/bin/backup.sh" ssh-ed25519 AAAAC3...
# 禁止端口转发
no-port-forwarding,no-agent-forwarding,no-X11-forwarding \
no-pty ssh-ed25519 AAAAC3...
# 设置环境变量
environment="LANG=en_US.UTF-8" ssh-ed25519 AAAAC3...
# 限制来源 IP + 强制命令组合
from="10.0.0.2",command="/usr/local/bin/deploy.sh",no-pty ssh-ed25519 AAAAC3...完整选项列表:
| 选项 | 说明 |
|---|---|
command="cmd" | 强制执行的命令 |
from="pattern-list" | 限制来源地址 |
no-agent-forwarding | 禁止 agent 转发 |
no-port-forwarding | 禁止端口转发 |
no-pty | 禁止分配伪终端 |
no-user-rc | 禁止执行 ~/.ssh/rc |
no-X11-forwarding | 禁止 X11 转发 |
no-touch-required | 不要求 FIDO 设备触摸确认 |
verify-required | 要求 FIDO 设备用户验证 |
environment="VAR=value" | 设置环境变量 |
restrict | 禁用所有转发和 pty(快捷方式) |
注意事项
- 私钥文件权限过于宽松(组/其他人可读可写)时,
ssh会拒绝使用该密钥 - 使用
ssh-keygen -p可随时修改私钥密码(无需重新生成密钥对) - 丢失私钥密码无法恢复,必须重新生成密钥对并分发新公钥
ssh-agent会话结束后(终端关闭、重启)缓存的密钥会丢失,可配合 macOS Keychain 持久化- Ed25519 密钥在所有现代 OpenSSH 版本(≥6.5)中已广泛支持
来源
| 来源 | 链接 |
|---|---|
| OpenSSH ssh-keygen(1) 手册 | https://man.openbsd.org/ssh-keygen |
| OpenSSH ssh-agent(1) 手册 | https://man.openbsd.org/ssh-agent |
| OpenSSH ssh-add(1) 手册 | https://man.openbsd.org/ssh-add |
| sshd(8) AUTHORIZED_KEYS 格式 | https://man.openbsd.org/sshd#AUTHORIZED_KEYS |
