当前位置: 首页 > news >正文

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.lryc.cn/news/169472.html

相关文章:

  • STM32——SPI通信
  • Linux虚拟机局域网IP配置
  • MacOS删除.DS_Store文件
  • ARM Linux DIY(十一)板子名称、开机 logo、LCD 控制台、console 免登录、命令提示符、文件系统大小
  • 【Unity程序技巧】Unity中的单例模式的运用
  • java leetcodetop100 (3,4 )最长连续数列,移动零
  • 用Vite从零到一创建React+ts项目
  • HTTP状态码301(永久重定向)不同Web服务器的配置方法
  • vue-element-admin项目部署 nginx动态代理 含Docker部署、 Jenkins构建
  • 使用Python来写模拟Xshell实现远程命令执行与交互
  • mybatis 数据库字段为空or为空串 忽略条件过滤, 不为空且不为空串时才需nameParam过滤条件
  • 【玩玩Vue】通过vue-store实现枚举管理,用于下拉选项和中英文翻译等
  • ISCSI:后端卷以LVM 的方式配置 ISCSI 目标启动器
  • 八公山豆腐发展现状与销售对策研究
  • 排序算法-插入排序
  • 多位数按键操作(闪烁)数码管显示
  • MyEclipse项目导入与导出
  • ArrayList和LinkedList
  • Linux 配置 Nginx 服务完整详细版
  • Python实现猎人猎物优化算法(HPO)优化LightGBM回归模型(LGBMRegressor算法)项目实战
  • 无涯教程-JavaScript - ODD函数
  • Easyui里的datagrid嵌入select下拉框
  • 计算机专业毕业设计项目推荐03-Wiki系统设计与实现(JavaSpring+Vue+Mysql)
  • 微服务的艺术:构建可扩展和弹性的分布式应用
  • 在PHP8中对数组进行排序-PHP8知识详解
  • Redis混合模式持久化原理
  • 《BPF Performance Tools —— 洞悉Linux系统和应用性能》学习笔记 —— 第一章 介绍(2)
  • 【计算机网络】网络编程接口 Socket API 解读(7)
  • crypto++下载、安装(VS2017)及加解密使用
  • R语言画图