第三章 命令行基础:命令结构、帮助文档与常用子命令

你第一次打开终端敲 openssl 的时候,是不是有点懵?

我当时也是。

黑框里弹出一大段英文,什么 Standard commands、Message Digest commands……说实话,那时我还分不清哪个是加密哪个是签名。后来项目催得紧,硬着头皮啃了几天文档,才摸清楚 OpenSSL 的命令行到底怎么组织的。今天这一章,我就把那些“门道”跟你讲讲。

命令行的整体骨架

OpenSSL 的命令行就一个套路:

openssl <子命令> [选项] [参数]

比如:

openssl enc -aes-256-cbc -in plain.txt -out encrypted.bin
openssl req -new -key mykey.pem -out myreq.csr

子命令决定了你要做什么——加密、签名、生成证书、测试连接……后面的选项和参数是细节。我建议你把这个模板刻在脑子里,以后遇到任何工具都先找它的“子命令结构”。

小技巧:记不住子命令?直接敲 openssl help 或 openssl --help,所有子命令都会列出来。我曾经连着加班三天,靠这行命令躲过了无数次查阅备忘的时间。

版本查看:你手里拿的是哪把刀

先看看你装的是哪一个版本:

openssl version

输出类似:

OpenSSL 3.0.12 22 Aug 2024 (Library: OpenSSL 3.0.12 22 Aug 2024)

版本信息非常重要。不同的版本支持的算法、默认行为都不一样。我记得有一次线上环境用的 OpenSSL 1.0.2,本地开发用的 3.0,同样的命令参数,证书解析结果完全不同……排查了半天才发现是版本差异。

想看更详细的信息:

openssl version -a

会输出编译选项、OpenSSL 目录、引擎列表等。我通常用这个命令来确认环境是否支持硬件加速或者特定的密码套件。

帮助文档:最被低估的老师

很多人遇到问题就上网搜。其实 OpenSSL 自带的帮助文档非常全,只是藏得有点深。

  • 子命令的帮助:openssl enc --help 或 openssl enc -?。我用 -? 更多,因为手快。
  • 所有子命令列表:openssl list -commands。这会输出一行一个子命令名,比如 aes-128-cbc、ca、ciphers……
  • 标准命令、消息摘要命令、密码命令分类查看:openssl list -standard-commands、openssl list -digest-commands、openssl list -cipher-commands。我在写自动化脚本时常常用这几个命令来动态获取可用算法列表。
注意:OpenSSL 3.0 之后,openssl help 的输出格式变了。旧版可能显示的是“Available commands”加一段描述,新版更紧凑。如果你看到输出和你网上的教程不一样,先检查版本。

常用子命令一览

说几个你一定会用到的子命令。我按用途分组列了个表,方便你对照。

功能类别 常用子命令 典型场景
对称加密 / 解密 enc 加密文件、流加密(AES、DES 等)
非对称密钥 genrsa、rsa、pkey 生成 RSA 密钥、查看私钥、转换格式
证书 & CSR req、x509、ca 生成证书签名请求、查看证书、自签证书
SSL/TLS 连接 s_client、s_server 测试远程服务器 TLS 握手、模拟客户端 / 服务器
摘要与随机数 dgst、rand 计算文件哈希、生成随机字节
速度测试 speed 基准测试:加密/解密每秒能处理多少数据

你可能发现了,enc 和 dgst 是最常用的两个命令。我项目初期经常要批量加密日志文件,一个 openssl enc -aes-256-cbc 配上脚本,瞬间搞定几十个 G 的数据。但是要小心,enc 默认用的不是认证加密模式(如 GCM),如果你需要防篡改,得加 -auth 参数或改用 cms 子命令。这个坑我后面会专门讲。

如何快速找到你要的子命令

有两个方式我天天用:

  1. 模糊搜索:如果你只记得部分名字,可以用 openssl list -commands | grep <关键词>。比如想看所有和“rsa”相关的:openssl list -commands | grep rsa。我习惯把它写到一个小别名里:alias ossl-find='openssl list -commands | grep'。
  2. 按字母顺序浏览:直接 openssl list -commands | sort。配合 less 慢慢翻,很放松。
经验之谈:我遇到过一种情况——用 openssl help 列出的子命令和 openssl list -commands 列出的不一致。后来发现 help 只显示“常用”子命令,而 list -commands 显示所有编译进来的子命令。如果你发现某个命令在文档里提到但你的机器没有,试试 list -commands 先确认它是否存在。

本章知识体系

下面这张图把 OpenSSL 命令行的核心结构串起来了。你一看就明白各个部分的关系。

OpenSSL 命令行结构体系 openssl 命令 对称加密 非对称密钥 证书管理 连接测试 摘要/随机数 enc genrsa / pkey req / x509 s_client / s_server dgst / rand 💡 记住:一切操作从 openssl 开始,后面紧跟子命令。子命令按功能分为几大类,每个大类下又有多个具体命令。 双击任何子命令的子命令(如 enc)可以用 --help 查看完整选项。

这张图把 OpenSSL 的命令结构拆成了五类。我建议你对照着图,挨个敲一遍对应的命令,感受一下每个子命令的输入输出。比如试试:

openssl enc -list   # 查看支持的加密算法
openssl dgst -sha256 /etc/hostname   # 计算文件摘要
openssl s_client -connect example.com:443   # 测试TLS连接

实践几次你就找到感觉了。

避坑:命令参数顺序有坑

OpenSSL 的命令行参数有一定顺序,但不像某些工具那么严格。我踩过最蠢的坑是 openssl enc 的 -in 和 -out 写反了,结果把自己的原文件覆盖成了加密数据……当时备份都没做,差点被老板骂。从那以后我执行任何修改性命令前一定先做一次 cp 备份,或者在 -out 后面加一个明显的新文件名,比如 encrypted.bin 而不是 out.bin。

还有个常犯的错误:用 -pass pass:xxx 直接在命令行里写密码。这个在进程列表里是明文的,生产环境不能这么干。建议用 -pass file:/path/to/passfile 或环境变量。我记得有一次做安全审计,发现别人遗留的脚本里明文密码还留着,赶紧让人改了。

推荐做法:开一个别名 alias ossl='openssl',能省一点敲击。但千万别因为省事就省略参数校验。

好了,命令行基础就到这里。你记住一点:OpenSSL 的命令行并不可怕,它只是遵循了一个清晰的“子命令+选项”模型。只要你会用 --help、version、list -commands 这三个命令,就已经掌握了90%的导航能力。接下来我们会逐个深入这些子命令,别急,一个一个来。