使用 openssl 创建自签名证书(CA证书)以及客户端和服务器证书涉及以下步骤。以下是完整的教程和代码示例。


1. 创建自签名 CA 证书

  1. 生成 CA 私钥

    openssl genrsa -out ca.key 2048
    
  2. **创建 CA 证书(有效期为10年)**:

    openssl req -x509 -new -nodes -key ca.key -sha256 -days 3650 -out ca.crt
    
    • 按提示输入证书信息(如国家、组织名等)。这会生成 ca.crt 文件。

2. 创建服务器证书

  1. 生成服务器私钥

    openssl genrsa -out server.key 2048
    
  2. **创建服务器证书签名请求(CSR)**:

    openssl req -new -key server.key -out server.csr
    
    • Common Name (CN) 部分填写服务器的域名(例如 ``)。
  3. 使用 CA 签署服务器证书

    openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt -days 3650 -sha256
    
    • ca.srl 文件会自动生成,包含 CA 的序列号。

3. 创建客户端证书

  1. 生成客户端私钥

    openssl genrsa -out client.key 2048
    
  2. **创建客户端证书签名请求(CSR)**:

    openssl req -new -key client.key -out client.csr
    
    • Common Name (CN) 部分可以填写设备 ID,例如 client_12345
  3. 使用 CA 签署客户端证书

    openssl x509 -req -in client.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out client.crt -days 3650 -sha256
    

4. 验证证书

  1. 验证 CA 签署的服务器证书:

    openssl verify -CAfile ca.crt server.crt
    
  2. 验证 CA 签署的客户端证书:

    openssl verify -CAfile ca.crt client.crt
    

如果一切正常,输出将类似于:

server.crt: OK
client.crt: OK

5. 使用生成的证书配置 MQTT

将生成的文件放置在合适的路径下,代码中的对应参数分别如下:

  • CA 证书 (ca.crt):用于验证服务器和客户端的身份。
  • 服务器证书 (server.crt) 和私钥 (server.key):用于配置 MQTT Broker。
  • 客户端证书 (client.crt) 和私钥 (client.key):用于配置 MQTT 客户端。

6. 示例:MQTT Broker 配置

以 Mosquitto 为例,编辑 mosquitto.conf

listener 8883
cafile /path/to/ca.crt
certfile /path/to/server.crt
keyfile /path/to/server.key
require_certificate true

启动 Mosquitto:

mosquitto -c /path/to/mosquitto.conf

7. 示例:MQTT 客户端配置

在客户端代码中引用证书:

import ssl
import paho.mqtt.client as mqtt

client = mqtt.Client()
client.tls_set(
    ca_certs="ca.crt",
    certfile="client.crt",
    keyfile="client.key",
    tls_version=ssl.PROTOCOL_TLSv1_2
)

client.connect("", 8883)
client.loop_start()
client.publish("test/topic", "Hello, secure MQTT!")

总结

通过 openssl 生成的 CA、自签名服务器证书和客户端证书,您可以构建一个安全的 MQTT 传输环境,确保设备身份认证和数据加密安全。