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

在开发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 certificate
		PEMReader reader = new PEMReader(new InputStreamReader(new ByteArrayInputStream(Files.readAllBytes(Paths.get(caCrtFile)))));
		X509Certificate caCert = (X509Certificate)reader.readObject();
		reader.close();

		// load client certificate
		reader = new PEMReader(new InputStreamReader(new ByteArrayInputStream(Files.readAllBytes(Paths.get(crtFile)))));
		X509Certificate cert = (X509Certificate)reader.readObject();
		reader.close();

		// load client private key
		reader = new PEMReader(
				new InputStreamReader(new ByteArrayInputStream(Files.readAllBytes(Paths.get(keyFile)))),
				new PasswordFinder() {
					@Override
					public char[] getPassword() {
						return password.toCharArray();
					}
				}
		);
		KeyPair key = (KeyPair)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);
		TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
		tmf.init(caKs);

		// client key and certificates are sent to server so it can authenticate us
		KeyStore 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 factory
		SSLContext context = SSLContext.getInstance("TLSv1");
		context.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);

		return context.getSocketFactory();
	}
}
时间: 2024-10-18 00:56:59

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

(转)Java安全通信:HTTPS与SSL

转:http://www.cnblogs.com/devinzhang/archive/2012/02/28/2371631.html 1. HTTPS概念 1)简介 HTTPS(全称:Hypertext Transfer Protocol over Secure Socket Layer),是以安全为目标的HTTP通道,简单讲是HTTP的安全版.即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL.这个系统的最初研发由网景公司进行,提供了身份验证与加密通讯方法

第九篇 :微信公众平台开发实战Java版之如何实现自定义分享内容

微信JS-SDK是微信公众平台面向网页开发者提供的基于微信内的网页开发工具包. 通过使用微信JS-SDK,网页开发者可借助微信高效地使用拍照.选图.语音.位置等手机系统的能力,同时可以直接使用微信分享.扫一扫.卡券.支付等微信特有的能力,为微信用户提供更优质的网页体验. 本次的内容: 实现:分享到朋友圈,qq,qq空间,微信朋友的功能. 基础接口 判断当前客户端版本是否支持指定JS接口 wx.checkJsApi({ jsApiList: ['chooseImage'], // 需要检测的JS接

Java安全通信:HTTPS与SSL

1. HTTPS概念 1)简介 HTTPS(全称:Hypertext Transfer Protocol over Secure Socket Layer),是以安全为目标的HTTP通道,简单讲是HTTP的安全版.即HTTP下加入SSL层,HTTPS的安全基础是SSL,因此加密的详细内容就需要SSL.这个系统的最初研发由网景公司进行,提供了身份验证与加密通讯方法,现在它被广泛用于万维网上安全敏感的通讯,例如交易支付方面. 2)HTTPS和HTTP的区别 a. https协议需要到ca申请证书,一

AKKA文档(java版)

目前我正在翻译AKKA官网文档.翻译:吴京润 译者注:本人正在翻译AKKA官网文档,本篇是文档第一章,欢迎有兴趣的同学加入一起翻译.更多内容请读这里:https://tower.im/projects/ac49db18a6a24ae4b340a5fa22d930dc/lists/ded96c34f7ce4a6bb8b5473f596e1008/show/https://tower.im/projects/ac49db18a6a24ae4b340a5fa22d930dc/todos/640e53d

【java项目实践】详解Ajax工作原理以及实现异步验证用户名是否存在+源码下载(java版)

一年前,从不知道Ajax是什么,伴随着不断的积累,到现在经常使用,逐渐有了深入的认识.今天,如果想开发一个更加人性化,友好,无刷新,交互性更强的网页,那您的目标一定是Ajax. 介绍 在详细讨论Ajax是什么之前,先让我们花一分钟了解一下Ajax做什么.如图所示: 如上图展示给我们的就是使用Ajax技术实现的效果.伴随着web应用的越来越强大而出现的是等待,等待服务器响应,等待浏览器刷新,等待请求返回和生成新的页面成为了程序员们的最最头疼的难题.随着Ajax的出现使web应用程序变得更完善,更友

webservice的Axis2入门教程java版

本文转自百度文库 Axis2是一套崭新的WebService引擎,该版本是对Axis1.x重新设计的产物.Axis2不仅支持SOAP1.1和SOAP1.2,还集成了非常流行的REST WebService,同时还支持Spring.JSON等技术.这些都将在后面的系列教程中讲解.在本文中主要介绍了如何使用Axis2开发一个不需要任何配置文件的WebService,并在客户端使用Java和C#调用这个WebService. 一.Axis2的下载和安装 读者可以从如下的网址下载Axis2的最新版本:

搭建Java版WebService

如何搭建一个Web服务,做Android开发,不可避免会涉及到客户端开发,我们怎么样来实现一个服务端,怎么样来实现一个客户端,并相互传递数据.就算调用别人的服务时,也能知道大概是怎么样实现的. WebService一般分为.Net版和Java版,今天我们主要来实现Java版的WebService,.Net版本的还是比较简单的. 什么是WebServices? 它是一种构建应用程序的普遍模型,可以在任何支持网络通信的操作系统中实施运行;它是一种新的web应用程序分支,是自包含.自描述.模块化的应用

网易云音乐Java版爬虫

网易云音乐Java版爬虫 在编写爬虫之前,我们需要对网易云音乐网站网页类型进行分析,确认哪些页面是我们需要的,哪些页面是我们可以忽略的. 进入网易云音乐首页,浏览后发现其大概有这么几种类型的URL: 推荐页面 排行榜列表以及排行榜页面 歌单列表以及歌单页面 主播电台列表以及主播电台页面 歌手列表以及歌手页面 专辑列表(新碟上架)以及专辑页面 歌曲页面 最终需要爬取的数据在歌曲页面中,该页面里包含了歌曲的名称以及歌曲的评论数量. 另外,我们还需要尽可能多的获取歌曲页面,这些信息我们可以从前面6种类

java版b2b2c社交电商分布式微服务-Spring Cloud Config 加密和解密

重要 先决条件:要使用加密和解密功能,您需要在JVM中安装全面的JCE(默认情况下不存在).您可以从Oracle下载“Java加密扩展(JCE)无限强度管理策略文件”,并按照安装说明(实际上将JRE lib / security目录中的2个策略文件替换为您下载的文件). 如果远程属性源包含加密内容(以{cipher}开头的值),则在通过HTTP发送到客户端之前,它们将被解密.这种设置的主要优点是,当它们“静止”时,属性值不必是纯文本(例如在git仓库中).如果值无法解密,则从属性源中删除该值,并