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 |
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 在证书双向认证中的角色串起来了。你可以把它当作本章的「地图」——后面每走一步,都能在这张图上找到位置。
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、签发服务器和客户端证书,全靠这一章打底。