ssh-keygen
详解
ssh-keygen
生成公私两钥, 私钥放在连接发起机, 公钥放在被连接机的被连接用户的用户文件夹的 .ssh
文件夹的 authorized_keys
文件中
authorized_keys
可放多个公钥, 每个公钥占用一行
模板
ssh-keygen -t ed25519 -C "comment注释" -f '~/.ssh/文件夹必须已存在/密钥名'
密钥名会生成 密钥名 和 密钥名.pub 两个文件, 分别是私钥和公钥
ssh-keygen -t ed25519 -C "user@host" -f "~/.ssh/id_ed25519-250703_135244"
### 会在当前文件夹生成 hello(私钥) 和 hello.pub(公钥) 两个文件
ssh-keygen -t ed25519 -C 'comment' -f 'hello'
### 没有 -f 会询问路径
ssh-keygen -t ed25519 -C 'comment'
### 没有 -C(大写C) 会自动添加注释: user@host(生成key的用户名@生成key的主机名)
ssh-keygen -t ed25519
### 没有 -t , 什么参数都没有也能用, 版本7后默认ed25519算法
ssh-keygen
### 单独 ssh-keygen 相当于
ssh-keygen -t ed25519 -C "用户名@生成所使用的主机名" -f ~/.ssh/id_ed25519(会询问)
用于 Bash 的模板
在当前文件夹,创建一个与key同名的文件夹,来放生成的key
### 在当前文件夹,创建一个与key同名的文件夹,来放生成的key
TempName='id_ed25519-250703_153038'
mkdir -p ${TempName}
ssh-keygen -t ed25519 -C 'user@host' -f "./${TempName}/${TempName}"
cd "./${TempName}" ### 然后进入生成的文件夹
用于 PowerShell 的模板
在当前文件夹,创建一个与key同名的文件夹,来放生成的key , 与bash模板的差异就是定义赋值变量时前面加了$
号
### 在当前文件夹,创建一个与key同名的文件夹,来放生成的key
$TempName='id_ed25519-250703_153038'
mkdir -p ${TempName}
ssh-keygen -t ed25519 -C 'user@host' -f "./${TempName}/${TempName}"
cd "./${TempName}" ### 然后进入生成的文件夹
常用参数 -t
, -b
, -C
, -f
参数可以都省略
单独的 ssh-keygen
一般相当于 ssh-keygen -t ed25519 -C "用户名@生成所使用的主机名" -f ~/.ssh/id_ed25519(会询问)
ssh-keygen
### 相当于
ssh-keygen -t ed25519 -C "用户名@生成所使用的主机名" -f ~/.ssh/id_ed25519(会询问)
参数 | 作用 | 示例 |
---|---|---|
-t | 指定密钥类型(rsa/ecdsa/ed25519)一般默认值就是ed25519 可不指定-t | ssh-keygen -t ed25519 |
-b | 设置密钥长度(RSA 推荐 ≥3072 位)ed25519 长度固定,用不上-b | ssh-keygen -t rsa -b 4096 |
-C | 添加注释(如邮箱或用途) | ssh-keygen -C "user@example.com" |
-f | 指定密钥保存路径 | ssh-keygen -f ~/.ssh/custom_key |
-
-t <密钥类型>
- 指定密钥算法类型,常用值:
rsa
(默认,兼容性好)ed25519
(更安全高效)ecdsa
(椭圆曲线算法)
- 示例:
ssh-keygen -t ed25519
- 指定密钥算法类型,常用值:
-
-b <密钥长度>
- 设置密钥的位数(仅对 RSA/ECDSA 有效 ,
ed25519
长度固定,用不上-b
):- RSA 推荐 4096 位:
-b 4096
- ECDSA 推荐 384 位:
-b 384
- RSA 推荐 4096 位:
- 示例:
ssh-keygen -t rsa -b 4096
- 设置密钥的位数(仅对 RSA/ECDSA 有效 ,
-
-C "<注释>"
- 添加密钥注释(通常用邮箱标识所有者)
- 示例:
ssh-keygen -C "your_email@example.com"
-
-f "<文件路径>"
- 指定密钥保存路径和文件名(管理多密钥必备)
- 示例:
ssh-keygen -f ~/.ssh/github_key # 生成私钥 github_key 和公钥 github_key.pub
更多参数
usage: ssh-keygen [-q] [-a rounds] [-b bits] [-C comment] [-f output_keyfile]
[-m format] [-N new_passphrase] [-O option]
[-t dsa | ecdsa | ecdsa-sk | ed25519 | ed25519-sk | rsa]
[-w provider] [-Z cipher]
ssh-keygen -p [-a rounds] [-f keyfile] [-m format] [-N new_passphrase]
[-P old_passphrase] [-Z cipher]
ssh-keygen -i [-f input_keyfile] [-m key_format]
ssh-keygen -e [-f input_keyfile] [-m key_format]
ssh-keygen -y [-f input_keyfile]
ssh-keygen -c [-a rounds] [-C comment] [-f keyfile] [-P passphrase]
ssh-keygen -l [-v] [-E fingerprint_hash] [-f input_keyfile]
ssh-keygen -B [-f input_keyfile]
ssh-keygen -D pkcs11
ssh-keygen -F hostname [-lv] [-f known_hosts_file]
ssh-keygen -H [-f known_hosts_file]
ssh-keygen -K [-a rounds] [-w provider]
ssh-keygen -R hostname [-f known_hosts_file]
ssh-keygen -r hostname [-g] [-f input_keyfile]
ssh-keygen -M generate [-O option] output_file
ssh-keygen -M screen [-f input_file] [-O option] output_file
ssh-keygen -I certificate_identity -s ca_key [-hU] [-D pkcs11_provider]
[-n principals] [-O option] [-V validity_interval]
[-z serial_number] file ...
ssh-keygen -L [-f input_keyfile]
ssh-keygen -A [-a rounds] [-f prefix_path]
ssh-keygen -k -f krl_file [-u] [-s ca_public] [-z version_number]
file ...
ssh-keygen -Q [-l] -f krl_file [file ...]
ssh-keygen -Y find-principals -s signature_file -f allowed_signers_file
ssh-keygen -Y check-novalidate -n namespace -s signature_file
ssh-keygen -Y sign -f key_file -n namespace file ...
ssh-keygen -Y verify -f allowed_signers_file -I signer_identity
-n namespace -s signature_file [-r revocation_file]
选项 | 功能描述 |
---|---|
-t | 指定密钥类型:rsa 、ed25519 、ecdsa 、dsa (不推荐) |
-b | 指定密钥长度(如 RSA 推荐 2048/4096,ED25519 固定 256 无需指定) |
-C | 添加注释(通常为邮箱,如 user@example.com ) |
-f | 指定密钥文件保存路径(默认 ~/.ssh/id_* ) |
-N | 设置私钥密码(空字符串 '' 表示无密码) |
-P | 更改现有私钥密码 |
-q | 安静模式,不显示进度信息 |
-y | 从私钥提取公钥内容 |
-l | 显示密钥指纹(用于验证服务器身份) |
-F | 在 known_hosts 文件中查找主机密钥(用于清理旧指纹) |
-R | 从 known_hosts 文件中删除指定主机的密钥(用于修复 MITM 攻击警告) |
参数分类一
一、密钥生成参数
1. -t
:指定密钥类型
ssh-keygen -t ed25519 # 推荐:现代椭圆曲线算法(2013年)
ssh-keygen -t rsa -b 4096 # 兼容:RSA算法,指定4096位长度
ssh-keygen -t ecdsa -b 521 # 椭圆曲线DSA,可选256/384/521位
ssh-keygen -t dsa # 不推荐:DSA算法(已被弃用,<=1024位)
- 推荐配置:优先使用
ed25519
,RSA 仅用于兼容旧系统
2. -b
:指定密钥长度(比特位)
ssh-keygen -t rsa -b 4096 # RSA推荐至少2048位,敏感系统用4096位
ssh-keygen -t ecdsa -b 521 # ECDSA可选256/384/521位(521位安全性最高)
# ed25519无需指定-b,固定256位安全强度
- 安全建议:RSA 低于 2048 位存在安全风险(如 1024 位已被破解)
3. -f
:指定密钥文件路径
ssh-keygen -f ~/.ssh/custom_key # 保存到自定义路径
ssh-keygen -f /etc/ssh/ssh_host_rsa_key # 系统主机密钥路径
- 注意:私钥文件(如
custom_key
)需严格权限控制(chmod 600
)
4. -C
:添加注释(Comment)
ssh-keygen -C "admin@example.com" # 公钥中嵌入邮箱注释
ssh-keygen -C "web-server-prod" # 用于标识服务器用途的注释
- 用途:在
~/.ssh/authorized_keys
中便于识别不同密钥用途
5. -N
:设置私钥密码(Passphrase)
ssh-keygen -N 'strong_password' -f ~/.ssh/secure_key # 设置密码
ssh-keygen -N '' -f /tmp/automation_key # 无密码(自动化场景)
- 安全建议:始终为私钥设置强密码,无密码密钥仅限自动化脚本使用
二、密钥管理参数
1. -P
:修改现有私钥密码
ssh-keygen -P 'new_password' -f ~/.ssh/id_rsa # 修改密码
ssh-keygen -P '' -f ~/.ssh/id_rsa # 移除密码(谨慎操作)
- 操作步骤:会先要求输入旧密码,再设置新密码
2. -y
:从私钥提取公钥
ssh-keygen -y -f ~/.ssh/id_rsa > ~/.ssh/id_rsa.pub # 重建公钥
ssh-keygen -y -f /etc/ssh/ssh_host_ed25519_key # 查看主机公钥内容
- 应用场景:公钥文件丢失时,可通过私钥重新生成公钥
3. -l
:显示密钥指纹(Fingerprint)
ssh-keygen -l -f ~/.ssh/id_ed25519.pub # 显示SHA256指纹
ssh-keygen -l -E md5 -f ~/.ssh/id_rsa.pub # 显示MD5指纹(兼容旧系统)
- 输出示例:
256 SHA256:XXXXXXXX... user@host (ED25519)
4. -B
:显示密钥的 Bubble Babble 编码
ssh-keygen -B -f ~/.ssh/id_rsa.pub
# 输出类似:xexax-wofyr-ludak-sonax-gixex
- 用途:便于人类记忆和口头传递密钥验证信息
三、高级功能参数
1. -A
:自动生成所有类型的主机密钥
sudo ssh-keygen -A # 为SSH服务生成所有支持的主机密钥
# 等效于生成ed25519、rsa、ecdsa等类型的主机密钥
- 应用场景:新安装SSH服务后初始化主机密钥
2. -T
:测试密钥的安全性
ssh-keygen -t rsa -b 2048 -f test_key
ssh-keygen -T /dev/stdout -f test_key # 测试密钥抗暴力破解能力
- 输出:显示密钥在不同攻击模型下的估计破解时间
3. -c
:修改密钥注释
ssh-keygen -c -C "new_comment@example.com" -f ~/.ssh/id_rsa
- 注意:仅修改公钥中的注释字段,不影响密钥对本身
4. -F
:在 known_hosts
中查找主机
ssh-keygen -F example.com # 查找example.com的主机密钥
ssh-keygen -F 192.168.1.1 # 按IP查找
- 输出:显示匹配的主机密钥条目或
# not found
5. -R
:从 known_hosts
删除主机密钥
ssh-keygen -R example.com # 删除旧的/错误的主机密钥
- 场景:当服务器重装系统后,需要清除本地缓存的旧指纹
四、证书相关参数(SSH CA)
1. -s
:使用 CA 签署用户/主机证书
# 签署用户证书
ssh-keygen -s /path/to/ca_key -I user_id -n username -V +52w user_key.pub
# 签署主机证书
ssh-keygen -s /path/to/ca_key -h -I server_id -n server1,server2 -V +1y host_key.pub
- 参数说明:
-I
:证书标识符(唯一ID)-n
:允许的用户名/主机名(逗号分隔)-V
:有效期(如+52w
表示52周)-h
:签署主机证书(而非用户证书)
2. -L
:查看证书详情
ssh-keygen -L -f user_key-cert.pub # 查看证书信息
- 输出:显示证书有效期、主体、权限等详细信息
五、格式转换参数
1. -p
:更改密钥格式(OpenSSH/PuTTY)
# OpenSSH私钥 → PuTTY (.ppk) 格式(需putty-tools)
puttygen ~/.ssh/id_rsa -o id_rsa.ppk
# PuTTY → OpenSSH格式
puttygen id_rsa.ppk -O private-openssh -o ~/.ssh/id_rsa
- 应用场景:在 Windows(PuTTY)和 Linux 之间迁移密钥
2. -m
:指定密钥格式
ssh-keygen -m PEM -f rsa_key # 生成PEM格式密钥(兼容OpenSSL)
- 常见格式:
RFC4716
(OpenSSH默认)、PEM
(OpenSSL)
六、其他实用参数
1. -q
:安静模式(不显示进度信息)
ssh-keygen -q -t ed25519 -f /tmp/auto_key -N '' # 脚本自动化
2. -v
:详细模式(显示生成过程)
ssh-keygen -v -t rsa -b 4096 # 调试模式,显示密钥生成细节
3. --version
:显示版本信息
ssh-keygen --version # 查看OpenSSH版本
参数分类二
核心参数
参数 | 描述 | 示例 |
---|---|---|
-t | 指定密钥类型 | ssh-keygen -t ed25519 ssh-keygen -t rsa |
-b | 设置密钥长度(比特) | ssh-keygen -b 4096 (RSA默认3072) |
-f | 指定密钥文件路径 | ssh-keygen -f ~/.ssh/github_key |
-C | 添加密钥注释 | ssh-keygen -C "user@example.com" |
-N | 设置新密码 | ssh-keygen -N "new_passphrase" |
-P | 提供旧密码(用于修改) | ssh-keygen -p -P "old_pass" -N "new_pass" |
密钥管理
参数 | 描述 | 示例 |
---|---|---|
-p | 修改私钥密码 | ssh-keygen -p -f id_rsa |
-y | 从私钥生成公钥 | ssh-keygen -y -f id_rsa > key.pub |
-c | 修改密钥注释 | ssh-keygen -c -C "new_comment" -f id_rsa |
-e | 导出密钥(格式转换) | ssh-keygen -e -m PEM -f key.pub |
-i | 导入密钥 | ssh-keygen -i -f imported_key |
安全增强
参数 | 描述 | 示例 |
---|---|---|
-a | KDF轮数(增强密码防护) | ssh-keygen -t ed25519 -a 100 |
-Z | 指定加密算法 | ssh-keygen -Z aes256-ctr |
-O | 设置密钥选项 | ssh-keygen -O clear (清除密码)ssh-keygen -O no-touch-required (YubiKey) |
密钥验证
参数 | 描述 | 示例 |
---|---|---|
-l | 显示密钥指纹 | ssh-keygen -l -f id_rsa.pub |
-E | 指定指纹算法 | ssh-keygen -l -E md5 -f id_rsa |
-B | 显示Bubble Babble指纹 | ssh-keygen -B -f id_ed25519 |
-v | 详细模式(显示ASCII艺术) | ssh-keygen -lv -f key.pub |
主机密钥管理
参数 | 描述 | 示例 |
---|---|---|
-R | 删除known_hosts 中的主机 | ssh-keygen -R github.com |
-F | 查找主机密钥 | ssh-keygen -F github.com |
-H | 哈希处理known_hosts | ssh-keygen -H |
高级操作
参数 | 描述 | 示例 |
---|---|---|
-q | 静默模式 | ssh-keygen -q -t rsa -N "" |
-m | 指定密钥格式 | ssh-keygen -m PEM -f key |
-r | 生成DNS记录(SSHFP) | ssh-keygen -r host.example.com |
-s | 使用CA签发证书 | ssh-keygen -s ca_key -I ID user_key.pub |
特殊用途
参数 | 描述 | 示例 |
---|---|---|
-D | PKCS#11库路径 | ssh-keygen -D /usr/lib/libpkcs11.so |
-U | 添加密钥到代理 | ssh-keygen -U -f id_ed25519 |
-Y | 签名/验证操作 | ssh-keygen -Y sign -f key -n file data |
1️⃣ 参考 1
ssh-keygen
是 OpenSSH 工具套件中的核心命令,用于生成、管理和转换 SSH 密钥对(公钥 + 私钥)。它是实现 SSH 无密码登录、安全认证的基础工具。以下是详细解析:
核心功能
- 生成密钥对
创建用于 SSH 身份认证的非对称密钥(默认 RSA 类型)。 - 管理密钥属性
修改密钥注释、密码、类型等。 - 转换密钥格式
在不同密钥格式(如 PEM/PKCS8)间转换。 - 提取指纹信息
验证密钥的唯一性和完整性。
常用命令详解
1. 生成密钥对(基础用法)
ssh-keygen
- 交互式流程:
- 密钥保存路径(默认
~/.ssh/id_rsa
)。 - 设置密钥密码(Passphrase,可为空)。
- 生成两个文件:
- 私钥:
~/.ssh/id_rsa
(权限需为600
) - 公钥:
~/.ssh/id_rsa.pub
(内容可公开)
- 私钥:
- 密钥保存路径(默认
2. 指定密钥类型和长度
ssh-keygen -t ed25519 -a 100 # 推荐:Ed25519 算法(更安全高效)
ssh-keygen -t rsa -b 4096 # RSA 算法,密钥长度 4096 位
ssh-keygen -t ecdsa -b 384 # ECDSA 算法,384 位长度
-t
:密钥类型(ed25519
/rsa
/ecdsa
/dsa
)。-b
:密钥长度(RSA 建议 ≥2048,ECDSA 可选 256/384/521)。-a
:KDF 轮数(增加暴力破解难度)。
3. 自定义密钥路径和注释
ssh-keygen -f ~/.ssh/my_key -C "my@email.com"
-f
:指定密钥保存路径(生成my_key
和my_key.pub
)。-C
:添加/修改密钥注释(通常为邮箱或标识)。
4. 管理密钥密码
ssh-keygen -p -f ~/.ssh/id_rsa # 修改私钥密码
ssh-keygen -y -f ~/.ssh/id_rsa > key.pub # 从私钥导出公钥
-p
:修改私钥密码(需输入旧密码)。-y
:根据私钥生成对应公钥。
5. 查看密钥信息
ssh-keygen -l -f ~/.ssh/id_rsa.pub # 显示公钥指纹(SHA256)
ssh-keygen -l -E md5 -f id_rsa.pub # 显示 MD5 格式指纹(兼容旧系统)
-l
:显示密钥指纹。-E
:指定指纹哈希算法(md5
/sha256
)。
6. 转换密钥格式
ssh-keygen -p -m PEM -f key.ppk # 将密钥转为 PEM 格式
-m
:指定目标格式(如PEM
/RFC4716
/PKCS8
)。
7. 删除主机密钥(慎用!)
ssh-keygen -R example.com # 清除 known_hosts 中某主机的旧密钥
-R
:从~/.ssh/known_hosts
中删除指定主机的记录。
安全最佳实践
- 优先使用 Ed25519
比 RSA 更安全高效,且密钥更短(推荐默认选择)。 - 设置强密码(Passphrase)
即使私钥泄露,密码可增加破解难度。 - 密钥权限管理
chmod 600 ~/.ssh/id_ed25519 # 私钥必须限制权限 chmod 644 ~/.ssh/id_ed25519.pub # 公钥可放宽
- 备份密钥
私钥一旦丢失无法恢复!
典型使用场景
- SSH 无密码登录
将公钥上传至服务器:ssh-copy-id -i ~/.ssh/id_ed25519.pub user@host
- Git 仓库认证
将公钥添加到 GitHub/GitLab 的 SSH Keys 设置。 - 自动化脚本认证
用密钥替代密码执行远程命令(如rsync
、scp
)。
以下是 ssh-keygen
参数详解,涵盖所有主要选项及其应用场景:
核心参数
参数 | 描述 | 示例 |
---|---|---|
-t | 指定密钥类型 | ssh-keygen -t ed25519 ssh-keygen -t rsa |
-b | 设置密钥长度(比特) | ssh-keygen -b 4096 (RSA默认3072) |
-f | 指定密钥文件路径 | ssh-keygen -f ~/.ssh/github_key |
-C | 添加密钥注释 | ssh-keygen -C "user@example.com" |
-N | 设置新密码 | ssh-keygen -N "new_passphrase" |
-P | 提供旧密码(用于修改) | ssh-keygen -p -P "old_pass" -N "new_pass" |
密钥管理
参数 | 描述 | 示例 |
---|---|---|
-p | 修改私钥密码 | ssh-keygen -p -f id_rsa |
-y | 从私钥生成公钥 | ssh-keygen -y -f id_rsa > key.pub |
-c | 修改密钥注释 | ssh-keygen -c -C "new_comment" -f id_rsa |
-e | 导出密钥(格式转换) | ssh-keygen -e -m PEM -f key.pub |
-i | 导入密钥 | ssh-keygen -i -f imported_key |
安全增强
参数 | 描述 | 示例 |
---|---|---|
-a | KDF轮数(增强密码防护) | ssh-keygen -t ed25519 -a 100 |
-Z | 指定加密算法 | ssh-keygen -Z aes256-ctr |
-O | 设置密钥选项 | ssh-keygen -O clear (清除密码)ssh-keygen -O no-touch-required (YubiKey) |
密钥验证
参数 | 描述 | 示例 |
---|---|---|
-l | 显示密钥指纹 | ssh-keygen -l -f id_rsa.pub |
-E | 指定指纹算法 | ssh-keygen -l -E md5 -f id_rsa |
-B | 显示Bubble Babble指纹 | ssh-keygen -B -f id_ed25519 |
-v | 详细模式(显示ASCII艺术) | ssh-keygen -lv -f key.pub |
主机密钥管理
参数 | 描述 | 示例 |
---|---|---|
-R | 删除known_hosts 中的主机 | ssh-keygen -R github.com |
-F | 查找主机密钥 | ssh-keygen -F github.com |
-H | 哈希处理known_hosts | ssh-keygen -H |
高级操作
参数 | 描述 | 示例 |
---|---|---|
-q | 静默模式 | ssh-keygen -q -t rsa -N "" |
-m | 指定密钥格式 | ssh-keygen -m PEM -f key |
-r | 生成DNS记录(SSHFP) | ssh-keygen -r host.example.com |
-s | 使用CA签发证书 | ssh-keygen -s ca_key -I ID user_key.pub |
特殊用途
参数 | 描述 | 示例 |
---|---|---|
-D | PKCS#11库路径 | ssh-keygen -D /usr/lib/libpkcs11.so |
-U | 添加密钥到代理 | ssh-keygen -U -f id_ed25519 |
-Y | 签名/验证操作 | ssh-keygen -Y sign -f key -n file data |
典型组合
-
生成高强度Ed25519密钥:
ssh-keygen -t ed25519 -a 100 -C "work@2025" -f ~/.ssh/work_key
-
转换旧密钥为安全格式:
ssh-keygen -p -o -a 100 -f ~/.ssh/old_key
-
签发用户证书:
ssh-keygen -s ca_key -I "user_id" -n user1,user2 -V +52w user_key.pub
注意事项
-
密钥类型推荐:
- 首选:
ed25519
(安全高效) - 兼容:
rsa -b 4096
- 避免:
dsa
/ecdsa -b 256
- 首选:
-
安全实践:
chmod 700 ~/.ssh chmod 600 ~/.ssh/private_key # 私钥权限必须为600
-
密码管理:
- 使用
ssh-agent
避免重复输入密码:eval $(ssh-agent) ssh-add ~/.ssh/your_key
- 使用
通过合理组合这些参数,可满足从基础密钥生成到高级证书签发的全场景需求。
2️⃣ 参考 2
SSH-Keygen 工具详解:从基础到高级应用
ssh-keygen
是 SSH 协议套件中的核心工具,用于生成、管理和转换认证密钥对。它通过非对称加密技术实现安全的远程认证,支持 RSA、ECDSA、Ed25519 等多种算法。以下是其核心功能、参数详解及最佳实践。
一、核心功能
- 生成密钥对
创建公钥(.pub
)和私钥文件,用于 SSH 无密码登录或加密通信。 - 密钥管理
修改密码短语、转换密钥格式、删除或备份密钥。 - 安全认证
替代密码登录,提升安全性(防暴力破解)。
二、核心参数详解
参数 | 作用 | 示例 |
---|---|---|
-t | 指定密钥类型(rsa/ecdsa/ed25519) | ssh-keygen -t ed25519 |
-b | 设置密钥长度(RSA 推荐 ≥3072 位) | ssh-keygen -t rsa -b 4096 |
-C | 添加注释(如邮箱或用途) | ssh-keygen -C "user@example.com" |
-f | 指定密钥保存路径 | ssh-keygen -f ~/.ssh/custom_key |
-N | 设置空密码短语(自动化场景) | ssh-keygen -N "" -f auto_key |
-l | 显示公钥指纹(验证密钥真实性) | ssh-keygen -l -E sha256 -f ~/.ssh/id_rsa.pub |
-p | 修改私钥密码短语 | ssh-keygen -p -f ~/.ssh/private_key |
-m | 转换密钥格式(如 PEM/DER) | ssh-keygen -p -m PEM -f old_key |
三、典型场景示例
-
生成 Ed25519 密钥(推荐)
ssh-keygen -t ed25519 -C "work@server" -f ~/.ssh/server_key
生成
server_key
(私钥)和server_key.pub
(公钥),注释标识用途。 -
非交互式生成密钥(自动化部署)
ssh-keygen -q -N "" -t rsa -b 4096 -f /path/to/auto_key
静默模式生成 RSA 4096 位密钥,无密码短语。
-
公钥指纹验证
ssh-keygen -l -E sha256 -f ~/.ssh/id_rsa.pub
输出 SHA256 指纹,用于对比防止中间人攻击。
-
密钥格式转换(兼容旧系统)
ssh-keygen -p -m PEM -f ~/.ssh/legacy_key
将 OpenSSH 新格式转为 PEM 格式。
四、安全最佳实践
-
密钥类型选择
- Ed25519:首选(安全性高、速度快)。
- RSA:兼容性广,但需 ≥3072 位。
- 避免 DSA/ECDSA(存在安全隐患或兼容性问题)。
-
私钥保护
- 权限设为
600
:chmod 600 ~/.ssh/private_key
- 使用强密码短语(非空密码)。
- 权限设为
-
系统加固
- 禁用密码登录:修改
/etc/ssh/sshd_config
中的PasswordAuthentication no
。 - 修改默认端口(如 2222)并限制访问 IP。
- 定期轮换密钥(建议每 6-12 个月)。
- 禁用密码登录:修改
-
日志与监控
- 检查 SSH 日志(
/var/log/auth.log
)发现异常登录。 - 使用 Fail2Ban 防御暴力破解。
- 检查 SSH 日志(
五、高级应用
-
SSH 证书签发(CA 模式)
ssh-keygen -s ca_key -I "admin_cert" -n user1,user2 user_key.pub
通过 CA 私钥签发证书,限制用户权限。
-
Python 自动化集成
import subprocess def gen_ssh_key(path, type="rsa", size=2048): cmd = ["ssh-keygen", "-t", type, "-b", str(size), "-f", path, "-N", ""] subprocess.run(cmd, check=True) gen_ssh_key("/path/to/key")
-
多密钥管理
为不同服务(GitHub、GitLab)生成独立密钥,通过-f
指定文件名避免冲突。
六、总结
ssh-keygen
是 SSH 安全认证的基石,合理使用可显著提升系统安全性。优先选择 Ed25519 算法,结合密码短语、权限控制和定期轮换策略,能有效防御多数攻击。在自动化场景中,非交互式生成密钥并集成到脚本(如 Ansible 部署)可大幅简化流程。
3️⃣ 参考 3
以下是关于 ssh-keygen
的详细解析,涵盖其基本用法、密钥生成流程、常见选项以及实际应用场景:
1. ssh-keygen
的基本用法
ssh-keygen
是用于生成、管理和转换 SSH 密钥对的工具,支持多种加密算法(如 RSA、DSA、ECDSA、Ed25519)。其基本命令格式为:
ssh-keygen [选项]
常用选项
选项 | 说明 |
---|---|
-t | 指定密钥类型(如 rsa 、ed25519 )。 |
-b | 指定密钥长度(仅适用于 RSA 等算法)。 |
-C | 为密钥添加注释(如邮箱地址)。 |
-f | 指定生成的密钥文件名或路径。 |
-N | 设置私钥的密码短语(passphrase)。 |
-q | 静默模式,不显示生成过程中的信息。 |
-p | 修改现有私钥的密码短语。 |
-l | 显示密钥的指纹(fingerprint)。 |
2. 生成 SSH 密钥对的步骤
步骤 1:运行命令生成密钥
以生成 RSA 密钥为例:
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
-t rsa
:指定密钥类型为 RSA。-b 4096
:设置密钥长度为 4096 位(提高安全性)。-C "your_email@example.com"
:添加注释,便于识别密钥用途。
步骤 2:选择保存路径
系统会提示输入密钥保存路径,默认为 ~/.ssh/id_rsa
。若需自定义路径,可通过 -f
参数指定:
ssh-keygen -t rsa -f /path/to/custom_key -C "custom_key"
步骤 3:设置密码短语(可选)
系统会提示输入私钥的密码短语(passphrase)。若无需密码保护,直接回车跳过。密码短语可增加安全性,但每次使用私钥时需输入。
步骤 4:生成结果
生成完成后,会生成两个文件:
- 私钥文件(如
id_rsa
):需严格保密,不可泄露。 - 公钥文件(如
id_rsa.pub
):可公开,用于远程服务器认证。
3. 密钥类型与算法选择
常见算法对比
算法 | 安全性 | 密钥长度 | 特点 |
---|---|---|---|
RSA | 高 | 2048/4096位 | 兼容性最好,适合大多数场景。 |
Ed25519 | 极高 | 固定 256 位 | 基于椭圆曲线,速度快、安全性高,推荐新项目使用。 |
ECDSA | 高 | 256/384/521位 | 椭圆曲线算法,兼容性较好,但部分服务不支持。 |
推荐用法
- RSA:
ssh-keygen -t rsa -b 4096
- Ed25519:
ssh-keygen -t ed25519
4. 密钥权限与安全设置
生成密钥后,需确保文件权限正确,否则 SSH 会拒绝使用:
# 设置 .ssh 目录权限
chmod 700 ~/.ssh
# 设置私钥文件权限(仅限所有者读写)
chmod 600 ~/.ssh/id_rsa
# 设置公钥文件权限(可读)
chmod 644 ~/.ssh/id_rsa.pub
5. 实际应用场景
场景 1:免密码登录远程服务器
- 生成密钥对(如
id_rsa
和id_rsa.pub
)。 - 将公钥上传到远程服务器:
cat ~/.ssh/id_rsa.pub | ssh user@remote_host 'cat >> ~/.ssh/authorized_keys'
- 验证免密登录:
ssh user@remote_host
场景 2:GitHub/GitLab 身份认证
- 生成密钥并添加注释:
ssh-keygen -t ed25519 -C "github_user@example.com"
- 复制公钥内容:
cat ~/.ssh/id_ed25519.pub
- 将公钥粘贴到 GitHub/GitLab 的 SSH 设置中。
6. 高级用法
修改私钥密码
ssh-keygen -p -f ~/.ssh/id_rsa
查看密钥指纹
ssh-keygen -l -f ~/.ssh/id_rsa.pub
导出密钥为其他格式
- OpenSSH 转 PEM 格式:
ssh-keygen -m PEM -t rsa -b 4096 -f my_key
- PEM 转 OpenSSH 格式:
ssh-keygen -i -f my_key.pem > my_key.pub
7. 注意事项
- 私钥保护:私钥文件(如
id_rsa
)必须严格保密,避免泄露。 - 密码短语:建议为私钥设置强密码短语,防止未授权访问。
- 密钥备份:定期备份私钥文件,避免丢失。
- 算法兼容性:部分旧系统可能不支持 Ed25519,需确认目标服务器支持的算法。
通过以上步骤和用法,你可以高效地使用 ssh-keygen
生成和管理 SSH 密钥,实现安全的远程访问和身份认证。
4️⃣ 参考 4
ssh-keygen
命令详解:SSH 密钥生成与管理工具
一、基本功能与用途
ssh-keygen
是 OpenSSH 套件中的核心工具,用于:
- 生成 SSH 密钥对(公钥/私钥)
- 管理现有密钥(转换格式、修改密码、显示指纹等)
- 为 SSH 服务创建主机密钥
- 支持多种加密算法(RSA、ED25519、ECDSA 等)
二、核心参数详解
ssh-keygen [选项] [-f 输出文件]
选项 | 功能描述 |
---|---|
-t | 指定密钥类型:rsa 、ed25519 、ecdsa 、dsa (不推荐) |
-b | 指定密钥长度(如 RSA 推荐 2048/4096,ED25519 固定 256 无需指定) |
-C | 添加注释(通常为邮箱,如 user@example.com ) |
-f | 指定密钥文件保存路径(默认 ~/.ssh/id_* ) |
-N | 设置私钥密码(空字符串 '' 表示无密码) |
-P | 更改现有私钥密码 |
-q | 安静模式,不显示进度信息 |
-y | 从私钥提取公钥内容 |
-l | 显示密钥指纹(用于验证服务器身份) |
-F | 在 known_hosts 文件中查找主机密钥(用于清理旧指纹) |
-R | 从 known_hosts 文件中删除指定主机的密钥(用于修复 MITM 攻击警告) |
三、常用场景示例
1. 生成 ED25519 密钥对(推荐)
ssh-keygen -t ed25519 -C "your_email@example.com"
# 生成文件:~/.ssh/id_ed25519(私钥)和 ~/.ssh/id_ed25519.pub(公钥)
2. 生成高强度 RSA 密钥(兼容旧系统)
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
# 生成文件:~/.ssh/id_rsa 和 ~/.ssh/id_rsa.pub
3. 为服务器生成主机密钥
# 为 SSH 服务生成 ED25519 主机密钥
sudo ssh-keygen -t ed25519 -f /etc/ssh/ssh_host_ed25519_key -N ''
4. 修改私钥密码
ssh-keygen -p -f ~/.ssh/id_ed25519
# 交互式修改现有私钥的密码
5. 显示密钥指纹(验证服务器身份)
ssh-keygen -l -f ~/.ssh/id_ed25519.pub
# 输出类似:256 SHA256:XXXXXXXX... (ED25519)
6. 从私钥提取公钥
ssh-keygen -y -f ~/.ssh/id_ed25519 > ~/.ssh/id_ed25519.pub
# 当公钥丢失时可通过私钥重新生成
7. 清理 known_hosts 中的旧指纹
# 删除 example.com 的旧密钥
ssh-keygen -R example.com
四、密钥文件格式与权限
-
密钥文件位置:
- 用户密钥:
~/.ssh/
目录下 - 系统主机密钥:
/etc/ssh/
目录下(如ssh_host_ed25519_key
)
- 用户密钥:
-
标准文件名:
算法 私钥文件名 公钥文件名 ED25519 id_ed25519
id_ed25519.pub
RSA id_rsa
id_rsa.pub
ECDSA id_ecdsa
id_ecdsa.pub
-
关键权限要求:
- 私钥文件:
chmod 600 ~/.ssh/id_*
(仅所有者可读可写) - 公钥文件:
chmod 644 ~/.ssh/id_*.pub
(可读) .ssh
目录:chmod 700 ~/.ssh
(仅所有者可访问)
- 私钥文件:
五、高级用法
1. 生成不加密的临时密钥
ssh-keygen -t ed25519 -f /tmp/temp_key -N ''
# 用于自动化脚本(不推荐长期使用)
2. 创建证书签名密钥(SSH CA)
# 生成 CA 密钥
ssh-keygen -t ed25519 -f ~/.ssh/ca_key -C "SSH_CA"
# 使用 CA 签名用户公钥
ssh-keygen -s ~/.ssh/ca_key -I user_id -n username -V +52w ~/.ssh/user_key.pub
3. 转换密钥格式(PuTTY 兼容)
# 安装 putty-tools
sudo apt-get install putty-tools
# 将 OpenSSH 私钥转换为 PuTTY (.ppk) 格式
puttygen ~/.ssh/id_rsa -o id_rsa.ppk
六、安全最佳实践
-
优先使用 ED25519:
- 现代系统推荐使用 ED25519(更快、更安全)
- RSA 仅用于兼容旧系统(如 Windows Server 2012 之前版本)
-
设置强密码保护私钥:
- 避免使用无密码的私钥(除非自动化需求)
- 使用
ssh-agent
或keychain
管理密码缓存
-
定期轮换密钥:
- 敏感系统建议每年更换一次密钥
- 使用
ssh-keygen -R
和ssh-keyscan
同步新指纹
-
保护 known_hosts 文件:
- 定期检查
~/.ssh/known_hosts
,删除可疑条目 - 使用
StrictHostKeyChecking=yes
强制验证主机密钥
- 定期检查
七、常见问题处理
-
SSH 连接时提示密钥权限问题:
# 修复权限 chmod 700 ~/.ssh chmod 600 ~/.ssh/id_* chmod 644 ~/.ssh/*.pub
-
主机密钥变更警告:
# 删除旧指纹 ssh-keygen -R example.com # 重新获取指纹 ssh-keyscan example.com >> ~/.ssh/known_hosts
-
批量生成密钥(自动化):
# 非交互式生成无密码密钥 ssh-keygen -t ed25519 -f /path/to/key -N '' -q
总结
ssh-keygen
是 SSH 生态系统的基础工具,熟练掌握其用法对于安全管理远程连接至关重要。建议优先采用 ED25519 算法,并通过合理的权限设置和定期轮换机制保障密钥安全。在自动化场景中,可结合 ssh-agent
和无密码密钥实现安全的非交互式登录。
5️⃣ 参考 5
ssh-keygen
是一个用于生成、管理和转换 SSH 认证密钥的工具,它提供了多种选项来生成不同类型的密钥对(公钥和私钥),并可以对密钥进行各种配置和操作。以下是 ssh-keygen
的详细说明:
语法
ssh-keygen [-q] [-b bits] [-t type] [-N new_passphrase] [-C comment] [-f output_keyfile]
常见选项
-
-t type
指定密钥的类型:rsa
: RSA 密钥(默认类型,推荐用于大多数场景)。dsa
: DSA 密钥(不再推荐,已被弱安全模型淘汰)。ecdsa
: 椭圆曲线 DSA 密钥(适用于现代系统,安全性较高)。ed25519
: Ed25519 密钥(基于椭圆曲线,性能和安全性更优,推荐)。
-
-b bits
指定密钥的位数:- RSA 密钥建议使用
2048
或更高(如4096
)。 - ECDSA 和 Ed25519 不需要指定,它们使用固定的密钥长度。
- RSA 密钥建议使用
-
-N new_passphrase
设置密钥的密码短语(passphrase)。密码短语用于保护私钥,即使私钥文件泄露,也需要密码才能使用。可以留空(不推荐)。 -
-C comment
添加注释(如用户名或主机名),用于标识密钥。 -
-f output_keyfile
指定生成的密钥文件名(默认为~/.ssh/id_<type>
,如id_rsa
)。 -
-q
静默模式,减少输出信息。
常见用法
1. 生成默认的 RSA 密钥对
ssh-keygen -t rsa -b 4096
- 默认生成
~/.ssh/id_rsa
(私钥)和~/.ssh/id_rsa.pub
(公钥)。 - 推荐使用
4096
位密钥,安全性更高。
2. 生成 Ed25519 密钥对
ssh-keygen -t ed25519
- Ed25519 是一种现代算法,性能和安全性更优。
- 默认生成
~/.ssh/id_ed25519
和~/.ssh/id_ed25519.pub
。
3. 指定文件名和注释
ssh-keygen -t rsa -b 4096 -f ~/.ssh/custom_key -C "my_custom_key"
- 将密钥保存到
~/.ssh/custom_key
和~/.ssh/custom_key.pub
。 - 注释为
my_custom_key
。
4. 生成无密码短语的密钥(不推荐)
ssh-keygen -t ed25519 -N ""
- 生成的私钥没有密码保护。
高级用法
-
修改密钥密码短语
ssh-keygen -p -f ~/.ssh/id_rsa
- 修改
id_rsa
的密码短语。
- 修改
-
生成 SSH 公钥(用于手动部署)
ssh-keygen -y -f ~/.ssh/id_rsa > ~/.ssh/id_rsa.pub
- 提取公钥内容。
-
检查密钥指纹
ssh-keygen -l -f ~/.ssh/id_rsa.pub
- 显示公钥的指纹(用于验证密钥)。
-
合并多个公钥文件
ssh-keygen -i -f key1.pub > combined_key.pub ssh-keygen -i -f key2.pub >> combined_key.pub
- 合并多个公钥到一个文件。
-
删除旧密钥
ssh-keygen -R [hostname]
- 从
~/.ssh/known_hosts
中删除指定主机的密钥。
- 从
使用场景
-
生成密钥对并部署到服务器
- 在本地生成密钥对:
ssh-keygen -t ed25519
- 将公钥复制到远程服务器:
ssh-copy-id -i ~/.ssh/id_ed25519.pub user@remote_host
- 在本地生成密钥对:
-
禁用密码登录(增强安全性)
- 在
/etc/ssh/sshd_config
中设置:PasswordAuthentication no
- 重启 SSH 服务:
sudo systemctl restart sshd
- 在
注意事项
- 备份密钥文件:私钥丢失会导致无法登录服务器。
- 保护私钥:不要将私钥文件暴露给他人。
- 定期更新密钥:长期使用的密钥建议定期更换。
通过 ssh-keygen
,可以轻松生成和管理 SSH 密钥,从而提高远程登录的安全性和便利性。
6️⃣ 参考 6
ssh-keygen 命令详解
ssh-keygen
是生成、管理和转换 SSH 密钥的核心工具,用于建立安全的远程连接(如 GitHub、GitLab、服务器登录等)。以下是详细使用方法和参数解析:
一、基础语法
ssh-keygen [选项]
二、核心参数说明
-
-t <密钥类型>
- 指定密钥算法类型,常用值:
rsa
(默认,兼容性好)ed25519
(更安全高效)ecdsa
(椭圆曲线算法)
- 示例:
ssh-keygen -t ed25519
- 指定密钥算法类型,常用值:
-
-b <密钥长度>
- 设置密钥的位数(仅对 RSA/ECDSA 有效):
- RSA 推荐 4096 位:
-b 4096
- ECDSA 推荐 384 位:
-b 384
- RSA 推荐 4096 位:
- 示例:
ssh-keygen -t rsa -b 4096
- 设置密钥的位数(仅对 RSA/ECDSA 有效):
-
-C "<注释>"
- 添加密钥注释(通常用邮箱标识所有者)
- 示例:
ssh-keygen -C "your_email@example.com"
-
-f "<文件路径>"
- 指定密钥保存路径和文件名(管理多密钥必备)
- 示例:
ssh-keygen -f ~/.ssh/github_key # 生成私钥 github_key 和公钥 github_key.pub
-
-N "<密码>"
- 为私钥设置加密密码(增强安全性)
- 示例:
ssh-keygen -N "my_secure_password"
-
-p
- 修改现有私钥的密码(会提示输入原密码)
- 示例:
ssh-keygen -p -f ~/.ssh/id_rsa
三、操作流程示例
场景:为 GitHub 生成专用密钥
# 步骤 1:生成密钥对
ssh-keygen -t ed25519 -C "github@example.com" -f ~/.ssh/github_key
# 步骤 2:按提示操作
Enter passphrase (empty for no passphrase): [输入密码或直接回车]
> 生成文件:github_key(私钥)和 github_key.pub(公钥)
# 步骤 3:将公钥添加到 GitHub
cat ~/.ssh/github_key.pub # 复制输出内容到 GitHub SSH Keys 设置
四、多密钥管理(关键配置)
当存在多个密钥(如 GitHub/GitLab/服务器)时,需配置 ~/.ssh/config
文件:
# GitHub 专用密钥
Host github.com
HostName github.com
IdentityFile ~/.ssh/github_key # 指定私钥路径
User git
# GitLab 专用密钥
Host gitlab.com
HostName gitlab.com
IdentityFile ~/.ssh/gitlab_key
User git
# 通用默认密钥(可选)
Host *
AddKeysToAgent yes
IdentityFile ~/.ssh/id_ed25519 # 默认密钥
五、其他实用命令
-
查看公钥指纹(验证密钥):
ssh-keygen -l -f ~/.ssh/github_key.pub
-l
:显示密钥指纹(SHA256 摘要)
-
转换密钥格式(如 PEM 转 OPENSSH):
ssh-keygen -p -m PEM -f keyfile
-
删除缓存的密钥:
ssh-add -D # 清除 ssh-agent 中所有密钥
六、注意事项
-
文件权限:
- 私钥权限必须为
600
:chmod 600 ~/.ssh/*
config
文件权限为644
:chmod 644 ~/.ssh/config
- 私钥权限必须为
-
密码安全性:
- 强烈建议用
-N
为私钥设置密码,避免泄露导致风险。
- 强烈建议用
-
覆盖确认:
- 若密钥文件已存在,会提示
Overwrite (y/n)?
,输入y
强制替换。
- 若密钥文件已存在,会提示
常见问题解决
-
问题:密钥生成后连接失败
检查~/.ssh/config
中的Host
配置是否匹配远程地址。 -
问题:提示
Permissions 0644 are too open
执行chmod 600 ~/.ssh/your_key
修复权限。 -
问题:多平台密钥冲突
确保每个平台在config
中有独立Host
块并指定IdentityFile
。
7️⃣ 参考 7
ssh-keygen
是 OpenSSH 套件中用于生成、管理和转换 SSH 密钥对的工具,支持 RSA、DSA、ECDSA、Ed25519 等算法。以下是其核心功能和使用详解:
一、基本用法
-
生成密钥对
默认生成 RSA 密钥(推荐 4096 位):ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
-t
:指定密钥类型(如rsa
、ed25519
、ecdsa
)-b
:密钥长度(仅对部分算法有效)-C
:添加注释(通常为邮箱或用途)
生成文件默认存储在
~/.ssh/
目录下:id_rsa
:私钥(需严格保密)id_rsa.pub
:公钥(可公开分发)
-
密钥格式转换
- 导入其他格式密钥(如 PuTTY 的
.ppk
):ssh-keygen -i -m PKCS8 -f key.ppk > id_rsa
- 导出为指定格式(如 PEM):
ssh-keygen -m PEM -f ~/.ssh/id_rsa
- 导入其他格式密钥(如 PuTTY 的
二、核心参数与功能
参数 | 说明 |
---|---|
-f <file> | 指定密钥文件路径(默认生成 id_rsa 和 id_rsa.pub ) |
-N <pass> | 设置私钥密码(保护私钥,防止泄露后被滥用) |
-p | 修改已有私钥的密码 |
-y | 从私钥提取公钥内容 |
-l | 显示公钥指纹(用于校验密钥一致性) |
-R <host> | 从 known_hosts 删除指定主机的公钥记录 |
-A | 自动生成默认密钥类型(RSA/Ed25519/ECDSA) |
三、使用场景
-
SSH 免密登录
- 将公钥复制到远程服务器的
~/.ssh/authorized_keys
:ssh-copy-id -i ~/.ssh/id_rsa.pub user@remote_host
- 验证权限:
.ssh
目录权限:700
authorized_keys
文件权限:600
- 将公钥复制到远程服务器的
-
Git 仓库认证
- 生成密钥后,将公钥添加到 Git 托管平台(如 GitHub、GitLab)的 SSH 密钥设置中。
- 使用私钥克隆仓库:
git clone git@github.com:user/repo.git
-
安全审计
- 检测弱密钥:
ssh-keygen -T ~/.ssh/id_rsa
- 验证密钥完整性:
ssh-keygen -w ~/.ssh/id_rsa -W "verify"
- 检测弱密钥:
四、安全注意事项
-
密钥管理
- 私钥必须严格保密,避免泄露。
- 推荐使用强密码(Passphrase)保护私钥。
- 定期轮换密钥(如每 90 天)。
-
权限设置
.ssh
目录权限:700
- 私钥文件权限:
600
- 公钥文件权限:
644
-
算法选择
- RSA:兼容性广,推荐 4096 位。
- Ed25519:安全性高,性能优(OpenSSH 6.5+ 支持)。
- ECDSA:平衡安全性与性能,需服务器支持。
五、常见问题
-
权限错误
若提示Permission denied
,检查.ssh
目录和文件的权限是否合规。 -
密钥覆盖
生成密钥时若文件已存在,需使用-f
指定新路径或覆盖现有文件。 -
密钥格式兼容性
使用-m
参数指定格式(如PEM
、OpenSSH
)以适配不同系统。
通过合理配置 ssh-keygen
,可显著提升远程登录和代码托管的安全性,避免密码泄露风险。具体操作细节可参考官方网页或结合实际场景调整参数。
8️⃣ 参考 8
以下是对 ssh-keygen 命令的详细解析,涵盖其核心功能、常用操作及安全实践,综合自多篇权威资料:
🔐 一、功能概述
ssh-keygen 是 OpenSSH 提供的密钥管理工具,用于生成、转换和管理 SSH 认证密钥对(公钥 + 私钥),实现安全的无密码登录和加密通信。
- 核心作用:替代传统密码认证,提升远程登录的安全性和便捷性。
- 密钥类型:支持 RSA(默认)、DSA(已逐渐淘汰)、ECDSA、Ed25519(推荐)等算法。
⚙️ 二、基础用法与选项
1. 生成密钥对
bash ssh-keygen -t <算法类型> -b <密钥长度> -C "注释" -f <输出路径>
- 常用参数:
- -t rsa | ed25519:指定密钥类型(推荐 Ed25519 或 RSA-4096)。
- -b 4096:设置 RSA 密钥长度(默认 2048,4096 更安全)。
- -C "备注":添加注释(如邮箱),便于识别密钥用途。
- -f ~/.ssh/id_rsa:自定义私钥存储路径(默认 ~/.ssh/id_rsa)。
- 生成流程:
- 执行命令后需确认存储路径、设置私钥口令(Passphrase)(可选但强烈建议)。
- 生成文件:
- 私钥:~/.ssh/id_rsa(严格保密,权限需为 600)⚠️。
- 公钥:~/.ssh/id_rsa.pub(可公开分发)。
2. 密钥管理操作
操作 | 命令示例 | 用途 |
---|---|---|
🔑 修改私钥口令 | ssh-keygen -p -f ~/.ssh/id_rsa | 更新私钥保护密码(需验证旧密码) |
🔍 查看公钥指纹 | ssh-keygen -l -f ~/.ssh/id_rsa.pub | 验证密钥真实性(防篡改) |
🔄 转换密钥格式 | ssh-keygen -e -m PEM -f id_rsa.pub | 导出为 OpenSSL/PKCS 格式 |
🗑️ 删除已知主机记录 | ssh-keygen -R hostname | 清除 known_hosts 中旧密钥 |
3. 密钥部署与免密登录
- 将公钥部署到远程服务器:
bash ssh-copy-id -i ~/.ssh/id_rsa.pub user@remote_host
→ 自动追加公钥到服务器的 ~/.ssh/authorized_keys。 - 验证免密登录:
bash ssh user@remote_host
→ 若配置成功,直接登录(需输入私钥口令,若设置)。
🔒 三、安全实践要点
- 私钥权限:
- 必须限制为 600(仅用户可读写):
bash chmod 600 ~/.ssh/id_rsa
否则 SSH 会拒绝使用(避免未授权访问)。
- 口令短语(Passphrase):
- 强烈建议设置:即使私钥泄露,仍需口令解密。
- 要求:长度 10-30 字符,混合大小写/数字/符号(避免常见短语)。
- 文件权限链:
- ~/.ssh 目录权限应为 700
- authorized_keys 文件权限应为 600 → 防止其他用户篡改密钥。
⚠️ 四、常见问题解决
- Permission denied (publickey):
- 检查私钥权限是否为 600
- 确认公钥已正确写入服务器的 authorized_keys。
- 兼容性问题:
- 旧系统(如不支持 Ed25519)改用 RSA: bash ssh-keygen -t rsa -b 4096 -C "fallback_key"
- 密钥遗忘或泄露: → 重新生成密钥对,并更新所有关联服务器的 authorized_keys(无法恢复口令)。
💎 五、扩展用途
- 主机密钥管理:系统管理员可用其生成服务器的 SSH 主机密钥。
- 证书转换:支持 PKCS#11 格式与 OpenSSH 密钥互转(-i/-e)。
建议结合实操练习加深理解,可通过 man ssh-keygen 查阅完整选项。遇到复杂场景时,注意备份原始密钥并逐步验证配置。
9️⃣ 参考 9
ssh-keygen
是 SSH 协议中用于生成、管理和转换 SSH 密钥对的工具,常用于配置免密登录(如 SSH 服务器、GitHub/GitLab 等)。以下是其核心功能和使用详解:
1. 生成密钥对(基础命令)
ssh-keygen -t <密钥类型> -b <密钥长度> -C "注释"
- 常用参数:
-t
:密钥类型(默认rsa
),可选值:rsa
:传统 RSA 算法(推荐-b 4096
)ed25519
:更安全高效的椭圆曲线算法(推荐)ecdsa
:椭圆曲线算法(兼容旧系统)
-b
:密钥长度(如 RSA 推荐4096
,Ed25519 固定长度无需指定)-C
:注释(一般填写用途,如邮箱或服务器信息)-f
:指定密钥保存路径(默认~/.ssh/id_<类型>
)
示例:
# 生成默认的 RSA 密钥(~/.ssh/id_rsa)
ssh-keygen
# 生成 Ed25519 密钥(更推荐)
ssh-keygen -t ed25519 -C "my_key_for_github"
# 指定自定义路径和密钥长度
ssh-keygen -t rsa -b 4096 -f ~/.ssh/my_custom_key
2. 密钥文件说明
生成的密钥对包含两个文件:
- 私钥(如
id_rsa
或id_ed25519
):- 必须严格保密,权限需设为
600
(chmod 600 ~/.ssh/id_rsa
)。
- 必须严格保密,权限需设为
- 公钥(如
id_rsa.pub
或id_ed25519.pub
):- 可公开分发,需添加到目标服务器的
~/.ssh/authorized_keys
文件中。
- 可公开分发,需添加到目标服务器的
3. 常见使用场景
(1) 配置免密登录到服务器
- 生成密钥对(若尚未生成)。
- 将公钥上传到服务器:
或手动追加公钥到服务器的ssh-copy-id -i ~/.ssh/id_ed25519.pub user@server_ip
~/.ssh/authorized_keys
。
(2) 配置 Git 服务(GitHub/GitLab)
- 生成密钥对(如
github_ed25519
)。 - 将公钥内容粘贴到 Git 服务的 SSH Keys 配置页面。
- 配置 Git 客户端使用指定私钥:
# ~/.ssh/config 中添加: Host github.com IdentityFile ~/.ssh/github_ed25519
4. 其他实用操作
(1) 修改密钥密码
ssh-keygen -p -f ~/.ssh/id_rsa
- 为现有密钥添加或更新密码(passphrase)。
(2) 转换密钥格式
# 将 OpenSSH 私钥转为 PEM 格式(兼容其他工具)
ssh-keygen -p -m PEM -f ~/.ssh/id_rsa
(3) 删除密钥的已知主机记录
ssh-keygen -R server_ip
- 当服务器公钥变更导致连接失败时,清除旧记录。
5. 安全注意事项
- 私钥权限:
- 确保私钥权限为
600
,.ssh
目录权限为700
。
- 确保私钥权限为
- 密码保护:
- 生成密钥时建议设置密码(passphrase),避免私钥泄露后被直接使用。
- 密钥备份:
- 私钥建议加密备份,公钥可随意分发。
6. 扩展知识
- 代理转发:使用
ssh-agent
管理密钥密码,避免频繁输入:eval $(ssh-agent) ssh-add ~/.ssh/id_ed25519
- 多密钥管理:通过
~/.ssh/config
为不同主机指定不同密钥:Host server1 HostName server1.example.com User user1 IdentityFile ~/.ssh/server1_key Host github.com User git IdentityFile ~/.ssh/github_key
掌握 ssh-keygen
可以极大提升 SSH 连接的效率和安全性,特别是在管理多服务器或 Git 服务时。
🔟 参考 10
ssh-keygen
参数详解:完整指南
一、密钥生成参数
1. -t
:指定密钥类型
ssh-keygen -t ed25519 # 推荐:现代椭圆曲线算法(2013年)
ssh-keygen -t rsa -b 4096 # 兼容:RSA算法,指定4096位长度
ssh-keygen -t ecdsa -b 521 # 椭圆曲线DSA,可选256/384/521位
ssh-keygen -t dsa # 不推荐:DSA算法(已被弃用,<=1024位)
- 推荐配置:优先使用
ed25519
,RSA 仅用于兼容旧系统
2. -b
:指定密钥长度(比特位)
ssh-keygen -t rsa -b 4096 # RSA推荐至少2048位,敏感系统用4096位
ssh-keygen -t ecdsa -b 521 # ECDSA可选256/384/521位(521位安全性最高)
# ed25519无需指定-b,固定256位安全强度
- 安全建议:RSA 低于 2048 位存在安全风险(如 1024 位已被破解)
3. -f
:指定密钥文件路径
ssh-keygen -f ~/.ssh/custom_key # 保存到自定义路径
ssh-keygen -f /etc/ssh/ssh_host_rsa_key # 系统主机密钥路径
- 注意:私钥文件(如
custom_key
)需严格权限控制(chmod 600
)
4. -C
:添加注释(Comment)
ssh-keygen -C "admin@example.com" # 公钥中嵌入邮箱注释
ssh-keygen -C "web-server-prod" # 用于标识服务器用途的注释
- 用途:在
~/.ssh/authorized_keys
中便于识别不同密钥用途
5. -N
:设置私钥密码(Passphrase)
ssh-keygen -N 'strong_password' -f ~/.ssh/secure_key # 设置密码
ssh-keygen -N '' -f /tmp/automation_key # 无密码(自动化场景)
- 安全建议:始终为私钥设置强密码,无密码密钥仅限自动化脚本使用
二、密钥管理参数
1. -P
:修改现有私钥密码
ssh-keygen -P 'new_password' -f ~/.ssh/id_rsa # 修改密码
ssh-keygen -P '' -f ~/.ssh/id_rsa # 移除密码(谨慎操作)
- 操作步骤:会先要求输入旧密码,再设置新密码
2. -y
:从私钥提取公钥
ssh-keygen -y -f ~/.ssh/id_rsa > ~/.ssh/id_rsa.pub # 重建公钥
ssh-keygen -y -f /etc/ssh/ssh_host_ed25519_key # 查看主机公钥内容
- 应用场景:公钥文件丢失时,可通过私钥重新生成公钥
3. -l
:显示密钥指纹(Fingerprint)
ssh-keygen -l -f ~/.ssh/id_ed25519.pub # 显示SHA256指纹
ssh-keygen -l -E md5 -f ~/.ssh/id_rsa.pub # 显示MD5指纹(兼容旧系统)
- 输出示例:
256 SHA256:XXXXXXXX... user@host (ED25519)
4. -B
:显示密钥的 Bubble Babble 编码
ssh-keygen -B -f ~/.ssh/id_rsa.pub
# 输出类似:xexax-wofyr-ludak-sonax-gixex
- 用途:便于人类记忆和口头传递密钥验证信息
三、高级功能参数
1. -A
:自动生成所有类型的主机密钥
sudo ssh-keygen -A # 为SSH服务生成所有支持的主机密钥
# 等效于生成ed25519、rsa、ecdsa等类型的主机密钥
- 应用场景:新安装SSH服务后初始化主机密钥
2. -T
:测试密钥的安全性
ssh-keygen -t rsa -b 2048 -f test_key
ssh-keygen -T /dev/stdout -f test_key # 测试密钥抗暴力破解能力
- 输出:显示密钥在不同攻击模型下的估计破解时间
3. -c
:修改密钥注释
ssh-keygen -c -C "new_comment@example.com" -f ~/.ssh/id_rsa
- 注意:仅修改公钥中的注释字段,不影响密钥对本身
4. -F
:在 known_hosts
中查找主机
ssh-keygen -F example.com # 查找example.com的主机密钥
ssh-keygen -F 192.168.1.1 # 按IP查找
- 输出:显示匹配的主机密钥条目或
# not found
5. -R
:从 known_hosts
删除主机密钥
ssh-keygen -R example.com # 删除旧的/错误的主机密钥
- 场景:当服务器重装系统后,需要清除本地缓存的旧指纹
四、证书相关参数(SSH CA)
1. -s
:使用 CA 签署用户/主机证书
# 签署用户证书
ssh-keygen -s /path/to/ca_key -I user_id -n username -V +52w user_key.pub
# 签署主机证书
ssh-keygen -s /path/to/ca_key -h -I server_id -n server1,server2 -V +1y host_key.pub
- 参数说明:
-I
:证书标识符(唯一ID)-n
:允许的用户名/主机名(逗号分隔)-V
:有效期(如+52w
表示52周)-h
:签署主机证书(而非用户证书)
2. -L
:查看证书详情
ssh-keygen -L -f user_key-cert.pub # 查看证书信息
- 输出:显示证书有效期、主体、权限等详细信息
五、格式转换参数
1. -p
:更改密钥格式(OpenSSH/PuTTY)
# OpenSSH私钥 → PuTTY (.ppk) 格式(需putty-tools)
puttygen ~/.ssh/id_rsa -o id_rsa.ppk
# PuTTY → OpenSSH格式
puttygen id_rsa.ppk -O private-openssh -o ~/.ssh/id_rsa
- 应用场景:在 Windows(PuTTY)和 Linux 之间迁移密钥
2. -m
:指定密钥格式
ssh-keygen -m PEM -f rsa_key # 生成PEM格式密钥(兼容OpenSSL)
- 常见格式:
RFC4716
(OpenSSH默认)、PEM
(OpenSSL)
六、其他实用参数
1. -q
:安静模式(不显示进度信息)
ssh-keygen -q -t ed25519 -f /tmp/auto_key -N '' # 脚本自动化
2. -v
:详细模式(显示生成过程)
ssh-keygen -v -t rsa -b 4096 # 调试模式,显示密钥生成细节
3. --version
:显示版本信息
ssh-keygen --version # 查看OpenSSH版本
七、参数组合最佳实践
- 生成高强度 RSA 密钥(兼容旧系统)
ssh-keygen -t rsa -b 4096 -C "admin@example.com" -f ~/.ssh/id_rsa
- 创建无密码 ED25519 密钥(自动化)
ssh-keygen -t ed25519 -N '' -f /etc/ansible/keys/ansible_key
- 重置服务器主机密钥(防 MITM 攻击)
sudo rm /etc/ssh/ssh_host_* # 删除现有主机密钥
sudo ssh-keygen -A # 重新生成所有类型主机密钥
sudo systemctl restart sshd # 重启SSH服务
- 使用 CA 签署短期用户证书
ssh-keygen -s ca_key -I user1 -n user1 -V +1d user1_key.pub
八、安全注意事项
-
密钥长度选择:
- RSA:≥2048 位(敏感系统建议 4096 位)
- ED25519:固定 256 位(无需指定
-b
) - ECDSA:推荐 521 位
-
权限严格控制:
- 私钥文件:
chmod 600
- 公钥文件:
chmod 644
.ssh
目录:chmod 700
- 私钥文件:
-
密码策略:
- 使用
ssh-agent
缓存密码(避免重复输入) - 定期更换私钥密码(至少每年一次)
- 使用
-
证书优势:
- 使用 SSH CA 证书替代传统密钥对,可实现批量管理和自动撤销
- 证书有效期可控,降低长期密钥泄露风险
掌握这些参数后,你可以根据不同场景灵活生成和管理 SSH 密钥,大幅提升远程连接的安全性和管理效率。