MQTT Paho Android 支持SSL/TLS(亲测有效)

2023-09-15 10:13:35

MQTT Paho Android 支持SSL/TLS(亲测有效)

登录时支持ssl的交互

这是调测登录界面设计

代码中对ssl/tls的支持

使用MqttAndroidClient配置mqtt客户端请求时,不加密及加密方式连接存在以下几点差异:

url及端口差异

 val uri: String = if (tlsConnection) {
                "ssl://$host:$port"
            } else {
                "tcp://$host:$port"
            }

支持tls时,url前缀是ssl:
普通mqtt连接时候,前缀是tcp

端口差异:
tcp请求时,默认端口1883
ssl请求时,默认端口是8883

socketFactory配置项

笔者项目中只支持单向验证,即客户端验证服务端,所以需要在客户端加载服务端证书用于ssl连接

 if(connection.isSSL == 1){
            //单项验证,客户端验证服务端,onenet提供的.pem证书,需要用keytool转成java支持的bks、或者jks等
            connOpts.socketFactory = connection.client.getSSLSocketFactory(context.assets.open("MQTTS-certificate.bks"), "12345678")
            connOpts.isHttpsHostnameVerificationEnabled = false
            connOpts.setSSLHostnameVerifier { _, _ -> true  }
        }

说明:

  1. java中不支持pem证书加载,所以需要使用keytool工具将pem格式证书转成java/android支持的bks或者jks等
 keytool -importcert -v -trustcacerts -file ./MQTTS-certificate.pem -alias ca -keystore ./mqtt.bks -storetype BKS -provider org.bouncycastle.jce.provider.BouncyCastleProvider -providerpath ./bcprov-ext-jdk18on-176.jar

bcprov-ext-jdk18on-176.jar需要从以下地址下载
https://www.bouncycastle.org/latest_releases.html

  1. 证书中会涉及域名验证,如果证书中缺少这个字段,那么运行时候会报下面错误
    MqttException (0) - javax.net.ssl.SSLHandshakeException: No subjectAltNames on the certificate match
    解决办法是跳过域名及host验证的流程
connOpts.isHttpsHostnameVerificationEnabled = false
connOpts.setSSLHostnameVerifier { _, _ -> true  }

client.getSSLSocketFactory实现

下面我们看看MqttAndroidClient创建sslSocketFactory的具体实现代码。

//info.mqtt.android.service.MqttAndroidClient
 /**
     * Get the SSLSocketFactory using SSL key store and password
     * A convenience method, which will help user to create a SSLSocketFactory
     * object
     *
     * @param keyStore the SSL key store which is generated by some SSL key tool,
     * such as keytool in Java JDK
     * @param password the password of the key store which is set when the key store
     * is generated
     * @return SSLSocketFactory used to connect to the server with SSL
     * authentication
     * @throws MqttSecurityException if there was any error when getting the SSLSocketFactory
     */
    @Throws(MqttSecurityException::class)
    fun getSSLSocketFactory(keyStore: InputStream?, password: String): SSLSocketFactory {
        return try {
            val sslSockFactory: SSLSocketFactory
            val ts: KeyStore = KeyStore.getInstance("BKS")
            ts.load(keyStore, password.toCharArray())
            val tmf = TrustManagerFactory.getInstance("X509")
            tmf.init(ts)
            val tm = tmf.trustManagers
            val ctx: SSLContext = SSLContext.getInstance("TLSv1")
            ctx.init(null, tm, null)
            sslSockFactory = ctx.socketFactory
            sslSockFactory
        } catch (e: KeyStoreException) {
            throw MqttSecurityException(e)
        } catch (e: CertificateException) {
            throw MqttSecurityException(e)
        } catch (e: IOException) {
            throw MqttSecurityException(e)
        } catch (e: NoSuchAlgorithmException) {
            throw MqttSecurityException(e)
        } catch (e: KeyManagementException) {
            throw MqttSecurityException(e)
        }
    }

Github

https://github.com/hannesa2/paho.mqtt.android
https://github.com/eclipse/paho.mqtt.android

项目中涉及的sample示例代码很值得一探究竟,对你掌握MQTT相关支持很有帮助喔!

更多推荐

排序算法-插入排序

属性当插入第i(i>=1)个元素时,前面的array[0],array[1],…,array[i-1]已经排好序,此时用array[i]的排序码与array[i1],array[i-2],…的排序码顺序进行比较,找到插入位置即将array[i]插入,原来位置上的元素顺序后移直接插入排序的特性总结:1.元素集合越接近有序

