news 2026/10/3 1:58:41

linux-command 手册精讲:ssh-keygen 命令的密钥生成、管理与格式转换实战

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
linux-command 手册精讲:ssh-keygen 命令的密钥生成、管理与格式转换实战
  • 文档
  • 教程

【免费下载链接】linux-command

Linux命令大全搜索工具,内容包含Linux命令手册、详解、学习、搜集。https://git.io/linux

项目地址:https://gitcode.com/GitHub_Trending/linux/linux-command
点击查看免费下载

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 文档给出了完整流程:

  1. 生成指定名字的密钥:

    ssh-keygen -t rsa -C "邮箱地址" -f ~/.ssh/jslite_rsa
  2. 复制公钥~/.ssh/jslite_rsa.pub内容到各托管平台;

  3. 编辑~/.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
  4. 使用ssh -T git@jslite.github.com或ssh -T work.github.com测试连通性;

  5. 克隆仓库时将地址中的域名替换为 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

项目地址:https://gitcode.com/GitHub_Trending/linux/linux-command
点击查看免费下载
上一篇:Shiny.BluetoothLE开发教程:轻松实现跨平台蓝牙通信
下一篇:PredNet架构详解:从stack_sizes到LSTM模块的参数配置秘籍

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/3 1:58:39

STM32F1自定义HID实战:寄存器级USB协议栈开发

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华