第4章 OpenSSL工具入门:安装与核心命令

做物联网双向认证,OpenSSL 是绕不开的工具。说白了,它就是咱们的「密码学瑞士军刀」——生成密钥、签发证书、验证链,全得靠它。我最早接触 OpenSSL 是在一个智能门锁项目里,当时被一堆命令搞得晕头转向。后来摸清了套路,发现其实常用的就那么几个。

这一章,咱们把 OpenSSL 的安装和五个核心命令讲透。你跟着敲一遍,后面做双向认证就顺了。

1. 安装 OpenSSL

大部分 Linux 发行版都预装了 OpenSSL。你可以先检查一下:

openssl version

如果没装,用包管理器安装就行:

系统 安装命令
Ubuntu/Debian sudo apt install openssl
CentOS/RHEL sudo yum install openssl
macOS brew install openssl
Windows 下载安装包或使用 WSL
我的建议: 在 Windows 上做 IoT 开发,我习惯用 WSL2。这样命令和 Linux 服务器完全一致,省去很多麻烦。

2. 五个核心命令详解

OpenSSL 命令多,但做证书相关的活儿,记住这五个就够了。我按使用顺序给你捋一遍。

2.1 genrsa —— 生成 RSA 密钥对

一切从密钥开始。genrsa 用来生成 RSA 私钥,公钥可以从私钥里提取。

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

# 从私钥提取公钥
openssl rsa -in device.key -pubout -out device.pub

为什么是 2048 位?1024 位现在被认为不够安全,4096 位性能开销大。对于物联网设备,2048 位是性能和安全的平衡点。我在一个传感器项目里试过 4096 位,设备握手时间长了将近一倍,果断换回 2048。

注意: 私钥文件一定要保护好!我曾经见过有人把私钥直接提交到 Git 仓库……嗯,那场面,整个认证体系都得重建。

2.2 req —— 生成证书签名请求(CSR)

有了密钥对,下一步是生成 CSR。CSR 就是向 CA 申请证书的「申请书」,里面包含公钥和设备信息。

openssl req -new -key device.key -out device.csr \
  -subj "/C=CN/ST=Beijing/L=Beijing/O=MyIoT/CN=device001"

这里 -subj 参数直接指定了证书信息,避免交互式输入。字段含义:

字段 含义 示例
C 国家 CN
ST 省份 Beijing
O 组织 MyIoT
CN 通用名称(设备标识) device001
避坑指南: CN 字段在双向认证中会被用来匹配设备身份。我曾经因为两个设备用了相同的 CN,导致认证混乱。每个设备的 CN 必须唯一!

2.3 x509 —— 自签名证书与证书查看

x509 命令功能很强大。最常用的两个场景:

场景一:生成自签名证书(测试用)

openssl x509 -req -in device.csr -signkey device.key \
  -out device.crt -days 365

场景二:查看证书内容

openssl x509 -in device.crt -text -noout

查看证书时,重点关注 Issuer(签发者)、Subject(主体)、Validity(有效期)和 X509v3 extensions(扩展字段)。双向认证中,扩展字段经常用来携带设备权限信息。

2.4 ca —— 用 CA 签发设备证书

这才是生产环境的做法。先准备好 CA 自己的密钥和证书,然后用 CA 给设备 CSR 签名。

# 第一步:生成 CA 密钥和自签名证书
openssl req -x509 -newkey rsa:2048 -keyout ca.key \
  -out ca.crt -days 3650 -nodes \
  -subj "/C=CN/O=MyIoT CA/CN=MyIoT Root CA"

# 第二步:用 CA 签发设备证书
openssl x509 -req -in device.csr -CA ca.crt -CAkey ca.key \
  -CAcreateserial -out device.crt -days 365

这里 -CAcreateserial 会生成一个序列号文件(ca.srl),CA 用它来保证每个证书的序列号唯一。我见过有人手动指定序列号,结果重复了——证书链验证直接挂掉。

核心要点: 生产环境中,CA 的私钥(ca.key)必须离线保存!我习惯把它放在一个不联网的 U 盘里,只在签发证书时挂载。

2.5 verify —— 验证证书链

证书签完了,怎么确认它有效?用 verify 命令。

# 验证设备证书是否由 CA 签发
openssl verify -CAfile ca.crt device.crt

# 验证多级证书链
openssl verify -CAfile root.crt -untrusted intermediate.crt device.crt

如果输出 device.crt: OK,说明证书链完整。如果报错,常见原因有:

  • 证书过期(检查 -days 参数)
  • CA 证书不匹配(用了不同的 CA 签发)
  • 证书被篡改(公钥与私钥不匹配)

我在一个项目中遇到过「间歇性验证失败」的怪问题。查了半天,发现是设备系统时间不准,证书被认为「尚未生效」。嗯,物联网设备的时间同步真的很重要。

3. 核心流程总览

把这五个命令串起来,就是完整的证书生成与验证流程。我画了张图,帮你理清关系:

OpenSSL 证书生成与验证流程 1. genrsa 生成密钥对 2. req 生成 CSR 3. x509/ca 签发证书 device.key(私钥) device.csr(签名请求) device.crt(证书) CA(证书颁发机构) ca.key(CA 私钥) ca.crt(CA 证书) ca.srl(序列号文件) CA 签名 4. verify 验证证书链

4. 常用命令速查表

平时干活,记不住所有参数很正常。我把最常用的命令整理成了一张表,你可以直接复制粘贴:

用途 命令
生成 RSA 私钥 openssl genrsa -out key.pem 2048
提取公钥 openssl rsa -in key.pem -pubout -out pub.pem
生成 CSR openssl req -new -key key.pem -out csr.pem -subj "/CN=device"
自签名证书 openssl x509 -req -in csr.pem -signkey key.pem -out cert.pem -days 365
CA 签发证书 openssl x509 -req -in csr.pem -CA ca.pem -CAkey ca.key -CAcreateserial -out cert.pem -days 365
查看证书 openssl x509 -in cert.pem -text -noout
验证证书链 openssl verify -CAfile ca.pem cert.pem
我的习惯: 我会把上面这些命令写成 shell 脚本,每次新建项目直接改个名字就能用。省时间,还不会敲错参数。

5. 常见问题与避坑

最后,分享几个我踩过的坑:

  • 私钥权限: 私钥文件一定要设置 chmod 600。我见过因为权限太松,私钥被其他进程读走的案例。
  • 证书格式: OpenSSL 默认用 PEM 格式(纯文本)。有些物联网平台要求 DER 或 PKCS12,可以用 openssl x509 -in cert.pem -outform der -out cert.der 转换。
  • 时间同步: 设备证书验证依赖系统时间。NTP 没配好,证书明明有效却验证失败——这种问题排查起来最头疼。
  • 序列号重复: 用 -CAcreateserial 让 OpenSSL 自动管理,别手动指定。