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

news2024/11/18 11:47:05

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相关支持很有帮助喔!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

无涯教程-JavaScript - OR函数

描述 如果任何参数为TRUE,则OR函数返回TRUE;如果所有参数为FALSE,则返回FALSE。 语法 OR (logical1, [logical2], ...) 争论 Argument描述Required/Optionallogical1 您要测试的1到255个条件可以是TRUE或FALSE。 您要测试的1到255个条件可以是TRUE或FALSE。 Req…

大数据-玩转数据-oracel字符串分割转化为多列

一、建表 create table split_string_test(id integer primary key,test_string varchar2(500) );二、插入测试数据 insert into split_string_test values(1, 10,11,12,13,14,22); insert into split_string_test values(2, 22,23,24); insert into split_string_test valu…

MySQL5.7修改默认端口

1. 修改配置文件 首先打开MySQL的配置文件 my.ini,我的路径在 C:\ProgramData\MySQL\MySQL Server 5.7 ,如何寻找自己的MySQL配置文件所在位置呢? 1.1 寻找配置文件 首先按下 wins ,搜索 “服务” , 找到MySQL服务…

常驻巨噬细胞诱导的纤维化在胰腺炎性损伤和PDAC中具有不同的作用

介绍一篇2023年8月10日发表在Nature Immunology的文章 标题: Fibrosis induced by resident macrophages has divergent roles in pancreas inflammatory injury and PDAC 影响因子:30.5 DOI:https://doi.org/10.1038/s41590-023-01579-x …

对SPA单页面的理解

SPA单页面应用 SPA(single-page application),翻译过来就是单页应用SPA是一种网络应用程序或网站的模型,它通过动态重写当前页面来与用户交互,这种方法避免了页面之间切换打断用户体验。 在单页应用中,所…

[移动通讯]【Carrier Aggregation-4】【LTE-4】

前言: 推荐两个在线工具 UECapabilityInformation Decoder: https://www.sqimway.com/ue_capa.php FGI Decoder: http://howltestuffworks.blogspot.com/2016/11/lte-feature-group-indicators-decoder.html 参考: 载波聚合(CA)…

webpack-cl明明已经安装了,但是还是会报未安装

解决办法:对当前项目目录进行安装 npm install webpack webpack-cli --save-dev

前端css实现统计圆环

文章目录 效果图 css的原理 左右两边分开制作&#xff0c;左右两边各有两层盒子&#xff0c;外层负责遮挡溢出的部分&#xff0c;里层旋转表示百分比 template部分 // 圆环的代码 <div class"row rel"><div class"left"><div id"lef…

U8用友ERP本地部署异地远程访问:内网端口映射外网方案

文章目录 前言1. 服务器本机安装U8并调试设置2. 用友U8借助cpolar实现企业远程办公2.1 在被控端电脑上&#xff0c;点击开始菜单栏&#xff0c;打开设置——系统2.2 找到远程桌面2.3 启用远程桌面 3. 安装cpolar内网穿透3.1 注册cpolar账号3.2 下载cpolar客户端 4. 获取远程桌面…

华为云创新中心黑湖科技:将智能制造进行到底

编辑&#xff1a;阿冒 设计&#xff1a;沐由 一如去年&#xff0c;第二届828 B2B企业节从8月28日-9月15日期间&#xff0c;再一次成为广大企业界关注的焦点。 当前&#xff0c;数字技术已经被广泛被融入到产品、服务与流程当中&#xff0c;用以转变客户的业务成果&#xff0c;以…

Nginx map 实现时间格式转换

哈喽大家好&#xff0c;我是咸鱼 最近我们需要把 Nginx 的日志接入到自研的日志采集平台上&#xff0c;但是这个平台只支持 JSON 格式&#xff0c;所以需要把 Nginx 日志格式改成 JSON 格式 例如下面这样的效果 刚开始在主配置文件 nginx.conf 中定义了一个名叫 json 的日志…

好用的电容笔有哪些推荐?apple pencil的平替笔推荐

很小伙伴会觉得越贵的电容笔就会越好用&#xff0c;但其实不是这样子的。我们要综合产品的性能和价格来购买。在电容笔领域中&#xff0c;性价比是很重要购买参数&#xff0c;今天我给大家推荐几款性价比高的平替电容笔&#xff0c;希望可以给你带来有益的参考。 1.西圣电容笔…

雅思学习总结

#【中秋征文】程序人生&#xff0c;中秋共享# 雅思小科普&#xff1a; 1. 什么是雅思考试&#xff1f; 雅思考试是由&#xff1a;英国文化协会、澳洲 IDP 教育集团、剑桥 大学考试委员会举办的英语水平测试。全称翻译成中文是&#xff1a; 国际英语语言测试系统。 2…

一招识别吞没和Marubozu,只需记住FPmarkets澳福这两点

在后台有很多投资者都在问FPmarkets澳福&#xff0c;吞没和Marubozu这两种形态的区别&#xff0c;今天这篇文章通过相似和不同来了解吞没和Marubozu这两种形态的区别。 共同点&#xff1a; 1. Marubozu和吞没都是烛台分析中的反转形态。 2.这两种模式&#xff0c;阴影都不需要特…

华为云云耀云服务器L实例评测-搭建基于hexo的个人博客

1、演示 访问地址&#xff1a;演示传送门开头先来一个效果图。 2、准备服务器 前面有介绍了一下华为云云耀云服务器L实例评测以及简单的配置用法&#xff0c;具体可以看上篇的博客。https://blog.csdn.net/yongqing_/article/details/132867889我这里用的是华为云云耀云服务器…

OpenAPI,连接新世界_三叠云

开放平台 路径 应用与导航 >> 开放平台 功能简介 随着企业数字化转型的不断深入&#xff0c;越来越多的公司需要与其他企业或应用程序进行集成&#xff0c;实现更高效和智能的业务流程。因此&#xff0c;三叠云提出了一种新的解决方案&#xff1a;开放平台。 三叠云…

OpenHarmony 系统能力 SystemCapability 使用指南

一、概述 1、系统能力与 API SysCap&#xff0c;全称 SystemCapability&#xff0c;即系统能力&#xff0c;指操作系统中每一个相对独立的特性&#xff0c;如蓝牙&#xff0c;WIFI&#xff0c;NFC&#xff0c;摄像头等&#xff0c;都是系统能力之一。每个系统能力对应多个 API&…

Python模板注入(SSTI)

概念 发生在使用模板引擎解析用户提供的输入时。模板注入漏洞可能导致攻击者能够执行恶意代码或访问未授权的数据。 模板引擎可以让&#xff08;网站&#xff09;程序实现界面与数据分离&#xff0c;业务代码与逻辑代码分离。即也拓宽了攻击面&#xff0c;注入到模板中的代码可…

flutter聊天界面-TextField输入框实现@功能等匹配正则表达式展示高亮功能

flutter聊天界面-TextField输入框实现功能等匹配正则表达式展示高亮功能 一、简要描述 描述&#xff1a; 最近有位朋友讨论的时候&#xff0c;提到了输入框的高亮展示。在flutter TextField中需要插入特殊样式的标签&#xff0c;比如&#xff1a;“请 张三 回答一下”&#x…

streamlit打包方式

Streamlit是一个开放的资源框架&#xff0c;用于将数据脚本转换为可共享的 Web 应用程序。它允许数据科学家和机器学习工程师构建直观的界面&#xff0c;而无需了解 Web 开发。在本教程中&#xff0c;我们将学习一些将 Streamlit 应用程序转换为双击可执行文件的方法&#xff0…