在开发java版mosquitto客户端程序时需要使用paho库,如果开发的java客户端要用ssl功能,则需要Bouncy Castle库;在使用ssl功能时,需要证书文件进行进行身份认证,但在测试过程中,只自己制作ca并进行证书签发即可。在测试过程中首先创建一个统一的ca,该ca包括一个crt文件,一个key文件(例如ca.crt、ca.key);测试过程中,要使用该ca为每个测试的机子签发证书,例如:mosquitto服务器运行在192.168.4.223的linux机子上,java版的客户端运行在192.168.4.69的windows机子上,则需要将该ca(即文件ca.crt、ca.key)分别拷贝到mosquitto服务器运行的192.168.4.223上,java版客户端运行的192.168.4.69机子上,然后用openssl使用ca为这两该机子分别签发证书文件,为服务器端签发的证书文件为server.crt和server.key,为客户端签发的证书文件为client.crt和client.key;在上述过程中可能需要用到下面四点内容:

(1)在linux系统下制作ca并使用ca签发证书,该过程可以参考文档:

http://blog.csdn.net/houjixin/article/details/24305613

或者:

http://houjixin.blog.163.com/blog/static/35628410201432205042955/

(2)使用openssl制作ca过程中所需使用的openssl命令,可以参考:http://mosquitto.org/man/mosquitto-tls-7.html

(3)在windows平台下制作客户端的证书文件,其中ca要与服务器端和其他测试客户端保持一致。Windows平台下制作证书可参考文档:

http://blog.csdn.net/houjixin/article/details/25806151

或:

http://houjixin.blog.163.com/blog/static/3562841020144143494875/

(4)开发过程中需要用到库“bcprov-jdk16-139.jar”,

其下载地址为:http://www.bouncycastle.org/latest_releases.html

ssl功能只是在客户端和服务器通信之前的身份验证,后续的通信过程中的加密操作由ssl内部完成,因此具备的ssl功能的java版mosquitto客户端与普通的java版mosquitto客户端相比,只需修改开始部分的相关代码即可。在windows系统下开发java版客户端时,按照下面的步骤进行操作即可:

(1)使用openss根据提供ca签发客户端证书文件,签发证书过程中将生成三个文件:client.crt,client.csr和client.key;其中client.csr主要是为了向ca申请生成client.key文件时生成的“证书申请文件”,一旦生成client.crt和client.key之后就不再需要,实际测试过程中只有client.crt、client.key这两个文件被客户端用于和mosquitto服务器程序进行通信时的身份验证。

(2)封装对ssl的相关操作到一个java类中,例如SslUtil,在该类中完成所有ssl相关功能,例如:加载ca.crt、client.crt和client.key这三个文件,与mosquitto的服务器端进行ssl身份认证。在该类中只有一个函数getSocketFactory,最终该函数将返回一个ssl相关的socket factory实例。该类在附件”SsUtil.java”附件文件中提供。

(3)在使用paho创建mosquitto客户端之前需先创建一个MqttConnectOptions对象,在该对象中调用函数setSocketFactory,并传入第二步中SslUtil所返回的sockt factory实例。相关代码如下所示:

m_conOpt = new MqttConnectOptions();……try {m_conOpt.setSocketFactory(SslUtil.getSocketFactory(caFilePath, clientCrtFilePath, clientKeyFilePath, sspwd));} catch (Exception e) {e.printStackTrace();}

(4)创建一个MqttClient对象,并在该对象连接mosquitto服务器之前先设置第三步中创建的MqttConnectOptions对象。

(5)修改传给MqttClient对象的url参数,使其最前面的协议标志修改为ssl,例如:

String serverUrl = "ssl://192.168.4.223:8883";

注意:

1)在win7系统下制作证书文件时可能会出现:Unable to write ‘random state’的问题,该问题的解决办法可参考文档:

http://houjixin.blog.163.com/blog/static/356284102014420104455237/

