3、OpenSSL 工具速览:安装、常用命令与配置文件解析

做 MQTT 双向认证,说白了就是跟证书打交道。而 OpenSSL,就是咱们手里最趁手的那把刀。这一章我不打算给你念手册,而是把我平时怎么装、怎么用、怎么配的那套经验直接摊开来讲。

你想想看,后面二十多章全得靠它生成 CA、签发证书、做验证。如果现在不把 OpenSSL 摸熟,后面每一步都会卡壳。嗯,咱们就从安装开始,一路走到配置文件的核心逻辑。

3.1 安装 OpenSSL:不同平台怎么搞

OpenSSL 几乎是个标准件了,大部分系统都自带。但我建议你还是确认一下版本——低于 1.1.1 的,赶紧升级。为什么?因为老版本不支持 TLS 1.3,而且有些椭圆曲线算法也不全。

操作系统 安装方式 检查版本命令
Ubuntu / Debian sudo apt install openssl openssl version
CentOS / RHEL sudo yum install openssl openssl version
macOS (Homebrew) brew install openssl openssl version
Windows 下载 Win64 OpenSSL 安装包 openssl version
我的习惯:在 Linux 上我一般用 openssl version -a 看完整信息,包括编译参数和 OpenSSL 目录。Windows 用户记得把安装路径加到 PATH 环境变量里,不然每次都得敲全路径。

3.2 常用命令概览:四把刀

OpenSSL 命令多得吓人,但做证书双向认证,你只需要记住四个核心命令。我把它们叫做「四把刀」——每把刀干一件事,清清楚楚。

3.2.1 genrsa:生成 RSA 私钥

这是第一步。没有私钥,后面全是空谈。

# 生成 2048 位的 RSA 私钥
openssl genrsa -out server.key 2048

# 查看私钥内容(别泄露出去)
openssl rsa -in server.key -text -noout

我个人习惯用 2048 位,安全性和性能平衡得最好。4096 位当然更安全,但握手时 CPU 开销明显增加。IoT 设备性能有限,2048 是黄金标准。

我曾经踩过的坑:有一次生成私钥时忘了设文件权限,结果私钥被其他进程读走了。记住:私钥文件一定要 chmod 600,只有所有者能读写。

3.2.2 req:生成证书签名请求(CSR)

有了私钥,下一步就是生成 CSR。CSR 相当于「请愿书」——你把公钥和身份信息打包,交给 CA 去签名。

# 从现有私钥生成 CSR
openssl req -new -key server.key -out server.csr -subj "/CN=mqtt.example.com"

# 查看 CSR 内容
openssl req -in server.csr -text -noout

-subj 参数里的 CN(Common Name)特别重要。MQTT 客户端验证服务器时,会检查证书的 CN 是否匹配连接的域名。我见过有人把 CN 写成 IP 地址,结果客户端死活连不上——嗯,这里要注意,CN 最好用域名。

3.2.3 x509:签发与查看证书

x509 命令功能很强大。既能当 CA 去签发证书,也能查看证书详情。

# 自签名证书(测试用)
openssl x509 -req -in server.csr -signkey server.key -out server.crt -days 365

# 查看证书信息
openssl x509 -in server.crt -text -noout

自签名证书只适合开发环境。生产环境一定要用 CA 签名,否则客户端会报警告。后面几章我会专门讲怎么搭自己的 CA。

3.2.4 ca:用 CA 签发证书

这才是生产环境的正确姿势。先有 CA 根证书,再用它去签服务器和客户端证书。

# 用 CA 签发服务器证书
openssl ca -in server.csr -out server.crt -cert ca.crt -keyfile ca.key -days 365

这个命令依赖一个配置文件,咱们下一节细说。

3.3 配置文件解析:openssl.cnf 的秘密

很多人觉得 OpenSSL 配置文件又臭又长,直接跳过。我刚开始也这么干,结果签发证书时总报错。后来老老实实读了一遍,才发现里面全是关键信息。

配置文件通常位于 /etc/ssl/openssl.cnf(Linux)或 C:\Program Files\OpenSSL-Win64\bin\openssl.cfg(Windows)。核心结构就三块:

配置段 作用 关键参数
[ req ] 定义 CSR 生成规则 distinguished_name、req_extensions
[ ca ] 定义 CA 签发行为 default_ca 指向具体 CA 配置段
[ CA_default ] CA 的具体参数 database、serial、new_certs_dir

我最常改的是 [ CA_default ] 里的路径。默认指向 /etc/ssl,但我习惯在项目目录下建一个 ca 文件夹,把所有证书相关文件放一起,方便管理。

[ CA_default ]
dir             = ./ca              # 工作目录
database        = $dir/index.txt    # 证书数据库
serial          = $dir/serial       # 序列号文件
new_certs_dir   = $dir/newcerts     # 新证书存放目录
核心要点:index.txt 和 serial 是 CA 的「账本」。index.txt 记录所有已签发证书的状态,serial 记录下一个序列号。这两个文件必须存在,否则 openssl ca 命令会报错。

3.4 知识体系总览

下面这张图把 OpenSSL 在证书双向认证中的角色串起来了。你可以把它当作本章的「地图」——后面每走一步,都能在这张图上找到位置。

OpenSSL 在证书双向认证中的核心流程 OpenSSL 在证书双向认证中的核心流程 genrsa 生成 RSA 私钥 req 生成 CSR ca / x509 签发证书 openssl.cnf 配置文件 定义 CA 路径、数据库、序列号、扩展策略 ca.crt / ca.key CA 根证书与私钥 server.crt / server.key 服务器证书与私钥 client.crt / client.key 客户端证书与私钥 MQTT 双向认证 服务器验证客户端证书 + 客户端验证服务器证书

3.5 避坑指南:我踩过的三个坑

最后分享几个实战中容易翻车的地方。你提前知道,就能绕过去。

  • 私钥权限没设对:生成私钥后立刻 chmod 600,否则 OpenSSL 会警告,而且有安全风险。
  • index.txt 和 serial 没创建:用 openssl ca 前,先手动创建 index.txt(空文件)和 serial(内容为 01)。我一开始不知道,折腾了半小时。
  • CN 和 SAN 不匹配:现代浏览器和 MQTT 客户端优先检查 SAN(Subject Alternative Name),而不是 CN。生成 CSR 时最好加上 SAN 扩展。后面章节我会专门讲怎么配。
一个小技巧:我习惯在项目目录下放一个自定义的 openssl.cnf,把 CA 路径、证书有效期、扩展策略都写死。这样每次签发证书时,只用 -config ./openssl.cnf 指定一下,省得改全局配置。

好了,OpenSSL 的安装、四把刀、配置文件核心逻辑,咱们都过了一遍。你心里应该有个谱了——后面生成 CA、签发服务器和客户端证书,全靠这一章打底。