MQTT 是一种轻量级的、灵活的物联网消息交换和数据传递协议,致力于为 IoT 开发人员实现灵活性与硬件/网络资源的平衡。为了确保通讯安全,通常使用 TLS/SSL 来进行通讯加密。

本文主要介绍如何通过 Android 与 MQTT 进行 TLS/SSL 单向认证和双向认证。

准备

本文使用 Eclipse Paho Android Service 和 BouncyCastle,添加依赖

dependencies {implementation 'org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.1.0'implementation 'org.eclipse.paho:org.eclipse.paho.android.service:1.1.1'implementation 'org.bouncycastle:bcpkix-jdk15on:1.59'
}

以下是 Android 连接 TLS/SSL 的核心代码部分

MqttConnectOptions options = new MqttConnectOptions();
SSLSocketFactory sslSocketFactory = ...
options.setSocketFactory(sslSocketFactory);

重点在于如何获取 SSLSocketFactory,下面对单向认证和双向认证分别进行说明。

单向认证

单向认证是指服务端认证客户端,以下是核心代码

 public static SSLSocketFactory getSingleSocketFactory(InputStream caCrtFileInputStream) throws Exception {Security.addProvider(new BouncyCastleProvider());X509Certificate caCert = null;BufferedInputStream bis = new BufferedInputStream(caCrtFileInputStream);CertificateFactory cf = CertificateFactory.getInstance("X.509");while (bis.available() > 0) {caCert = (X509Certificate) cf.generateCertificate(bis);}KeyStore caKs = KeyStore.getInstance(KeyStore.getDefaultType());caKs.load(null, null);caKs.setCertificateEntry("cert-certificate", caCert);TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());tmf.init(caKs);SSLContext sslContext = SSLContext.getInstance("TLSv1.2");sslContext.init(null, tmf.getTrustManagers(), null);return sslContext.getSocketFactory();}

我们把 ca.crt 放到 res/raw 下,然后调用

try {InputStream caCrtFileI = context.getResources().openRawResource(R.raw.ca);options.setSocketFactory(getSingleSocketFactory(caCrtFile));
} catch (Exception e) {e.printStackTrace();
}

双向认证

双向认证是指服务端和客户端相互认证,以下是关键代码

