前置知识: 网络安全

SSH 密钥管理

2 min入门

SSH 密钥实战:ed25519 密钥生成、authorized_keys 管理与权限加固、ssh-agent 转发、SSH 证书与跳板机

ssh-keygen 密钥生成

基本写法:生成 RSA 密钥 ssh-keygen -t rsa -b <位数>

# 生成 4096 位 RSA 密钥
ssh-keygen -t rsa -b 4096

基本写法:生成 Ed25519 密钥 ssh-keygen -t ed25519

# 生成 Ed25519 密钥(推荐)
ssh-keygen -t ed25519 -C "user@example.com"

基本写法:生成 ECDSA 密钥 ssh-keygen -t ecdsa -b <位数>

# 生成 521 位 ECDSA 密钥
ssh-keygen -t ecdsa -b 521

基本写法:指定密钥文件名 ssh-keygen -f <文件名>

# 指定密钥文件路径
ssh-keygen -t ed25519 -f ~/.ssh/deploy_key

基本写法:生成无密码密钥 ssh-keygen -t rsa -N ""

# 生成无密码的密钥(用于自动化)
ssh-keygen -t rsa -b 4096 -N "" -f ~/.ssh/auto_key

基本写法:添加注释 ssh-keygen -t ed25519 -C "<注释>"

# 添加注释标识密钥用途
ssh-keygen -t ed25519 -C "production-deploy-2026"

密钥管理

基本写法:查看密钥指纹 ssh-keygen -l -f <公钥>

# 查看公钥指纹
ssh-keygen -l -f ~/.ssh/id_rsa.pub

基本写法:查看密钥指纹(SHA256) ssh-keygen -l -E sha256 -f <公钥>

# 查看 SHA256 格式指纹
ssh-keygen -l -E sha256 -f ~/.ssh/id_rsa.pub

基本写法:查看密钥图形指纹 ssh-keygen -l -v -f <公钥>

# 查看随机图形指纹
ssh-keygen -l -v -f ~/.ssh/id_rsa.pub

基本写法:修改密钥密码 ssh-keygen -p -f <私钥>

# 修改私钥的密码
ssh-keygen -p -f ~/.ssh/id_rsa

基本写法:移除密钥密码 ssh-keygen -p -N "" -f <私钥>

# 移除私钥密码
ssh-keygen -p -N "" -f ~/.ssh/id_rsa

密钥转换与导出

基本写法:从私钥提取公钥 ssh-keygen -y -f <私钥>

# 从私钥提取公钥
ssh-keygen -y -f ~/.ssh/id_rsa > ~/.ssh/id_rsa.pub

基本写法:转换密钥格式 ssh-keygen -p -m PEM -f <私钥>

# 将密钥转换为 PEM 格式
ssh-keygen -p -m PEM -f ~/.ssh/id_rsa

基本写法:生成 RFC4716 格式公钥 ssh-keygen -e -m RFC4716 -f <公钥>

# 转换为 RFC4716 格式
ssh-keygen -e -m RFC4716 -f ~/.ssh/id_rsa.pub

基本写法:从 RFC4716 转换回 OpenSSH ssh-keygen -i -m RFC4716 -f <文件>

# 从 RFC4716 格式导入
ssh-keygen -i -m RFC4716 -f public.key

ssh-copy-id 部署公钥

基本写法:复制公钥到远程 ssh-copy-id <用户>@<主机>

# 部署公钥到远程主机
ssh-copy-id user@192.168.1.1

基本写法:指定公钥文件 ssh-copy-id -i <公钥> <用户>@<主机>

# 指定公钥文件部署
ssh-copy-id -i ~/.ssh/my_key.pub user@192.168.1.1

基本写法:指定端口 ssh-copy-id -p <端口> <用户>@<主机>

# 指定 SSH 端口
ssh-copy-id -p 2222 user@192.168.1.1

基本写法:指定 SSH 选项 ssh-copy-id -o "<选项>" <用户>@<主机>

# 传递 SSH 选项
ssh-copy-id -o "StrictHostKeyChecking=no" user@192.168.1.1

known_hosts 管理

基本写法:查看 known_hosts cat ~/.ssh/known_hosts

# 查看 known_hosts 文件内容
cat ~/.ssh/known_hosts

基本写法:删除主机记录 ssh-keygen -R <主机>

# 删除指定主机的记录
ssh-keygen -R 192.168.1.1

基本写法:查看主机指纹 ssh-keygen -F <主机>

# 查看 known_hosts 中主机的指纹
ssh-keygen -F 192.168.1.1

