• 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"
                }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    支持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
    • 2
    • 3
    • 4
    • 5
    • 6

    说明:

    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
    
    • 1

    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  }
    
    • 1
    • 2

    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)
            }
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39

    Github

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

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

  • 相关阅读:
    议程公布!Web3 建设者汇聚 DESTINATION MOON 分享见解与探讨
    毫米波与相机融合检测SOTA!CRAFT
    Java计算机毕业设计电影评分网站源码+系统+数据库+lw文档
    MySQL——基本查询语句
    单元测试 —— JUnit 5 参数化测试
    借助VScode将 Docker 容器用作开发环境
    淘宝商品详情页接口,淘宝实时销量接口,淘宝商品列表接口,淘宝APP详情接口,H5商品详情接口
    AI 大战 AI,一个深度强化学习多智能体竞赛系统
    【python学习小案例】提升兴趣之模拟系统入侵
    MATLAB/Python编程:绘制一维和二维的分布直方图
  • 原文地址:https://blog.csdn.net/u011897062/article/details/132895355