redis的基础底层篇 zset的详解

一zset的作用以及结构1.1zset作用redis的zset是一个有序的集合,和普通集合set非常相似,是一个没有重复元素的字符串集合。常用作排行榜等功能,以用户id为value,关注时间或者分数作为score进行排序。1.2zset的底层结构1.zset是一个特别的数据结构,一方面它等价于Java的数据结构Map<

Layui快速入门之第十节 表单

目录一:基本用法二:输入框普通输入框输入框点缀前置和后置前缀和后缀动态点缀密码显隐内容清除自定义动态点缀点缀事件三:复选框默认风格标签风格开关风格复选框事件四:单选框普通单选框自定义标题模板单选框事件五:选择框普通选择框分组选择框搜索选择框选择框事件六:表单相关操作API属性渲染常规渲染定向渲染2.7+忽略渲染验证自定

理清SpringBoot CURD处理逻辑、顺序

💗wei_shuo的个人主页💫wei_shuo的学习社区🌐HelloWorld!理清SpringBootCURD处理逻辑、顺序Controller(控制器):控制器接收来自客户端的请求,并负责处理请求的路由和参数解析。控制器通常会调用相应的服务层方法来处理业务逻辑,并将结果返回给客户端。Service(服务层):

keepalived高可用学习 keepalived+nginx高可用负载均衡配置

文章目录Keepalived1、概述2、配置文件说明3、简洁版配置过程4、keepalived+lvs配置5、主lvs不可用可能性6、防止脑裂,解决方式7、keepalived的配置补充keepalived+nginx高可用配置nginx的负载均衡nginx遇到的问题之负载均衡后获取客户端IPnginx配置中upstr

Spring整合RabbitMQ

一、步骤生产者①创建生产者工程②添加依赖③配置整合④编写代码发送消息消费者①创建消费者工程②添加依赖③配置整合④编写消息监听器二、代码生产者工程1.在生产者工程和消费者工程中都导入如下依赖<dependencies><dependency><groupId>org.springframework</groupId><a

单片机C语言实例:32、实用密码锁

程序实例1:延时函数#ifndef__DELAY_H__#define__DELAY_H__/*------------------------------------------------uS延时函数,含有输入参数unsignedchart,无返回值unsignedchar是定义无符号字符变量,其值的范围是0~25

【2023】数据挖掘课程设计:基于TF-IDF的文本分类

目录一、课程设计题目基于TF-IDF的文本分类二、课程设计设置1.操作系统2.IDE3.python4.相关的库三、课程设计目标1.掌握数据预处理的方法,对训练集数据进行预处理;2.掌握文本分类建模的方法,对语料库的文档进行建模;3.掌握分类算法的原理,基于有监督的机器学习方法,训练文本分类器。四、课程设计内容1.数据

【LeetCode-中等题】347. 前 K 个高频元素

文章目录题目方法一:优先队列(基于大顶堆实现)方法二:优先队列(基于小顶堆实现,队列只需维护k个元素)题目方法一:优先队列(基于大顶堆实现)PriorityQueue<int[]>queue=newPriorityQueue<>((a,b)->b[1]-a[1]);优先队列按照队列中的数组的第二个元素从大到小排序((a

华为云云耀云服务器L实例评测|华为云云耀云服务器L实例开展性能评测

作者简介:辭七七,目前大二,正在学习C/C++,Java,Python等作者主页:七七的个人主页文章收录专栏:七七的闲谈欢迎大家点赞👍收藏⭐加关注哦!💖💖华为云云耀云服务器L实例开展性能评测云耀云服务器L实例产品核心卖点评测实例测试环境性能评测指标在MySQL评测场景下的评测数据作为一款专为中小企业和开发者群体设

利用亚马逊 云服务器 EC2 和S3免费套餐搭建私人网盘

网盘是一种在线存储服务,提供文件存储,访问,备份,贡献等功能,是我们日常中不可或缺的一种服务。很多互联网公司都为个人和企业提供免费的网盘服务。但这些免费服务都有一些限制,比如限制下载速度,限制文件大小,不能多人同时管理,不能实现一些定制化功能。如果想取消这些限制,就要付费。现在我给大家介绍一种免费,且功能无限制的私人网

热文推荐