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

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

  • 一、关键接口 mosquitto_tls_set
  • 二、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 
#include 
#include 
#include 
#include 

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需要使用与证书对应的域名,否则不能通过对服务器证书的校验,客户端会报错误。
MQTT开源库mosquitto安装和使用(三)使用TLS_第1张图片
若通过mosquitto_tls_opts_set设置不校验,则会返回rc值为7的disconnect事件。从wireshark抓包角度看,客户端不断地断连现象。
MQTT开源库mosquitto安装和使用(三)使用TLS_第2张图片

你可能感兴趣的:(mqtt,openssl,C/C++)