mqtt mosquitto tls java 客户端
来源:互联网 发布:沈阳拼车软件 编辑:程序博客网 时间:2024/05/20 13:39
物联网交流群:651219170
简介
做为 mosquitto 开启 tls 之后的调试客户端写的代码。其中需要注意的是
tls 的 ca 证书,如果你是自己ca那么你要把他加到信任的 ca 列表,也就是下面那几步。如果是真正的著名的 ca 颁布的那么可以把下面几行代码注释掉。因为jdk的jdk1.8/jre/lib/security/cacerts 里面已经默认存了这写著名机构的 ca.crt 了。
public class SSLUtil{ /** * 获取 tls 安全套接字工厂 * @param caCrtFile null:使用系统默认的 ca 证书来验证。 非 null:指定使用的 ca 证书来验证服务器的证书。 * @return tls 套接字工厂 * @throws Exception */ public static SSLSocketFactory getSocketFactory (final String caCrtFile) throws NoSuchAlgorithmException, IOException, KeyStoreException, CertificateException, KeyManagementException { Security.addProvider(new BouncyCastleProvider()); //===========加载 ca 证书================================== TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); if( null != caCrtFile ){ // 加载本地指定的 ca 证书 PEMReader reader = new PEMReader(new InputStreamReader(new ByteArrayInputStream(Files.readAllBytes(Paths.get(caCrtFile))))); X509Certificate caCert = (X509Certificate)reader.readObject(); reader.close(); // CA certificate is used to authenticate server KeyStore caKs = KeyStore.getInstance(KeyStore.getDefaultType()); caKs.load(null, null); caKs.setCertificateEntry("ca-certificate", caCert); // 把ca作为信任的 ca 列表,来验证服务器证书 tmf.init(caKs); }else { //使用系统默认的安全证书 tmf.init((KeyStore)null); } // ============finally, create SSL socket factory============== SSLContext context = SSLContext.getInstance("TLSv1"); context.init(null,tmf.getTrustManagers(), null); return context.getSocketFactory(); }}
正式代码:
1.增加依赖包
<dependency> <groupId>org.eclipse.paho</groupId> <artifactId>mqtt-client</artifactId> <version>0.4.0</version> </dependency> <dependency> <groupId>bouncycastle</groupId> <artifactId>bcprov-jdk15</artifactId> <version>140</version> </dependency>
Service.java
/** * Created by yhy on 17-7-5. */import org.eclipse.paho.client.mqttv3.*;import org.eclipse.paho.client.mqttv3.persist.MemoryPersistence;public class Server { public static final String caCrtFile = "/home/yhy/IdeaProjects/mqtt/src/main/resources/ca.crt"; public static final String HOST = "ssl://iot.51awifi.com:1885"; public static final String TOPIC = "/hello/tls"; private static final String clientid ="server"; private MqttClient client; private MqttTopic topic; private String userName = "yuhaiyang"; private String passWord = "yuhaiyang"; private MqttMessage message; public Server() throws MqttException { //MemoryPersistence设置clientid的保存形式,默认为以内存保存 client = new MqttClient(HOST, clientid, new MemoryPersistence()); } private void connect() throws Exception { MqttConnectOptions options = new MqttConnectOptions(); options.setCleanSession(false); options.setUserName(userName); options.setPassword(passWord.toCharArray()); options.setSocketFactory(SSLUtil.getSocketFactory(caCrtFile)); // 设置超时时间 options.setConnectionTimeout(10); // 设置会话心跳时间 options.setKeepAliveInterval(60); try { client.setCallback(new PushCallback()); client.connect(options); topic = client.getTopic(TOPIC); } catch (Exception e) { e.printStackTrace(); } } public void publish(MqttMessage message) throws MqttException{ MqttDeliveryToken token = topic.publish(message); System.out.println("等待发送成功:"+token.isComplete()); token.waitForCompletion(); System.out.println("已经发送成功:"+token.isComplete()); } public void subscription() throws MqttException { client.subscribe("#",2); } public static void main(String[] args) throws Exception { Server server = new Server(); server.connect(); server.message = new MqttMessage(); server.message.setQos(1); server.message.setRetained(true); server.message.setPayload("hello tls".getBytes()); server.subscription(); System.out.println("订阅成功"); server.publish(server.message); System.out.println("发布成功"); Thread.sleep(10000); }}class PushCallback implements MqttCallback { public void connectionLost(Throwable cause) { // 连接丢失后,一般在这里面进行重连 System.out.println("连接断开,可以做重连"); } @Override public void messageArrived(String topic, MqttMessage mqttMessage) throws Exception { // subscribe后得到的消息会执行到这里面 System.out.println("接收消息主题:" + topic); System.out.println("接收消息Qos:" + mqttMessage.getQos()); System.out.println("接收消息内容:" + new String(mqttMessage.getPayload())); } @Override public void deliveryComplete(IMqttDeliveryToken iMqttDeliveryToken) { // 当下发成功被调用。 System.out.println("deliveryComplete:" + iMqttDeliveryToken.isComplete()); }}
package com.awifi.athena.devicebus.common.ssl;/** * Created by yhy on 17-7-5. */import org.bouncycastle.jce.provider.BouncyCastleProvider;import org.bouncycastle.openssl.PEMReader;import javax.net.ssl.SSLContext;import javax.net.ssl.SSLSocketFactory;import javax.net.ssl.TrustManagerFactory;import java.io.ByteArrayInputStream;import java.io.IOException;import java.io.InputStreamReader;import java.nio.file.Files;import java.nio.file.Paths;import java.security.*;import java.security.cert.CertificateException;import java.security.cert.X509Certificate;public class SSLUtil{ /** * 获取 tls 安全套接字工厂 * @param caCrtFile null:使用系统默认的 ca 证书来验证。 非 null:指定使用的 ca 证书来验证服务器的证书。 * @return tls 套接字工厂 * @throws Exception */ public static SSLSocketFactory getSocketFactory (final String caCrtFile) throws NoSuchAlgorithmException, IOException, KeyStoreException, CertificateException, KeyManagementException { Security.addProvider(new BouncyCastleProvider()); //===========加载 ca 证书================================== TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); if( null != caCrtFile ){ // 加载本地指定的 ca 证书 PEMReader reader = new PEMReader(new InputStreamReader(new ByteArrayInputStream(Files.readAllBytes(Paths.get(caCrtFile))))); X509Certificate caCert = (X509Certificate)reader.readObject(); reader.close(); // CA certificate is used to authenticate server KeyStore caKs = KeyStore.getInstance(KeyStore.getDefaultType()); caKs.load(null, null); caKs.setCertificateEntry("ca-certificate", caCert); // 把ca作为信任的 ca 列表,来验证服务器证书 tmf.init(caKs); }else { //使用系统默认的安全证书 tmf.init((KeyStore)null); } // ============finally, create SSL socket factory============== SSLContext context = SSLContext.getInstance("TLSv1"); context.init(null,tmf.getTrustManagers(), null); return context.getSocketFactory(); }}
阅读全文
0 0
- mqtt mosquitto tls java 客户端
- mosquitto mqtt tls 认证
- MQTT Mosquitto broker with SSL/TLS transport security
- MQTT初体验mosquitto的java实现
- Android MQTT客户端使用SSL/TLS连接MQTT代理服务器
- 使用Mosquitto-Auth-Plugin对mqtt客户端进行验证
- SSL/TLS 双向认证(三) -- ESP8266与mosquitto的MQTT双向认证
- SSL/TLS 双向认证(三) -- ESP8266与mosquitto的MQTT双向认证
- SSL-TLS 双向认证(三) -- ESP8266与mosquitto的MQTT双向认证
- mqtt java客户端代码
- java MQTT 客户端问题
- MQTT学习笔记——树莓派MQTT客户端 使用Mosquitto和paho-python
- MQTT学习笔记——树莓派MQTT客户端 使用Mosquitto和paho-python
- 开源mqtt代理:mosquitto
- android 推送 mosquitto MQTT
- 开源mqtt代理:mosquitto
- 开源mqtt代理:mosquitto
- MQTT服务器搭建--Mosquitto
- Arduino 直流电机转速控制系统
- ==和equals的区别
- 树莓派与DHT-11温湿度传感器
- 初识vulkan
- CSS3-背景尺寸
- mqtt mosquitto tls java 客户端
- HDU 3371 Connect the Cities (最小生成树+克鲁斯卡尔算法)
- scala系列知识点总结(函数高级篇)
- Android模仿项目(一站到底)
- CSAPP 第二章 信息的表示和处理
- 三大基本排序总结 (冒泡、选择、插入)
- python的高级应用
- 用JS获取地址栏参数的方法
- script1