- 文档
- 教程
【免费下载链接】linux-command
Linux命令大全搜索工具,内容包含Linux命令手册、详解、学习、搜集。https://git.io/linux
ssh-keygen是 OpenSSH 套件中负责认证密钥生成、管理与转换的核心工具,也是 linux-command 项目 command/ssh-keygen.md 收录的 600 多个 Linux 命令速查条目之一。本文以该手册条目为主体,结合仓库内 ssh、git、apk 等文档中沉淀的真实用法,带你掌握从生成密钥对、指定密钥长度与类型、设置口令,到查看指纹、提取公钥、跨格式转换,再到配合ssh-copy-id实现免密登录的完整链路。
ssh-keygen 是什么
ssh-keygen 命令用于为 “ssh” 生成、管理和转换认证密钥。按手册记载,它支持 RSA 和 DSA 两种认证密钥;现代 OpenSSH 版本通常还支持 ECDSA、Ed25519 等更多类型,具体可用类型以本机ssh-keygen -t的取值或系统 man 手册为准。
在 SSH 认证体系中,密钥对由两部分组成:
- 私钥:保存在本地,权限严格受限(通常为 600),用于签名与解密,绝不外传;
- 公钥:可公开分发,通常部署到远程服务器的
~/.ssh/authorized_keys中,用于验证身份。
仓库索引文件 dist/data.json 将该命令描述为「为ssh生成、管理和转换认证密钥」,与手册正文一致,可以作为查阅入口。
语法
ssh-keygen(选项)命令本身不要求额外参数,绝大多数行为通过选项控制,交互式执行时会提示输入文件名与口令。
选项速查表
手册 command/ssh-keygen.md 中列出了 10 个核心选项,逐条整理如下:
| 选项 | 说明 |
|---|---|
-b | 指定密钥长度(bit),如-b 4096生成 4096 位 RSA 密钥 |
-e | 读取 OpenSSH 的私钥或者公钥文件,转换为其他格式输出 |
-C | 添加注释,通常用于标识密钥用途或持有人邮箱 |
-f | 指定用来保存密钥的文件名(生成时的输出路径) |
-i | 读取未加密的 ssh-v2 兼容的私钥/公钥文件,然后在标准输出设备上显示 openssh 兼容的私钥/公钥 |
-l | 显示公钥文件的指纹数据(fingerprint) |
-N | 提供一个新密语(passphrase) |
-P | 提供(旧)密语,用于对已有密钥进行口令变更等操作 |
-q | 静默模式,减少输出信息 |
-t | 指定要创建的密钥类型,如rsa、dsa |
-y | 读取私钥并输出对应的公钥 |
此外,ssh 文档中还展示了与-i、-e配套使用的-m选项,用于指定格式转换的目标/源格式:
ssh-keygen -f keyfile -i -m key_format -e -m key_format # key_format: RFC4716/SSH2(default) PKCS8 PEM实战一:生成一对 RSA 密钥
最常用的操作是直接运行ssh-keygen为当前用户生成默认密钥,此时密钥对默认落在~/.ssh/id_rsa与~/.ssh/id_rsa.pub。仓库 ssh 文档将其概括为:
ssh-keygen # 为当前用户生成 ssh 公钥 + 私钥如果需要定制,则组合使用-t、-b、-C、-f四个选项。以 git 文档中「创建 SSH 密钥」一节为例:
# 生成带注释的默认密钥(-C 后通常跟邮箱或备注) ssh-keygen -t rsa -C 'wowohoo@qq.com' # 指定生成目录和文件名(-f 指定输出路径) ssh-keygen -t rsa -C "wowohoo@qq.com" -f ~/.ssh/ww_rsa第二个例子会生成~/.ssh/ww_rsa(私钥)与~/.ssh/ww_rsa.pub(公钥)两个文件,这一行为同样体现在 git 文档对-f ~/.ssh/jslite_rsa的说明中:「会生成jslite_rsa和jslite_rsa.pub这两个文件」。
要点说明:
-b 4096可显式提高 RSA 密钥强度,密钥越长安全性越高但计算开销也越大;-C注释会写入公钥末尾,便于在多把密钥中区分归属;-f指定的路径需确保父目录存在(如~/.ssh),生成后可查看 git 文档中的公钥打开方式:vim ~/.ssh/jslite_rsa.pub。
设置与清空口令
-N '新密语':直接在命令行提供新口令,适合脚本化批量生成(注意命令行会留下历史记录,交互式输入更安全);-P '旧密语':提供旧口令,用于对已加密的私钥进行口令变更操作;- 两者配合可在非交互场景下完成口令重置。
仓库 git 文档展示了一个典型组合——生成无口令密钥以便自动化免密登录:
ssh-keygen -t rsa -P '' -f ~/.ssh/aliyunserver.key-P ''表示旧口令为空字符串,配合首次生成即可得到一个不带口令的私钥文件~/.ssh/aliyunserver.key,随后直接用于ssh-copy-id分发。
实战二:查看公钥指纹
使用-l可以读取公钥文件并输出其指纹(fingerprint),指纹是公钥内容的哈希摘要,用于在不传输整个公钥的前提下核对密钥身份:
ssh-keygen -l -f ~/.ssh/id_rsa.pub输出形如2048 SHA256:xxxxxxxx... user@host (RSA),包含密钥位数、指纹哈希、注释与类型。当服务器返回 host key 指纹时,即可用此方式与本机保存的公钥比对,确认没有被中间人替换。
实战三:从私钥提取公钥
当只有私钥、需要恢复出对应公钥时,使用-y:
ssh-keygen -y -f ~/.ssh/id_rsa命令会读取私钥并打印对应的公钥内容到标准输出,可重定向追加到目标机器的authorized_keys中。若私钥设置了口令,会提示输入密语。
实战四:密钥格式转换
不同平台与工具对密钥格式要求不同,-e与-i负责在 OpenSSH 与 RFC4716/SSH2、PKCS8、PEM 等格式之间互转:
-e:读取 OpenSSH 的私钥/公钥文件,输出为目标格式;-i:读取未加密的 ssh-v2 兼容私钥/公钥文件,输出为 OpenSSH 兼容格式;-m:配合指定格式,可取值RFC4716/SSH2(默认)、PKCS8、PEM,如 ssh 文档注释所示。
典型用法示例:
# 将 OpenSSH 公钥转为 RFC4716 格式 ssh-keygen -e -m RFC4716 -f ~/.ssh/id_rsa.pub # 将 RFC4716 格式的公钥转回 OpenSSH 格式 ssh-keygen -i -m RFC4716 -f rfc4716_key.pub需要注意:-i处理的是未加密密钥,若目标文件带口令需先用-P提供旧密语或提前解密。
实战五:配合 ssh-copy-id 实现免密登录
生成密钥只是第一步,将公钥安装到远程主机才是免密登录的关键。仓库 ssh 给出了完整的「ssh 大家族」工作流:
ssh-keygen # 为当前用户生成 ssh 公钥 + 私钥 ssh-keygen -f keyfile -i -m key_format -e -m key_format # 密钥格式转换 ssh-copy-id user@ip:port # 将当前用户的公钥复制到服务器的 ~/.ssh/authorized_keys,之后可以免密登录git 文档进一步给出了免密登录的完整两步:
ssh-keygen -t rsa -P '' -f ~/.ssh/aliyunserver.key ssh-copy-id -i ~/.ssh/aliyunserver.key.pub root@192.168.182.112 # 这里需要输入密码一次ssh-copy-id首次分发时需要输入一次远程密码,此后使用私钥登录即可免密。若想进一步约束连接参数,可在~/.ssh/config中为每台主机声明独立身份文件(见 git):
Host aliyun1 HostName 192.168.182.112 User root PreferredAuthentications publickey IdentityFile ~/.ssh/aliyunserver.key实战六:多账号 SSH 配置
当同一台机器需要区分多个代码托管账号时,-f命名多把密钥 +~/.ssh/config别名路由是最常用的方案,git 文档给出了完整流程:
生成指定名字的密钥:
ssh-keygen -t rsa -C "邮箱地址" -f ~/.ssh/jslite_rsa复制公钥
~/.ssh/jslite_rsa.pub内容到各托管平台;编辑
~/.ssh/config,为每个 Host 指定独立IdentityFile:Host jslite.github.com HostName github.com User git IdentityFile ~/.ssh/jslite_rsa Host work.github.com HostName github.com User git IdentityFile ~/.ssh/work_rsa使用
ssh -T git@jslite.github.com或ssh -T work.github.com测试连通性;克隆仓库时将地址中的域名替换为 Host 别名。
注意:若修改了默认id_rsa的名字,需要将密钥加入 SSH agent 才能被正确使用(见 git):
ssh-add ~/.ssh/jslite_rsa ssh-add -l # 查看所有的 key ssh-add -D # 删除所有的 key ssh-add -d ~/.ssh/jslite_rsa # 删除指定的 key场景延伸:批量部署
在 apk 文档的 Alpine 服务器初始化流程中,ssh-keygen与ssh-copy-id成对出现,用于搭建 Ansible 管理节点的免密通道:
apk add ansible # server ssh-keygen /etc/ansible/hosts apk add python # node ssh-copy-id这里的用法印证了 ssh-keygen 在自动化运维(Ansible 主机清单管理)中的基础地位:控制节点先生成密钥,再由ssh-copy-id分发至各被管节点。
注意事项
- 私钥权限:私钥文件应保持
600权限(chmod 600 ~/.ssh/id_rsa),公钥可为644,过宽的权限会被 SSH 客户端拒绝使用; - 口令取舍:带口令的私钥更安全,但会破坏自动化脚本的免交互特性,需根据场景权衡;
- 格式边界:
-i仅支持未加密密钥,转换前先确认目标文件是否设置了口令; - 类型支持:手册记载支持 RSA 与 DSA 两种类型,实际可用类型请以本机
ssh-keygen -t的提示与系统文档为准。
在 linux-command 仓库中如何查阅
- 命令正文:直接阅读 command/ssh-keygen.md;
- 关联实战:免密登录与密钥格式转换见 command/ssh.md,多账号与免密登录完整流程见 command/git.md,Alpine 批量部署场景见 command/apk.md;
- 索引入口:可通过 dist/data.json 中
ssh-keygen条目的路径字段定位到对应手册页。
掌握 ssh-keygen 的选项组合与配套工具链,即可完成从密钥生成、格式转换到免密登录的整套 SSH 认证管理。
- 文档
- 教程
【免费下载链接】linux-command
Linux命令大全搜索工具,内容包含Linux命令手册、详解、学习、搜集。https://git.io/linux
相关推荐
Aptos CLI E2E 测试包解析:用 Move 示例包验证 aptos move 子命令的端到端正确性
Aptos CLI E2E 测试包解析:用 Move 示例包验证 aptos move 子命令的端到端正确性 Aptos 官方 CLI 的 aptos move
文档教程Python SDK 快速起步:用 MCPServer 三步构建你的第一个 MCP 服务器
Python SDK 快速起步:用 MCPServer 三步构建你的第一个 MCP 服务器 本指南带你完整走通 MCP(Model Context Protoc
文档教程linux-command 命令手册精讲:nproc 处理器数量查询详解与实战
linux command 命令手册精讲:nproc 处理器数量查询详解与实战 本篇基于 linux command 仓库中的 command/nproc.md
文档教程
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考