Linux ssh-keygen 指令
在 Linux 系统中,ssh-keygen 是 OpenSSH 套件中的核心工具,用于生成、管理和转换 SSH(Secure Shell)密钥对。它广泛应用于远程服务器的认证、自动化脚本、以及安全通信的配置。无论是系统管理员、开发者,还是安全研究人员,掌握 ssh-keygen 都是提升效率和安全性的必备技能。
📚 什么是 ssh-keygen?
ssh-keygen 是一个命令行工具,用于生成 SSH 密钥对(公钥和私钥),支持多种加密算法(如 RSA、ECDSA、Ed25519)。SSH 密钥对用于在客户端和服务器之间建立安全的无密码认证,替代传统的密码登录方式。它还可以用于管理密钥、生成证书、以及转换密钥格式。
核心功能
- 生成密钥对:创建公钥和私钥,用于 SSH 认证。
- 密钥管理:修改密钥的密码、注释,或查看密钥信息。
- 格式转换:将密钥转换为不同格式(如 OpenSSH、PEM、PKCS8)。
- 证书生成:生成 SSH 用户或主机证书,用于更复杂的安全策略。
- 指纹生成:显示密钥的指纹,用于验证密钥身份。
- 签名与验证:支持对数据进行签名和验证,增强安全性。
安装与环境
ssh-keygen 通常随 OpenSSH 客户端一起安装。在大多数 Linux 发行版中,OpenSSH 已预装,可以通过以下命令确认:
ssh-keygen --version
输出示例:
ssh-keygen (OpenSSH_8.9p1, OpenSSL 3.0.2 15 Mar 2022)
若未安装,可通过包管理器安装:
# Ubuntu/Debian
sudo apt-get install openssh-client
# CentOS/RHEL
sudo yum install openssh-clients
工作原理
SSH 密钥认证基于公钥加密原理:
- 用户运行 ssh-keygen 生成密钥对:私钥保存在本地(如 ~/.ssh/id_rsa),公钥分发到目标服务器(如 ~/.ssh/authorized_keys)。
- 客户端发起 SSH 连接时,服务器使用公钥验证客户端的私钥签名。
- 验证通过后,建立安全连接,无需输入密码。
🛠️ ssh-keygen 常用选项详解
ssh-keygen 提供了丰富的选项,以下是常用的选项及其功能:
- -t :指定密钥类型(如 rsa、ecdsa、ed25519)。
- -b :指定密钥长度(如 2048、4096 适用于 RSA)。
- -f :指定输出文件名(默认 ~/.ssh/id_)。
- -C :为密钥添加注释(如用户名或邮箱)。
- -N :为私钥设置密码(为空则无密码)。
- -p:更改现有私钥的密码。
- -l:显示密钥的指纹。
- -y:从私钥输出公钥。
- -o:使用新格式(OpenSSH 格式,增强安全性)。
- -a :指定 KDF(密钥派生函数)轮数,增强密码保护。
- -R :从 known_hosts 文件中移除指定主机的条目。
- -I :指定证书的身份标识。
- -s <ca_key>:指定 CA 密钥用于签名证书。
- -V :设置证书有效期(如 +1w 表示一周)。
- -q:安静模式,减少输出。
常用密钥类型
- RSA:传统算法,兼容性好,默认长度 3072 位,推荐 4096 位。
- ECDSA:基于椭圆曲线的算法,效率高,但安全性依赖曲线选择。
- Ed25519:现代算法,速度快、安全性高、密钥短,推荐使用。
📖 基础示例:快速上手 ssh-keygen
以下通过具体示例展示 ssh-keygen 的基本用法,帮助读者快速入门。
示例 1:生成 RSA 密钥对
生成一个 4096 位的 RSA 密钥对:
ssh-keygen -t rsa -b 4096 -C "user@example.com"
输出示例:
Generating public/private rsa key pair.
Enter file in which to save the key (/home/user/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/user/.ssh/id_rsa
Your public key has been saved in /home/user/.ssh/id_rsa.pub
The key fingerprint is:
SHA256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx user@example.com
解释:
- -t rsa 指定 RSA 算法。
- -b 4096 设置密钥长度。
- -C 添加注释,方便识别。
- 生成文件:id_rsa(私钥)、id_rsa.pub(公钥)。
将公钥添加到远程服务器:
ssh-copy-id user@remote_host
或手动复制:
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
示例 2:生成 Ed25519 密钥对
生成 Ed25519 密钥(推荐,效率高):
ssh-keygen -t ed25519 -C "user@example.com"
输出示例:
Generating public/private ed25519 key pair.
Enter file in which to save the key (/home/user/.ssh/id_ed25519):
Enter passphrase (empty for no passphrase):
Your identification has been saved in /home/user/.ssh/id_ed25519
Your public key has been saved in /home/user/.ssh/id_ed25519.pub
解释:
- Ed25519 密钥长度固定,无需指定 -b。
- 比 RSA 更快、更安全。
示例 3:查看密钥指纹
检查密钥的指纹以验证身份:
ssh-keygen -l -f ~/.ssh/id_rsa
输出示例:
4096 SHA256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx user@example.com (RSA)
解释:
- -l 显示指纹。
- 指纹用于确认密钥一致性。
示例 4:更改私钥密码
为现有私钥添加或修改密码:
ssh-keygen -p -f ~/.ssh/id_rsa
输出示例:
Enter old passphrase:
Enter new passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved with the new passphrase.
解释:
- -p 用于更改密码。
- 提高私钥安全性。
示例 5:从私钥提取公钥
若公钥丢失,可从私钥生成:
ssh-keygen -y -f ~/.ssh/id_rsa
输出示例:
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQD... user@example.com
解释:
- -y 输出公钥。
- 需要输入私钥密码(若有)。
🔍 高级用法:深入探索 ssh-keygen
掌握基础用法后,我们可以利用 ssh-keygen 的高级功能进行更复杂的任务。以下是几种高级用法的详细介绍。
🌟 高级用法 1:生成 SSH 证书
SSH 证书允许集中式密钥管理,适合企业环境。以下是生成用户证书的步骤:
- 创建 CA 密钥:
ssh-keygen -t ed25519 -f ssh_ca -C "CA_key"
- 生成用户密钥:
ssh-keygen -t ed25519 -f user_key -C "user@example.com"
- 用 CA 签名用户公钥:
ssh-keygen -s ssh_ca -I user_id -n user -V +1w user_key.pub
输出示例:
Signed user key user_key-cert.pub: id "user_id" serial 0 for user valid from 2025-06-19T18:00:00 to 2025-06-26T18:00:00
解释:
- -s 指定 CA 私钥。
- -I 设置证书标识。
- -n 指定用户名。
- -V +1w 设置一周有效期。
- 生成 user_key-cert.pub。
- 配置服务器: 将 CA 公钥添加到服务器的 /etc/ssh/sshd_config:
TrustedUserCAKeys /etc/ssh/ca.pub
客户端使用证书登录:
ssh -i user_key -i user_key-cert.pub user@server
🌟 高级用法 2:转换密钥格式
将 OpenSSH 私钥转换为 PEM 格式:
ssh-keygen -e -f ~/.ssh/id_rsa -m PEM > id_rsa.pem
解释:
- -e 导出密钥。
- -m PEM 指定 PEM 格式。
- 适用于与非 OpenSSH 工具(如 OpenSSL)交互。
反向转换(PEM 到 OpenSSH):
ssh-keygen -i -f id_rsa.pem > id_rsa_openssh
解释:
- -i 导入密钥。
🌟 高级用法 3:生成主机密钥
为 SSH 服务器生成主机密钥:
sudo ssh-keygen -t ed25519 -f /etc/ssh/ssh_host_ed25519_key -N ""
解释:
- -N “” 无密码。
- 更新 /etc/ssh/sshd_config 并重启 sshd:
sudo systemctl restart sshd
🌟 高级用法 4:批量生成密钥
在脚本中批量生成密钥:
#!/bin/bash
for user in user1 user2 user3; do
ssh-keygen -t ed25519 -f ~/.ssh/id_ed25519_${user} -C "${user}@example.com" -N ""
ssh-copy-id -i ~/.ssh/id_ed25519_${user}.pub ${user}@remote_host
done
解释:
- 自动化为多个用户生成密钥并分发。
- 适合大规模部署。
🌟 高级用法 5:签名和验证数据
使用密钥对数据签名:
echo "Hello, World!" > data.txt
ssh-keygen -Y sign -f ~/.ssh/id_ed25519 -n file data.txt
输出示例:
Signature saved to data.txt.sig
验证签名:
ssh-keygen -Y verify -f ~/.ssh/id_ed25519.pub -n file -I user@example.com -s data.txt.sig < data.txt
解释:
- -Y sign 生成签名。
- -Y verify 验证签名。
- 适用于验证文件完整性。
🌟 高级用法 6:管理 known_hosts
移除特定主机的指纹:
ssh-keygen -R remote_host
解释:
- -R 从 ~/.ssh/known_hosts 删除条目。
- 解决主机密钥变更问题。
⚙️ 实际应用场景
ssh-keygen 在以下场景中发挥关键作用:
- 无密码登录:配置 SSH 密钥认证,提高效率和安全性。
- 自动化脚本:在 CI/CD 管道中使用密钥认证(如 GitLab、Jenkins)。
- 企业安全:通过 SSH 证书实现集中式访问控制。
- 服务器管理:为多台服务器生成和分发主机密钥。
- 安全研究:生成和分析密钥格式,验证加密算法。
- 嵌入式系统:为资源受限设备配置轻量级 Ed25519 密钥。
案例:配置 Git 仓库密钥
为 Git 仓库(如 GitHub)配置 SSH 密钥:
- 生成密钥:
ssh-keygen -t ed25519 -C "git@example.com" -f ~/.ssh/id_git
- 添加公钥到 GitHub:
cat ~/.ssh/id_git.pub
复制到 GitHub 的 SSH 密钥设置页面。
- 配置 SSH: 编辑 ~/.ssh/config:
Host github.com
HostName github.com
User git
IdentityFile ~/.ssh/id_git
- 测试连接:
ssh -T git@github.com
🛑 注意事项与常见问题
- 私钥保护:确保私钥文件权限为 600(chmod 600 ~/.ssh/id_rsa)。
- 密码选择:为私钥设置强密码,或使用 SSH 代理(如 ssh-agent)。
- 算法选择:优先使用 Ed25519,若需兼容性则用 RSA 4096 位。
- 备份密钥:安全备份私钥,避免丢失。
- 证书有效期:定期更新 SSH 证书,避免过期。
常见问题解决:
- 错误:Permission denied (publickey):检查公钥是否正确添加到服务器,私钥是否匹配。
- 错误:Bad passphrase:确认输入的密码正确,或重置密码(ssh-keygen -p)。
- 主机密钥变更:用 ssh-keygen -R 清理旧指纹。
- 格式不兼容:使用 -m 选项转换密钥格式。
📈 总结与进阶学习
ssh-keygen 是 Linux 安全通信的基石,其功能涵盖密钥生成、管理、证书签名等多个方面。
2473

被折叠的 条评论
为什么被折叠?



