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的失敗文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-463479.html
至此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)!