Linux ssh-keygen 指令

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 密钥认证基于公钥加密原理:

  1. 用户运行 ssh-keygen 生成密钥对:私钥保存在本地(如 ~/.ssh/id_rsa),公钥分发到目标服务器(如 ~/.ssh/authorized_keys)。
  2. 客户端发起 SSH 连接时,服务器使用公钥验证客户端的私钥签名。
  3. 验证通过后,建立安全连接,无需输入密码。

🛠️ 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 证书允许集中式密钥管理,适合企业环境。以下是生成用户证书的步骤:

  1. 创建 CA 密钥
ssh-keygen -t ed25519 -f ssh_ca -C "CA_key"
  1. 生成用户密钥
ssh-keygen -t ed25519 -f user_key -C "user@example.com"
  1. 用 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。
  1. 配置服务器: 将 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 在以下场景中发挥关键作用:

  1. 无密码登录:配置 SSH 密钥认证,提高效率和安全性。
  2. 自动化脚本:在 CI/CD 管道中使用密钥认证(如 GitLab、Jenkins)。
  3. 企业安全:通过 SSH 证书实现集中式访问控制。
  4. 服务器管理:为多台服务器生成和分发主机密钥。
  5. 安全研究:生成和分析密钥格式,验证加密算法。
  6. 嵌入式系统:为资源受限设备配置轻量级 Ed25519 密钥。

案例:配置 Git 仓库密钥

为 Git 仓库(如 GitHub)配置 SSH 密钥:

  1. 生成密钥:
ssh-keygen -t ed25519 -C "git@example.com" -f ~/.ssh/id_git
  1. 添加公钥到 GitHub:
cat ~/.ssh/id_git.pub

复制到 GitHub 的 SSH 密钥设置页面。

  1. 配置 SSH: 编辑 ~/.ssh/config:
Host github.com
    HostName github.com
    User git
    IdentityFile ~/.ssh/id_git
  1. 测试连接:
ssh -T git@github.com

🛑 注意事项与常见问题

  1. 私钥保护:确保私钥文件权限为 600(chmod 600 ~/.ssh/id_rsa)。
  2. 密码选择:为私钥设置强密码,或使用 SSH 代理(如 ssh-agent)。
  3. 算法选择:优先使用 Ed25519,若需兼容性则用 RSA 4096 位。
  4. 备份密钥:安全备份私钥,避免丢失。
  5. 证书有效期:定期更新 SSH 证书,避免过期。

常见问题解决:

  • 错误:Permission denied (publickey):检查公钥是否正确添加到服务器,私钥是否匹配。
  • 错误:Bad passphrase:确认输入的密码正确,或重置密码(ssh-keygen -p)。
  • 主机密钥变更:用 ssh-keygen -R 清理旧指纹。
  • 格式不兼容:使用 -m 选项转换密钥格式。

📈 总结与进阶学习

ssh-keygen 是 Linux 安全通信的基石,其功能涵盖密钥生成、管理、证书签名等多个方面。

更多技术分享,关注公众号:halugin

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值