或:

http://blog.csdn.net/houjixin/article/details/26347375

2)使用paho连接mosquitto时需要将url中的协议名改成ssl,例如:

StringserverUrl = "ssl://192.168.4.223:8883"

 

参考内容:

[1]  https://gist.github.com/sharonbn/4104301

[2]http://stackoverflow.com/questions/18896087/mosquitto-mqtt-broker-and-java-client-with-ssl-tls

附:SslUtil.java的源码:

package test.com.browan.mqtt;import java.io.*;
import java.nio.file.*;
import java.security.*;
import java.security.cert.*;
import javax.net.ssl.*;import org.bouncycastle.jce.provider.*;
import org.bouncycastle.openssl.*;public class SslUtil
{static SSLSocketFactory getSocketFactory (final String caCrtFile, final String crtFile, final String keyFile, final String password) throws Exception{Security.addProvider(new BouncyCastleProvider());// load CA certificatePEMReader reader = new PEMReader(new InputStreamReader(new ByteArrayInputStream(Files.readAllBytes(Paths.get(caCrtFile)))));X509Certificate caCert = (X509Certificate)reader.readObject();reader.close();// load client certificatereader = new PEMReader(new InputStreamReader(new ByteArrayInputStream(Files.readAllBytes(Paths.get(crtFile)))));X509Certificate cert = (X509Certificate)reader.readObject();reader.close();// load client private keyreader = new PEMReader(new InputStreamReader(new ByteArrayInputStream(Files.readAllBytes(Paths.get(keyFile)))),new PasswordFinder() {@Overridepublic char[] getPassword() {return password.toCharArray();}});KeyPair key = (KeyPair)reader.readObject();reader.close();// CA certificate is used to authenticate serverKeyStore caKs = KeyStore.getInstance(KeyStore.getDefaultType());caKs.load(null, null);caKs.setCertificateEntry("ca-certificate", caCert);TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());tmf.init(caKs);// client key and certificates are sent to server so it can authenticate usKeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType());ks.load(null, null);ks.setCertificateEntry("certificate", cert);ks.setKeyEntry("private-key", key.getPrivate(), password.toCharArray(), new java.security.cert.Certificate[]{cert});KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());kmf.init(ks, password.toCharArray());// finally, create SSL socket factorySSLContext context = SSLContext.getInstance("TLSv1");context.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);return context.getSocketFactory();}
}

java版mosquitto客户端使用SSL功能的具体操作总结相关推荐

  1. java版企业工程项目管理系统源代码-功能清单 图文解析

    Java版工程项目管理系统 Spring Cloud+Spring Boot+Mybatis+Vue+ElementUI+前后端分离 功能清单如下: 首页 工作台:待办工作.消息通知.预警信息,点击可 ...

  2. 手机人人java_人人网JAVA版手机客户端软件功能详解

    [IT168 软件频道]首先,安装好人人网的JAVA版本软件后,在手机的应用程序中可以找到人人2009(如图1). 图1 登录:运行人人2009软件,即会进入登录界面(如图2),点击登录,输入你的人人 ...

  3. java 仿qq庅_iQQ-开源Java版qq客户端

            用过Linux的都知道,QQForLinux处于长期不更新状态,而且存在很多小bug,并且很多QQ该有的功能都没有.于是乎,许多人开始使用第三方QQ插件,比如libqq-pidgin, ...

  4. 非智能手机斗破苍穹Java_支付宝推JAVA版 非智能手机增支付功能

    泡泡网手机频道6月16日 日前,支付宝与曜硕科技联合发布国内首个非智能手机支付方案--嵌入式安全支付系统解决方案.通过该方案,非智能型手机将拥有手机支付功能,从而可以让用户的手机新增网购.游戏及话费充 ...

  5. python反恐精英基础版_cs客户端自动化控制鼠标和键盘操作,python+pyautogui

    PyAutoGUI是一个纯Python的GUI自动化工具,其目的是可以用程序自动控制鼠标和键盘操作,多平台支持(Windows,OS X,Linux). 安装 pip3 install pyautog ...

  6. minecraft java版皮肤查看_厨师长教你:提取 Minecraft 基岩版付费皮肤并用于 Java 版...

    封面图拍摄自 HYPIXEL 主城 最近 Mojang 在基岩版的商店里上架了一套"汉服"皮肤汉服小姐姐真可爱prprpr,看上去还不错,价格也很亲民,就顺手买了下来.商店页面 买 ...

  7. java按钮触发事件程序,小编给你传授java怎么实现按钮触发事件功能

    电脑现已成为我们工作.生活和娱乐必不可少的工具了,在使用电脑的过程中,可能会遇到java怎么实现按钮触发事件功能的问题,如果我们遇到了java怎么实现按钮触发事件功能的情况,该怎么处理怎么才能解决ja ...

  8. java在线聊天项目0.6版 解决客户端关闭后异常问题 dis.readUTF()循环读取已关闭的socket...

    服务端对try catch finally重新进行了定义,当发生异常,主动提示,或关闭出现异常的socket 服务器端代码修改如下: package com.swift;import java.io. ...

  9. mc用什么版本的java_MC版本Java版5大功能优势

    众所周知Java开发应用广泛,Java版本被很多人认为是最好的MC版本,MC版本Java版5大功能优势有什么呢?Java版开发优势:支持更多的模组.各种节日彩蛋.官方更高的重视性.游戏画面色彩更好.操 ...

最新文章

  1. linux中用截取一些信息,Linux如何使用cut命令截取文件信息
  2. pack unpakc
  3. Java基础篇:String、StringBuffer、StringBuilder
  4. 【论文知识点笔记】GNN流程到GCN流程
  5. OC仿支付宝输入UITextField输入车牌号
  6. 厦门理工学院2019年数据结构与算法考研初试大纲
  7. java缓存技术_java缓存技术
  8. 周期均方根和有效值的区别_黑猪肉和白猪肉有啥区别?
  9. jmeter调用Python脚本(java调用Python程序)阶段一(可实现版)
  10. 【学习笔记】Python_Faker,制造测试数据的第三方库,创建姓名、手机、电话、浏览器头、时间、地址等
  11. 计算机数制及其转换,计算机基础知识数制转换
  12. 【官方文档】Fluent Bit 数据管道之过滤插件(Parser)
  13. sphinx启动searchd进程出现search error failed to open No such file or directory
  14. 这是一份华为云私有云解决方案2017年的成绩单
  15. 去除IDEA报黄色/灰色的重复代码的下划波浪线
  16. 政府采购网上商城是不是未来的趋势
  17. 为什么我觉得软件测试是一个有前途的行业?
  18. 关于毕业设计的总结与思考
  19. 在亲生经历被非法APP诈骗中总结经验教训--网络安全
  20. MFC Slider Controll的相关用法

热门文章

  1. NVIDIA Jetson AGX Xavier 安装 JetPack 注意事项
  2. PHP PDO连接PostgreSQL报错 SCRAM authentication requires libpq version 10 or above in解决
  3. java8 list 去重_Java8中的Stream,一行代码,让集合操作飞起来
  4. python3x完全兼容python2x_李亚涛:一台电脑python2x与python3x如何都可以用?
  5. Python练习:平方值格式化
  6. chrome浏览器开发者模式header请求参数“Request Payload“找不到的问题
  7. 鸿蒙手机发布失败,华为:没有推出鸿蒙手机计划,「自拍」会让人觉得你孤独和失败...
  8. python提高文件读取速度_Python提高了HDF5文件的读取速度
  9. 正常web页面登录时效是多少_Web 系统的安全性测试之权限管理测试
  10. eos节点服务器_长期看,EOS柚子能不能达到1000元?