第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 |
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。
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 |
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 用它来保证每个证书的序列号唯一。我见过有人手动指定序列号,结果重复了——证书链验证直接挂掉。
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. 核心流程总览
把这五个命令串起来,就是完整的证书生成与验证流程。我画了张图,帮你理清关系:
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 |
5. 常见问题与避坑
最后,分享几个我踩过的坑:
- 私钥权限: 私钥文件一定要设置
chmod 600。我见过因为权限太松,私钥被其他进程读走的案例。 - 证书格式: OpenSSL 默认用 PEM 格式(纯文本)。有些物联网平台要求 DER 或 PKCS12,可以用
openssl x509 -in cert.pem -outform der -out cert.der转换。 - 时间同步: 设备证书验证依赖系统时间。NTP 没配好,证书明明有效却验证失败——这种问题排查起来最头疼。
- 序列号重复: 用
-CAcreateserial让 OpenSSL 自动管理,别手动指定。