Skip to content

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-agenteval $(ssh-agent)
添加密钥到 agentssh-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_hostsssh-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依赖系统随机数质量
RSA3072 位传统方案,需足够位长
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 roundsKDF 轮数(默认 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 不可用时):

bash
cat ~/.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