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

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 = falseconnOpts.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: SSLSocketFactoryval ts: KeyStore = KeyStore.getInstance("BKS")ts.load(keyStore, password.toCharArray())val tmf = TrustManagerFactory.getInstance("X509")tmf.init(ts)val tm = tmf.trustManagersval ctx: SSLContext = SSLContext.getInstance("TLSv1")ctx.init(null, tm, null)sslSockFactory = ctx.socketFactorysslSockFactory} 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相关支持很有帮助喔!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/136365.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[npm]脚手架本地全局安装1

[npm]脚手架本地全局安装1 npm link 全局安装npm install 全局安装卸载全局安装的脚手架 该文章是你的脚手架已经开发完成的前提下,你想要本地全局安装该脚手架,便于本地使用脚手架的命令的情况 npm link 全局安装 如果本地开发的项目是个脚手架&#…

《数据结构、算法与应用C++语言描述》使用C++语言实现二维数组下三角矩阵

《数据结构、算法与应用C语言描述》使用C语言实现二维数组下三角矩阵 下三角矩阵定义 如下图所示: 代码实现 _11lowerTriangularMatrix.h 模板类 /* Project name : allAlgorithmsTest Last modified Date: 2022年8月13日17点38分 Last Version: V1.0 D…

oracle创建表空间、用户、权限以及导入dmp文件

创建表空间 create tablespace A_DATA logging datafile F:\CODEAPP\ORACLE\ORADATA\A_DATA01.DBF size 50m autoextend on next 50m maxsize 32767m extent management local; -- 这个语句将创建一个大小为50MB的数据文件,启用自动扩展功能,每次扩展50…

Java21 LTS版本

一、前言 除了众所周知的 JEP 之外,Java 21 还有更多内容。首先请确认 java 版本: $ java -version openjdk version "21" 2023-09-19 OpenJDK Runtime Environment (build 2135-2513) OpenJDK 64-Bit Server VM (build 2135-2513, mixed mo…

zemax像质评价

1、外形图 1.1二维外形图 如图所示,展示镜头的侧面图 可以通过设置改变图中显示的内容: 起始面:绘图的第一个面 终止面:绘图的最后一个面 光线数:画出的光线数(上图中的一个颜色就是7根线) …

使用Visual Leak Detector排查内存泄漏问题

目录 1、VLD工具概述 2、下载并安装VLD 2.1、下载VLD 2.2、安装VLD 3、VLD安装目录及文件说明 3.1、安装目录及文件说明 3.2、关于32位和64位版本的详细说明 4、在工程中引入VLD 5、内存泄漏检测实例讲解 5.1、程序启动报错 5.2、启动调试,查看内存泄漏报…

【深度学习-第3篇】使用MATLAB快速实现CNN分类(模式识别)任务,含一维、二维、三维数据演示案例

在本文中,我们将介绍如何使用 MATLAB 中的 Convolutional Neural Network(CNN)进行分类任务。我们将使用 MATLAB 的 Deep Learning Toolbox 来创建、训练和评估 CNN。 一、一个简单的案例 1 安装和准备 首先,确保已安装 MATLAB…

Prometheus+Grafana可视化监控【Redis状态】

文章目录 一、安装Docker二、安装Redis数据库(Docker容器方式)三、安装Prometheus四、安装Grafana五、Pronetheus和Grafana相关联六、安装redis_exporter七、Grafana添加Redis监控模板 一、安装Docker 注意:我这里使用之前写好脚本进行安装Docker,如果已…

华为云云耀云服务器L实例评测|认识redis未授权访问漏洞 漏洞的部分复现 设置连接密码 redis其他命令学习

前言 最近华为云云耀云服务器L实例上新,也搞了一台来玩,期间遇到过MySQL数据库被攻击的情况,数据丢失,还好我有几份备份,没有造成太大的损失。昨天收到华为云的邮箱提醒,我的redis数据库没有设置密码&…

人声分离网站,帮你快速提取视频中的人声和背景音乐

今天给大家带来一个可以分离人声的网站——音分轨,他运用人工智能算法可以将音频中的人声部分和音乐部分分离,使我们的视频制作过程可以更方便。 我们点击右下角“选择文件”上传一个音频,上传好音频后,人工智能就开始处理我们上传…

使用Chatgpt编写的PHP数据库pdo操作类(增删改查)

摘要 将PDO封装成PHP类进行调用有很多好处,包括: 1、封装性和抽象性: 通过将PDO封装到一个类中,您可以将数据库操作逻辑与应用程序的其他部分分离开来,提高了代码的组织性和可维护性。这样,您只需在一个地…

python 学习笔记(6)—— Flask 、MySql

目录 Flask 1、起步 2、渲染项目的首页 3、处理无参数的 GET 请求 4、处理有 query 参数的 GET 请求 6、处理 params 参数的 get 请求 6、处理 application/json 类型请求体的 POST 请求 7、根据参数渲染模板页面 8、上传文件 数据库操作(mysql&#xff0…

vue移动端页面适配

页面的适配,就是一个页面能在PC端正常访问,同时也可以在移动端正正常访问。 现在我们可以通过弹性布局【Flexible布局】、媒体查询和响应式布局。除此之外,还可以通过rem和vw针对性地解决页面适配问题。 响应式布局 响应式布局的核心&…

公司需要同步大量数据,如何缓解传输压力提高同步效率?

数据同步是很多企业在面临各类需求时要进行的事项,但由于体量较大,往往出现了很多的问题,很会影响企业人员的时间和效率。如何缓解传输压力,提高同步效率,保证同步质量,成为企业关注的重点问题。本文将从以…

【少儿编程的网站应该怎么选择】

👨‍💻个人主页:元宇宙-秩沅 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 秩沅 原创 👨‍💻 收录于专栏:效率…

【JAVA】多态的概念与实际利用

个人主页:【😊个人主页】 系列专栏:【❤️初识JAVA】 前言 在面向对象(OOP)的程序设计语言中,多态与封装、继承合称为OOP的三大特性。在今天,我们就来学习一下JAVA中的多态是什么样子的。、 多态 指一个对象在不同…

【MySQL进阶】SQL性能分析

一、SQL性能分析 1.SQL执行频率 MySQL 客户端连接成功后,通过 show [session|global] status 命令可以提供服务器状态信 息。通过如下指令,可以查看当前数据库的 INSERT 、 UPDATE 、 DELETE 、 SELECT 的访问频次: -- session 是查看当…

网站登录界面制作(three.js 3D特效背景)+ boostrap导航栏实现 + jQuery移动窗口【附加源代码】

网站登录界面制作(three.js 3D特效背景) boostrap导航栏实现 文章目录 网站登录界面制作(three.js 3D特效背景) boostrap导航栏实现前言登录界面效果图主页面效果图:主页面源代码 前言 学过Web前端的许多小伙伴都会面…

五、Java基本数据类型

Java基本数据类型 Java基本数据类型1.1.整数类型1.1.1.int型1.1.2.byte型1.1.3.short型1.1.4.long型 1.2.浮点类型1.3.字符类型1.3.1.char型1.3.2.转义字符 1.4.布尔类型 —————————————————————————————————————————————————…

详解FreeRTOS:FreeRTOS任务删除过程源码分析(进阶篇—2)

本篇博文讲解FreeRTOS中任务删除过程的源代码,帮助各位更好理解删除任务的原理和流程。 在详解FreeRTOS:FreeRTOS任务管理函数(基础篇—11)中,讲述了可以使用vTaskDelete()函数实现删除任务。 函数源码如下: 程序说明如下: (1)、调用函数 prvGetTCBFromHandle()获取要删…