public static SSLSocketFactory getSocketFactory(InputStream caCrtFile, InputStream crtFile, InputStream keyFile,String password) throws Exception {Security.addProvider(new BouncyCastleProvider());// load CA certificateX509Certificate caCert = null;BufferedInputStream bis = new BufferedInputStream(caCrtFile);CertificateFactory cf = CertificateFactory.getInstance("X.509");while (bis.available() > 0) {caCert = (X509Certificate) cf.generateCertificate(bis);}// load client certificatebis = new BufferedInputStream(crtFile);X509Certificate cert = null;while (bis.available() > 0) {cert = (X509Certificate) cf.generateCertificate(bis);}// load client private certPEMParser pemParser = new PEMParser(new InputStreamReader(keyFile));Object object = pemParser.readObject();JcaPEMKeyConverter converter = new JcaPEMKeyConverter().setProvider("BC");KeyPair key = converter.getKeyPair((PEMKeyPair) object);KeyStore caKs = KeyStore.getInstance(KeyStore.getDefaultType());caKs.load(null, null);caKs.setCertificateEntry("cert-certificate", caCert);TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());tmf.init(caKs);KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType());ks.load(null, null);ks.setCertificateEntry("certificate", cert);ks.setKeyEntry("private-cert", key.getPrivate(), password.toCharArray(),new java.security.cert.Certificate[]{cert});KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());kmf.init(ks, password.toCharArray());SSLContext context = SSLContext.getInstance("TLSv1.2");context.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);return context.getSocketFactory();}

我们需要准备好服务端证书,客户端证书和秘钥放到 res/raw 下,然后调用,注意密码设为空字符串

try {InputStream caCrtFile = context.getResources().openRawResource(R.raw.ca);InputStream crtFile = context.getResources().openRawResource(R.raw.cert);InputStream keyFile = context.getResources().openRawResource(R.raw.key);options.setSocketFactory(getSocketFactory(caCrtFile, crtFile, keyFile, ""));
} catch (Exception e) {e.printStackTrace();
}

以上就是如何在 Android 上与 MQTT 进行 TLS/SSL 单向认证和双向认证。

版权声明: 本文为 EMQ 原创,转载请注明出处。

原文链接:https://www.emqx.io/cn/blog/android-mqtt-ssl-tls-authentication

Android MQTT TLS/SSL 认证相关推荐

  1. es上安装x-park TLS/SSL认证

    在es集群上安装TLS. 重要 如果您是在现有群集上首次安装X-Pack,则必须执行完整群集重新启动.安装X-Pack后,必须在群集中的所有节点上启用安全性和安全性才能使群集正常运行.升级时通常可以执 ...

  2. Android MQTT

    Android MQTT MQTT(Message Queuing Telemetry Transport,消息队列遥测传输) 基本知识 可参考: 零基础入门学用物联网 – MQTT基础篇 – 目录 ...

  3. ssl双向认证_详解TLS/SSL运行机制

    TLS传输层安全性协议(Transport Layer Security)及其前身SSL安全套接层(Secure Sockets Layer)是一种安全协议,目的是为互联网通信提供安全及数据完整性保障 ...

  4. TLS/SSL双向认证

    相关文章: openssl genrsa 命令详解 一.PKI.CA.TLS/SSL.OpenSSL等概念及原理 CA 证书签发机构,自己持有私钥,创建根证书,并把根证书发送给操作系统厂商,内置于操作 ...

  5. SSL/TLS单向认证和双向认证介绍

    为了便于理解SSL/TLS的单向认证和双向认证执行流程,这里先介绍一些术语. 1. 散列函数(Hash function):又称散列算法.哈希函数,是一种从任何一种数据中创建小的数字"指纹& ...

  6. SSL/TLS 双向认证(一) -- SSL/TLS工作原理

    本文部分参考: https://www.wosign.com/faq/faq2016-0309-03.htm https://www.wosign.com/faq/faq2016-0309-04.ht ...

  7. SSL/TLS 双向认证(一) -- SSL/TLS 工作原理

    本文部分参考: https://www.wosign.com/faq/faq2016-0309-03.htm https://www.wosign.com/faq/faq2016-0309-04.ht ...

  8. SSL/TLS 双向认证

    其他参考链接 链接: https://blog.csdn.net/xxss120/article/details/78758832. 链接: https://blog.csdn.net/gx_1983 ...

  9. gRPC 的 SSL/TLS 加密认证

    文章目录 简介 生成自签证证书 服务端 客户端 单向认证 双向认证 基于 Token 的单向认证 基于 Token 的双向认证 简介 传输层安全性协议(Transport Layer Security ...

  10. Android _实现SSL解决不受信任的证书问题

    介绍 网络安全已成为大家最关心的问题. 如果你利用服务器存储客户资料, 那你应该考虑使用 SSL 加密客户跟服务器之间的通讯. 随着这几年手机应用迅速崛起. 黑客也开始向手机应用转移, 原因有下列3点 ...

最新文章

  1. [渝粤教育] 中国地质大学 金融保险业会计 复习题
  2. LeetCode 1487. 保证文件名唯一(哈希map)
  3. CORS跨域限制以及预请求验证(C++ Qt框架实现)
  4. “360行,行行转前端”:前端岗为什么这么火?
  5. c++多态与java多态性_Java中的多态性
  6. 熊乃学 计算机,信息工程学院 - 副本.pdf
  7. java基础教程01讲:使用idea写第一个java程序
  8. gephi java教程_gephi生成图(java版)
  9. 计算机管理用房设置要求,党政机关办公用房管理系统解决方案
  10. ftl不存在为真_ftl 语法
  11. page cache和buffer cache之间的关系以及验证
  12. TotalControl连接问题
  13. 前端用ps创建画布的分辨率应该设置的值
  14. 百度引流推广怎么做?个人如何做百度推广
  15. vasp 模拟退火_【转】vasp的分子动力学模拟 - 第一原理 - 小木虫 - 学术 科研 互动社区...
  16. C语言基础-判断质数(素数)
  17. 区块链P2P网络协议演进过程
  18. 【中国科学基金】区块链舆情存证方案设计及应用挑战——CSSCI
  19. 关于String你了解多少
  20. More than 1 blank line not allowed

热门文章

  1. srs源码分析2-浅析state_threads
  2. openstack下创建windows虚机出现do_hivex_close
  3. AI三驾马车之深度学习框架
  4. 使用Python程序读取fasta文件reads
  5. [Python] 央视新闻联播推送
  6. 历年考研计算机专业国家线,历年工学考研国家线一览_考研国家线公布时间
  7. 一个app的流程分析
  8. 重装系统ie无法解析服务器名称,教你解决ie浏览器打不开的方法
  9. 梦幻可以在2个服务器无限转吗,梦幻西游手游:从iOS到双平台,转区竟然能转成了全服第一?...
  10. 手机wifi显示连接到服务器地址,手机连接路由器wifi上网总是提示正在获取IP地址怎么办...