国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

mosquito服務(wù)器實(shí)現(xiàn) ssl/tls 安全配置通信

這篇具有很好參考價(jià)值的文章主要介紹了mosquito服務(wù)器實(shí)現(xiàn) ssl/tls 安全配置通信。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

1、ssl/tls通信證書(shū)配置

????????要想實(shí)現(xiàn)moquitto 服務(wù)器證書(shū)加密通信,首先要自己生成client 和server的證書(shū),證書(shū)生成又需要簽名證書(shū),一般簽名證書(shū)是第三方機(jī)構(gòu)來(lái)提供,但我們自己也可以實(shí)現(xiàn)簽名證書(shū)生成,下面是具體簽名證書(shū)的生成步驟:

1.1?生成自己CA簽發(fā)證書(shū)(該證書(shū)用于給server和client 生成證書(shū))

????????1.1.1 生成 rootca 證書(shū)命令

????????????????openssl genrsa -out rootCA.key 2048

????????1.1.2 根據(jù)key 生成csr 文件(發(fā)給ca 機(jī)構(gòu),生成crt證書(shū))

?????? ?????? openssl req -new -out rootCA.csr -key rootCA.key

? ? ? ? ? ? ?????????注意:這里會(huì)提示 輸入國(guó)家,省份,城市,公司,等等信息,可以自定義填寫(xiě),但要記住你填了什么,因?yàn)楹竺婧灠l(fā)client, server證書(shū)的時(shí)候也需要;

?????????1.1.3?CA機(jī)構(gòu)根據(jù)CSR(證書(shū)簽發(fā)請(qǐng)求)(自己給自己)簽發(fā)證書(shū)

????????????? openssl x509 -req -sha1 -in rootCA.csr -out rootCA.crt -signkey rootCA.key -days?3650

? ? ? ? ?到此簽發(fā)證書(shū)已經(jīng)生成,會(huì)在目錄一下看到有rootCA.csr?rootCA.crt?rootCA.key 三個(gè)文件

? ? ? ? rootCA.crt 就是后面要用的簽發(fā)證書(shū);

1.2? 使用上面制作的簽發(fā)跟證書(shū)為server 和client 生成相應(yīng)的私鑰和證書(shū)

????????1.2.1 先生成server key, 在用server key 生成server csr(簽名請(qǐng)求),使用root ca (????????? 證? ? ? ? ? ? ? ? ? 書(shū)簽發(fā)機(jī)構(gòu)CA)和server csr 生成server.crt 證書(shū)

? ? ? ? ? ? ? ? 首先自己生成server的私鑰,

? ? ? ? ? ? ? ?openssl genrsa -out server.key 2048

????????????????生成簽名請(qǐng)求 server.csr(用于生成證書(shū))

????????? ? ?openssl req -new -out server.csr -key server.key

? ? ? ? ? ? ?使用私鑰,根證書(shū),生成證書(shū)

????????openssl x509 -req -in server.csr -CA rootCA.crt -CAkey rootCA.key -CAcreateserial -out server.crt -days 3650

到此server.key 和server.crt 已生成; client 證書(shū)通過(guò)以上三條命令生成

注:Client 一樣 (common name server 和client 應(yīng)該都是server ip) CA 的common name 應(yīng)該設(shè)置為0.0.0.0

1.2.2 證書(shū)校驗(yàn)命令

openssl verify -CAfile ca/rootCA.crt client/client.crt (校驗(yàn)證書(shū)是否可以使用)

2.?修改mosquitto 配置文件支持證書(shū)加密

cp /etc/mosquito/mosquito.conf.example? /etc/mosquito/mosquito.conf.example

修改配置文件權(quán)限,添加mosquitto 權(quán)限

groupadd mosquitto

useradd -g mosquitto mosquitto

chown -R mosquitto:mosquitto /etc/mosquitto/

配置允許匿名訪問(wèn)。

allow_anonymous true

require_certificate true?

use_identity_as_username? true? ? ? ? ? ?//單雙向驗(yàn)證配置, false 單項(xiàng)(默認(rèn)),true 雙向

cafile ?(需要填寫(xiě)絕對(duì)路徑)

certfile (需要填寫(xiě)絕對(duì)路徑)

修改完配置,重啟mosquitto server 即可;

2.2?測(cè)試mosquitto 命令

?????? mosquitto_sub -h 10.30.11.47 -p 8884 -t "mqtt/server/topic" --cafile ./ca/ca.crt &

單項(xiàng)驗(yàn)證

mosquitto_sub -h 10.30.11.47 -p 8883 -t "mqtt/server/topic" --cafile ./ca/ca.crt --cert ./client/client.pem --key ./client/client.key &

雙向驗(yàn)證

在啟動(dòng)訂閱端的時(shí)候,加上“--insecure”參數(shù), 啟動(dòng)的時(shí)候?qū)⒉辉傩r?yàn)common name;

3?mosquitto api demo

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "mosquitto.h"

