4. 自签名证书生成:使用 OpenSSL 生成 CA 根证书、服务器私钥与证书请求 (CSR)、签发服务器证书

在生产环境中,推荐使用受信任的第三方 CA(如 Let’s Encrypt、DigiCert)签发的证书。但在开发、测试或内网部署场景下,自签名证书是快速启用 HTTPS 的可行方案。本节将演示如何使用 OpenSSL 工具,从零构建一套完整的证书链:CA 根证书 → 服务器私钥与 CSR → 签发服务器证书。

前置条件:确保 ThingsBoard 服务器已安装 OpenSSL(通常 Linux 发行版已预装)。可通过 openssl version 命令验证。

4.1 整体流程概览

自签名证书的生成遵循严格的层级信任模型。下图展示了从 CA 根证书到最终服务器证书的完整签发链路:

自签名证书签发流程 自签名证书签发流程 1. 生成CA私钥 ca.key (2048位RSA) 2. 生成CA根证书 ca.crt (自签名) 3. 生成服务器私钥 server.key (2048位RSA) 4. 生成CSR server.csr 5. CA签发服务器证书 server.crt (CA签名) 最终产物:ca.crt(信任锚)+ server.key(私钥)+ server.crt(服务器证书) 将 ca.crt 导入客户端信任库,server.key 和 server.crt 配置到 ThingsBoard

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。