基本写法:哈希 known_hosts ssh-keygen -H

# 哈希 known_hosts 文件中的主机名
ssh-keygen -H -f ~/.ssh/known_hosts

基本写法:验证主机密钥 ssh-keygen -F <主机> -l

# 查看主机密钥指纹
ssh-keygen -F github.com -l

ssh-agent 代理

基本写法:启动 ssh-agent eval $(ssh-agent)

# 启动 ssh-agent
eval $(ssh-agent)

基本写法:添加密钥到 agent ssh-add <私钥>

# 添加私钥到 agent
ssh-add ~/.ssh/id_rsa

基本写法:添加所有默认密钥 ssh-add

# 添加默认密钥
ssh-add

基本写法:列出已添加的密钥 ssh-add -l

# 列出 agent 中的密钥指纹
ssh-add -l

基本写法:列出密钥公钥 ssh-add -L

# 列出 agent 中的密钥公钥
ssh-add -L

基本写法:删除指定密钥 ssh-add -d <私钥>

# 从 agent 中删除密钥
ssh-add -d ~/.ssh/id_rsa

基本写法:删除所有密钥 ssh-add -D

# 清空 agent 中所有密钥
ssh-add -D

基本写法:锁定 agent ssh-add -x

# 用密码锁定 agent
ssh-add -x

基本写法:解锁 agent ssh-add -X

# 解锁 agent
ssh-add -X

SSH 配置文件

基本写法:配置主机别名

`Host <别名>
    HostName <主机>
    User <用户>
    Port <端口>
    IdentityFile <私钥>`
# SSH 配置文件 ~/.ssh/config
Host prod
    HostName 192.168.1.100
    User deploy
    Port 22
    IdentityFile ~/.ssh/prod_key

基本写法:通配符配置

`Host *.<域名>
    User <用户>
    IdentityFile <私钥>`
# 配置所有 *.example.com 主机
Host *.example.com
    User admin
    IdentityFile ~/.ssh/work_key

基本写法:安全配置

`Host *
    ServerAliveInterval <秒数>
    ServerAliveCountMax <次数>
    StrictHostKeyChecking <yes/no>`
# 全局安全配置
Host *
    ServerAliveInterval 60
    ServerAliveCountMax 3
    StrictHostKeyChecking yes

证书认证

基本写法:生成 CA 密钥 ssh-keygen -t ed25519 -f <CA密钥>

# 生成 SSH CA 密钥
ssh-keygen -t ed25519 -f ~/.ssh/ca_key

基本写法:签名用户公钥 ssh-keygen -s <CA密钥> -I <标识> -n <用户> <用户公钥>

# 用 CA 签名用户公钥
ssh-keygen -s ~/.ssh/ca_key -I user_alice -n alice ~/.ssh/alice.pub

基本写法:签名主机密钥 ssh-keygen -s <CA密钥> -I <标识> -h -n <主机名> <主机公钥>

# 用 CA 签名主机密钥
ssh-keygen -s ~/.ssh/ca_key -I host_server1 -h -n server1.example.com /etc/ssh/ssh_host_ed25519_key.pub

基本写法:信任 CA # /etc/ssh/sshd_config

# 配置服务器信任 CA
echo "TrustedUserCAKeys /etc/ssh/ca_key.pub" >> /etc/ssh/sshd_config
systemctl restart sshd

安全最佳实践

基本写法:禁用密码登录 # /etc/ssh/sshd_config

# 禁用密码认证只允许密钥
sed -i 's/#PasswordAuthentication.*/PasswordAuthentication no/' /etc/ssh/sshd_config
systemctl restart sshd

基本写法:禁止 root 登录 # /etc/ssh/sshd_config

# 禁止 root 直接登录
sed -i 's/#PermitRootLogin.*/PermitRootLogin no/' /etc/ssh/sshd_config
systemctl restart sshd

基本写法:限制登录尝试 # /etc/ssh/sshd_config

# 限制最大认证尝试次数
echo "MaxAuthTries 3" >> /etc/ssh/sshd_config
systemctl restart sshd

基本写法:限制用户组 # /etc/ssh/sshd_config

# 只允许特定组登录
echo "AllowGroups ssh-users" >> /etc/ssh/sshd_config
systemctl restart sshd

基本写法:设置登录宽限时间 # /etc/ssh/sshd_config

# 设置登录宽限时间 30 秒
echo "LoginGraceTime 30" >> /etc/ssh/sshd_config
systemctl restart sshd