//server ip
#define HOST "xx.xx.xx.xx"   
#define PORT 8883
#define KEEP_ALIVE 60
#define MSG_MAX_SIZE 512
static int running = 1;

void my_connect_callback(struct mosquitto* mosq, void* obj, int rc)
{
    printf("Call the function:on_connect\n");
    if (rc)
    {
        printf("on_connect error!\n");
        exit(1);
    }
    else
    {
        for (int i = 0; i < 10; i++)
        {
            char topic[1024] = { 0 };
            snprintf(topic, sizeof(topic), "HELLOMQTT%d", i); //連接成功后初始化所有的topic
            if (mosquitto_subscribe(mosq, NULL, topic, 2))
            {
                printf("Set the topic error!\n");
                exit(1);
            }
        }
    }
}

void my_disconnect_callback(struct mosquitto* mosq, void* obj, int rc)
{
    printf("Call the function: my_disconnect_callback\n");
    running = 0;
}

//初始化topic的時(shí)候,會(huì)調(diào)用這個(gè)回調(diào)
void my_subscribe_callback(struct mosquitto* mosq, void* obj, int mid, int qos_count, const int* granted_qos)
{
    printf("Call the function: on_subscribe\n");
}
//topic 訂閱到之后,回調(diào)處理
void my_message_callback(struct mosquitto* mosq, void* obj, const struct mosquitto_message* msg)
{
    printf("Call the function: on_message\n");
    printf("Recieve a message of %s: %s\n.", (char*)msg->topic, (char*)msg->payload);
    if (0 == strcmp((const char*)msg->payload, "quit")) {
        mosquitto_disconnect(mosq);
    }
}
//初始化設(shè)置cert 和 設(shè)置不校驗(yàn)common name (--insecure)
int init_config(struct mosquitto* mosq)
{
    int rc;
    const char* firstMessage = "himqtt";

    if (mosquitto_will_set(mosq, "HELLOMQTT",
        strlen(firstMessage), firstMessage, 0,
        true )) {
        printf("Error: Problem setting will.\n");
        mosquitto_lib_cleanup();
        return 1;
    }

    {
        rc = mosquitto_tls_set(mosq,"Y:/\mosquitto/\ca/\\rootCA.crt",         
                "Y:/\mosquitto/\ca", "Y:/\mosquitto/\client/\client.crt", 
                 "Y:/\mosquitto/\client/\client.key", NULL);
        if (rc) {
            if (rc == MOSQ_ERR_INVAL) {
                printf("Error: Problem setting TLS options: File not found.\n");
            }
            else 
            {
                printf("Error: Problem setting TLS options: %s.\n", 
                   mosquitto_strerror(rc));
            }
            mosquitto_lib_cleanup();
            return 1;
        }
    }
//該函數(shù)是設(shè)置不校驗(yàn)證書(shū)的common name 也就是CN 
    if (mosquitto_tls_insecure_set(mosq, true)) {
        printf("Error: Problem setting TLS insecure option.\n");
        mosquitto_lib_cleanup();
        return 1;
    }
}

int main(int argc, char** argv)
{
    int ret;
    struct mosquitto* mosq;
    ret = mosquitto_lib_init();
    mosq = mosquitto_new("sub_test", true, NULL);
    if (mosq == NULL)
    {
        printf("New sub_test error!\n");
        mosquitto_lib_cleanup();
        return -1;
    }
    init_config(mosq);
    mosquitto_connect_callback_set(mosq, my_connect_callback);
    mosquitto_disconnect_callback_set(mosq, my_disconnect_callback);
    mosquitto_subscribe_callback_set(mosq, my_subscribe_callback);
    mosquitto_message_callback_set(mosq, my_message_callback);

    ret = mosquitto_connect(mosq, HOST, PORT, KEEP_ALIVE);
    if (ret)
    {
        printf("Connect server error!\n");
        mosquitto_destroy(mosq);
        mosquitto_lib_cleanup();
        return -1;
    }
    printf("Start!\n");
    while (running)
    {
        mosquitto_loop(mosq, -1, 1);
        //mosquitto_loop_start(mosq);
    }
    mosquitto_destroy(mosq);
    mosquitto_lib_cleanup();
    printf("End!\n");

    return 0;
}

注意:mosquitto_tls_set? ? 證書(shū)配置要寫(xiě)對(duì)

? ? ? ? ? ?mosquitto_tls_insecure_set(mosq, true)

? ? ? ? ? ?要設(shè)置不校驗(yàn)CN 不然可能會(huì)出現(xiàn)連接mosquitto server的失敗

至此mosqutto server的證書(shū)雙向校驗(yàn)配置結(jié)束;雖然寫(xiě)的很簡(jiǎn)陋,主要是本人配置過(guò)程中遇到的一些難點(diǎn),記錄下來(lái);文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-463479.html

到了這里,關(guān)于mosquito服務(wù)器實(shí)現(xiàn) ssl/tls 安全配置通信的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包