MQTT开源库mosquitto安装和使用(三)使用TLS

本文详细介绍了MQTT开源库mosquitto中TLS双向认证的配置和使用,包括mosquitto_tls_set关键接口的参数解析,以及官方示例代码的解析。在进行TLS双向认证时,客户端需要准备CA根证书、客户端证书和私钥,并确保mosquitto_connect的host参数与证书匹配。示例代码展示了如何设置证书并连接到服务器,当证书校验失败时,客户端会不断断开连接。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

MQTT开源库mosquitto安装和使用(三)使用TLS

一、关键接口 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))
配置客户端支持SSL/TLS
1、 必须在mosquitto_connect之前调用。
2、 不能和mosquitto_tls_psk_set同时用。
3、 如果接的服务器需要客户端提供证书,请使用您的客户端证书和私钥定义certfile和keyfile。如果私钥是加密的,请提供一个密码回调函数,否则您将不得不在命令行输入密码。
参数:
mosq:mosquitto实例
cafile:PEM格式的可信CA文件
capath:包含PEM格式的可信CA文件的路径。Cafile和capath不能都为空。
certfile:包含PEM编码格式的客户端证书,
keyfile:包含PEM编码格式的客户端私钥。若certfile为NULL,这里也必须为NULL。

pw_callback:如果keyfile加密,则需要设置此回调进行传入正确的密码。如果设置为NULL,密码必须通过命令行输入。
回调函数:int (*pw_callback)(char *buf, int size, int rwflag, void *userdata)
buf:回调中写入密码的缓存
size:buf的字节数容量
userdata:mosquitto实例
返回:密码字节数

返回:
成功:MOSQ_ERR_SUCCESS
MOSQ_ERR_INVAL:输入参数不合法
MOSQ_ERR_NOMEM:内存不足

二、tls双向认证官方示例代码

示例位置:mosquitto\mosquitto-1.6.9\test\lib\c\08-ssl-connect-cert-auth.c

#include <errno.h>
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <mosquitto.h>

static int run = -1;

void on_connect(struct mosquitto *mosq, void *obj, int rc)
{
	if(rc){
		exit(1);
	}else{
		mosquitto_disconnect(mosq);
	}
}

void on_disconnect(struct mosquitto *mosq, void *obj, int rc)
{
	run = rc;
}

int main(int argc, char *argv[])
{
	int rc;
	struct mosquitto *mosq;

	int port = atoi(argv[1]);

	mosquitto_lib_init();

	mosq = mosquitto_new("08-ssl-connect-crt-auth", true, NULL);
	mosquitto_tls_set(mosq, "../ssl/test-root-ca.crt", "../ssl/certs", "../ssl/client.crt", "../ssl/client.key", NULL);
	mosquitto_connect_callback_set(mosq, on_connect);
	mosquitto_disconnect_callback_set(mosq, on_disconnect);

	rc = mosquitto_connect(mosq, "localhost", port, 60);

	while(run == -1){
		mosquitto_loop(mosq, -1, 1);
	}

	mosquitto_lib_cleanup();
	return run;
}

三、说明

1、客户端使用双向认证连接服务器时,需要准备好证书相关文件
(1)CA根证书;
(2)客户端证书;
(3)客户端私钥;
2、mosquitto_connect中参数的host需要使用与证书对应的域名,否则不能通过对服务器证书的校验,客户端会报错误。
在这里插入图片描述
若通过mosquitto_tls_opts_set设置不校验,则会返回rc值为7的disconnect事件。从wireshark抓包角度看,客户端不断地断连现象。
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值