如何通过Android与MQTT进行TLS/SSL单向认证和双向认证
发表于:2024-11-22 作者:千家信息网编辑
千家信息网最后更新 2024年11月22日,这篇文章主要介绍"如何通过Android与MQTT进行TLS/SSL单向认证和双向认证",在日常操作中,相信很多人在如何通过Android与MQTT进行TLS/SSL单向认证和双向认证问题上存在疑惑,
千家信息网最后更新 2024年11月22日如何通过Android与MQTT进行TLS/SSL单向认证和双向认证
这篇文章主要介绍"如何通过Android与MQTT进行TLS/SSL单向认证和双向认证",在日常操作中,相信很多人在如何通过Android与MQTT进行TLS/SSL单向认证和双向认证问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"如何通过Android与MQTT进行TLS/SSL单向认证和双向认证"的疑惑有所帮助!接下来,请跟着小编一起来学习吧!
MQTT 是一种轻量级的、灵活的物联网消息交换和数据传递协议,致力于为 IoT 开发人员实现灵活性与硬件/网络资源的平衡。为了确保通讯安全,通常使用 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 certificate X509Certificate caCert = null; BufferedInputStream bis = new BufferedInputStream(caCrtFile); CertificateFactory cf = CertificateFactory.getInstance("X.509"); while (bis.available() > 0) { caCert = (X509Certificate) cf.generateCertificate(bis); } // load client certificate bis = new BufferedInputStream(crtFile); X509Certificate cert = null; while (bis.available() > 0) { cert = (X509Certificate) cf.generateCertificate(bis); } // load client private cert PEMParser 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单向认证和双向认证"的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!
认证
单向
双向
学习
代码
客户
客户端
服务
更多
核心
证书
通讯
准备
帮助
实用
安全
接下来
人员
关键
密码
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
derby数据库查询语法
南京创新软件开发推荐咨询
做网络安全的公司logo
云顶之弈可以转服务器吗
数据库查看表中字段有哪些
py链接数据库后的格式
千兆宽带服务器无限流量
天津智联网络技术有限公司邮编
服务器管理口如何连接
app软件开发与运维协议
加大网络安全人才培养
数据库如何取消记录
cmdb服务器管理
全国网络安全领导小组
城厢雅绅网络技术诈骗
虚拟网络安全培养
网络安全操作维护中心简称
网络安全的人才
阿里云独立服务器租用
中国学术网页数据库有哪些
软件开发公司因软件运营方
硅谷时代网络安全
什么属于电子数据库
学软件开发实训
阿里云服务器 一键
cscd数据库怎么检索文章
浙江1u服务器机箱工厂
清华大学代理服务器
一念逍遥如何选择服务器
京点网络技术有限公司