• 【MQTT】mosquitto库中SSL/TLS相关API接口



    Mosquitto 是一个流行的 MQTT 消息代理(broker),它支持使用 SSL/TLS 来保障通信的安全性。有关于SSL/TLS的介绍可参考: SSL/TLS介绍。下面是与 SSL/TLS 相关的 Mosquitto 库中的一些重要 API:

    1.相关API

    1.1 mosquitto_tls_set

    int mosquitto_tls_set(struct mosquitto *mosq, const char *cafile, const char *capath, const char *certfile, const char *keyfile, int (*pw_callback)(char *buf, int size, int rwflag, void *userdata));
    
    • 1

    该函数用于设置 SSL/TLS 相关参数。它接受以下参数:

    • mosq: 指向 mosquitto 实例的指针。
    • cafile: 包含 CA 证书的文件路径。
    • capath: 包含 CA 证书的文件夹路径。
    • certfile: 包含客户端 SSL 证书的文件路径(如果需要)。
    • keyfile: 包含客户端私钥的文件路径(如果需要)。
    • pw_callback: 一个回调函数,如果设置了密码则用于获取密码。

    1.2 mosquitto_tls_insecure_set

    int mosquitto_tls_insecure_set(struct mosquitto *mosq, bool value);
    
    • 1

    这个函数允许你设置是否对不受信任的服务器证书进行验证。将 value 设置为 true 将禁用服务器证书验证,这在测试环境中可能会有用,但在生产环境中请务必谨慎使用。

    1.3 mosquitto_tls_opts_set

    int mosquitto_tls_opts_set(struct mosquitto *mosq, int option, const void *value);
    
    • 1

    允许你设置与 TLS 相关的其他选项,例如用于自定义验证的回调函数等。

    1.4 mosquitto_tls_insecure_set

    int mosquitto_tls_insecure_set(struct mosquitto *mosq, bool value);
    
    • 1

    如果将 value 设置为 true,则会禁用服务器证书的验证。

    1.5 mosquitto_tls_set_context

    int mosquitto_tls_set_context(struct mosquitto *mosq, SSL_CTX *ctx);
    
    • 1

    允许你使用自定义的 OpenSSL SSL_CTX 对象来配置 TLS 连接。

    1.6 mosquitto_tls_psk_set

    int mosquitto_tls_psk_set(struct mosquitto *mosq, const char *psk, const char *identity, const char *ciphers);
    
    • 1

    如果你要使用 Pre-Shared Key(PSK)来保障连接安全,可以使用这个函数。

    这些是一些与 SSL/TLS 相关的 Mosquitto 库中的重要 API。使用这些函数,你可以配置 Mosquitto 实例以在 MQTT 通信中使用 SSL/TLS 进行安全保护。务必在使用这些函数时参考 Mosquitto 的官方文档以获取详细的信息和示例代码。

    2.示例代码

    #include 
    
    int main(int argc, char **argv) 
    {
        struct mosquitto *mosq = NULL;
        const char *host = "mqtt.example.com";
        int port = 8883; // 默认 MQTT over SSL/TLS 端口
        const char *topic = "example/topic";
        const char *message = "Hello, MQTT with SSL/TLS!";
        
        mosquitto_lib_init();
    
        mosq = mosquitto_new(NULL, true, NULL);
        if (!mosq) 
        {
            fprintf(stderr, "Error: Unable to create Mosquitto instance.\n");
            return 1;
        }
    
        // 设置 SSL/TLS 参数
        mosquitto_tls_set(mosq, "/path/to/ca.crt", NULL, "/path/to/client.crt", "/path/to/client.key", NULL);
    
        // 连接到 MQTT 服务器
        int rc = mosquitto_connect(mosq, host, port, 60);
        if (rc) 
        {
            fprintf(stderr, "Error: Unable to connect to the MQTT broker. Return code: %d\n", rc);
            mosquitto_destroy(mosq);
            mosquitto_lib_cleanup();
            return 1;
        }
    
        // 发布消息
        rc = mosquitto_publish(mosq, NULL, topic, strlen(message), message, 0, false);
        if (rc) 
        {
            fprintf(stderr, "Error: Unable to publish message. Return code: %d\n", rc);
        }
    
        // 断开连接并清理资源
        mosquitto_disconnect(mosq);
        mosquitto_destroy(mosq);
        mosquitto_lib_cleanup();
    
        return 0;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47

    此示例使用了 mosquitto_tls_set 函数来设置 SSL/TLS 相关参数,然后连接到 MQTT 服务器并发布一条消息。记得在实际应用中,还需要添加更多的错误处理和安全性检查,这里不多加赘述。

  • 相关阅读:
    C++之委托构造函数实例(二百四十三)
    接上一篇:分布式调用链追踪系统设计
    Kubernetes创建Service访问Pod
    Linux之文件打包,压缩,解压
    【强化学习高阶技巧】Experience Replay经验回报
    家店wifi软件开发搭建平台
    本地虚机Jumpserver使用域名访问报错 使用IP+端口没有错误
    pandas写入MySQL
    redis的eval命令
    [git]上传代码到github
  • 原文地址:https://blog.csdn.net/weixin_52018852/article/details/133471221