4. 自签名证书生成:使用 OpenSSL 生成 CA 根证书、服务器私钥与证书请求 (CSR)、签发服务器证书
在生产环境中,推荐使用受信任的第三方 CA(如 Let’s Encrypt、DigiCert)签发的证书。但在开发、测试或内网部署场景下,自签名证书是快速启用 HTTPS 的可行方案。本节将演示如何使用 OpenSSL 工具,从零构建一套完整的证书链:CA 根证书 → 服务器私钥与 CSR → 签发服务器证书。
前置条件:确保 ThingsBoard 服务器已安装 OpenSSL(通常 Linux 发行版已预装)。可通过
openssl version 命令验证。
4.1 整体流程概览
自签名证书的生成遵循严格的层级信任模型。下图展示了从 CA 根证书到最终服务器证书的完整签发链路:
4.2 生成 CA 根证书
CA 根证书是整个信任链的基石。首先创建 CA 私钥,然后使用该私钥自签名生成根证书。
4.2.1 创建 CA 私钥
openssl genrsa -out ca.key 2048
参数说明:genrsa 生成 RSA 私钥,-out ca.key 指定输出文件,2048 为密钥长度(推荐 2048 位以上)。
4.2.2 生成 CA 根证书(自签名)
openssl req -x509 -new -nodes -key ca.key -sha256 -days 3650 -out ca.crt \
-subj "/C=CN/ST=Beijing/L=Beijing/O=ThingsBoard Lab/OU=Security/CN=MyLab CA"
关键参数:
-x509:直接输出自签名证书,而非 CSR。-days 3650:有效期 10 年(测试环境可适当缩短)。-subj:证书主体信息,CN字段应体现 CA 身份。
安全提醒:CA 私钥
ca.key 是信任链的根,必须严格保护。建议设置文件权限为 400,并离线存储备份。
4.3 生成服务器私钥与证书请求 (CSR)
服务器证书的私钥必须独立于 CA 私钥。先生成服务器私钥,再基于该私钥生成 CSR,CSR 中包含服务器的公钥和身份信息。
4.3.1 创建服务器私钥
openssl genrsa -out server.key 2048
4.3.2 生成证书请求 (CSR)
openssl req -new -key server.key -out server.csr \
-subj "/C=CN/ST=Beijing/L=Beijing/O=ThingsBoard/OU=Server/CN=thingsboard.example.com"
重要:CN 字段必须填写 ThingsBoard 服务器的实际域名或 IP 地址。如果使用 IP 访问,CN 应设为 IP(如 CN=192.168.1.100),但现代浏览器更推荐使用域名。
4.4 使用 CA 签发服务器证书
CA 使用自己的私钥和根证书,对服务器 CSR 进行签名,生成最终的服务器证书。签名时可以指定扩展属性,如 SAN(Subject Alternative Name),以支持多个域名或 IP。
4.4.1 创建扩展配置文件(可选但推荐)
创建 server.ext 文件,内容如下:
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage=digitalSignature,nonRepudiation,keyEncipherment,dataEncipherment
subjectAltName=@alt_names
[alt_names]
DNS.1=thingsboard.example.com
DNS.2=*.thingsboard.example.com
IP.1=192.168.1.100
4.4.2 签发服务器证书
openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial \
-out server.crt -days 365 -sha256 -extfile server.ext
参数说明:
-CA ca.crt -CAkey ca.key:指定 CA 证书和私钥。-CAcreateserial:自动创建序列号文件ca.srl。-extfile server.ext:加载扩展配置,注入 SAN。-days 365:服务器证书有效期 1 年,建议定期轮换。
4.5 生成产物清单与用途
| 文件 | 类型 | 保密级别 | 用途 |
|---|---|---|---|
ca.key |
CA 私钥 | 极高(离线存储) | 签发其他证书,不可泄露 |
ca.crt |
CA 根证书 | 公开 | 客户端信任锚,验证服务器证书 |
server.key |
服务器私钥 | 高(仅服务器持有) | ThingsBoard 配置 TLS 时使用 |
server.csr |
证书请求 | 低(中间产物) | 提交给 CA 签名,签名后可删除 |
server.crt |
服务器证书 | 公开 | ThingsBoard 配置 TLS 时使用 |
4.6 验证证书链
签发完成后,务必验证服务器证书是否由 CA 正确签发,以及证书链是否完整。
# 验证服务器证书是否由 ca.crt 签发
openssl verify -CAfile ca.crt server.crt
# 查看证书详细信息
openssl x509 -in server.crt -text -noout | grep -E "Subject:|Issuer:|Not Before|Not After|Subject Alternative Name"
如果验证输出 server.crt: OK,说明证书链有效。若出现错误,请检查 CA 证书与服务器证书的匹配性,以及 SAN 配置是否正确。
实践建议:在 ThingsBoard 生产环境中,建议将
server.crt 与 ca.crt 合并为一个证书链文件 chain.pem,以便某些客户端能够完整验证。合并命令:cat server.crt ca.crt > chain.pem。