打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
android mosquitto客户端使用SSL功能的具体操作总结(android mqtt 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实例。相关代码如下所示:

   
  1. m_conOpt = new MqttConnectOptions();    
  2.    ……    
  3.        try {    
  4.            m_conOpt.setSocketFactory(SslUtil.getSocketFactory(caFilePath, clientCrtFilePath, clientKeyFilePath, sspwd));    
  5.        } catch (Exception e) {    
  6.            e.printStackTrace();    
  7.    }   


(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的源码:

   

  1. package test.com.browan.mqtt;    
  2.     
  3. import java.io.*;    
  4. import java.nio.file.*;    
  5. import java.security.*;    
  6. import java.security.cert.*;    
  7. import javax.net.ssl.*;    
  8.      
  9. import org.bouncycastle.jce.provider.*;    
  10. import org.bouncycastle.openssl.*;    
  11.      
  12. public class SslUtil    
  13. {    
  14.     static SSLSocketFactory getSocketFactory (final String caCrtFile, final String crtFile, final String keyFile,     
  15.                                               final String password) throws Exception    
  16.     {    
  17.         Security.addProvider(new BouncyCastleProvider());    
  18.      
  19.         // load CA certificate    
  20.         PEMReader reader = new PEMReader(new InputStreamReader(new ByteArrayInputStream(Files.readAllBytes(Paths.get(caCrtFile)))));    
  21.         X509Certificate caCert = (X509Certificate)reader.readObject();    
  22.         reader.close();    
  23.      
  24.         // load client certificate    
  25.         reader = new PEMReader(new InputStreamReader(new ByteArrayInputStream(Files.readAllBytes(Paths.get(crtFile)))));    
  26.         X509Certificate cert = (X509Certificate)reader.readObject();    
  27.         reader.close();    
  28.      
  29.         // load client private key    
  30.         reader = new PEMReader(    
  31.                 new InputStreamReader(new ByteArrayInputStream(Files.readAllBytes(Paths.get(keyFile)))),    
  32.                 new PasswordFinder() {    
  33.                     @Override    
  34.                     public char[] getPassword() {    
  35.                         return password.toCharArray();    
  36.                     }    
  37.                 }    
  38.         );    
  39.         KeyPair key = (KeyPair)reader.readObject();    
  40.         reader.close();    
  41.      
  42.         // CA certificate is used to authenticate server    
  43.         KeyStore caKs = KeyStore.getInstance(KeyStore.getDefaultType());    
  44.         caKs.load(null, null);    
  45.         caKs.setCertificateEntry("ca-certificate", caCert);    
  46.         TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());    
  47.         tmf.init(caKs);    
  48.      
  49.         // client key and certificates are sent to server so it can authenticate us    
  50.         KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType());    
  51.         ks.load(null, null);    
  52.         ks.setCertificateEntry("certificate", cert);    
  53.         ks.setKeyEntry("private-key", key.getPrivate(), password.toCharArray(), new java.security.cert.Certificate[]{cert});    
  54.         KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());    
  55.         kmf.init(ks, password.toCharArray());    
  56.      
  57.         // finally, create SSL socket factory    
  58.         SSLContext context = SSLContext.getInstance("TLSv1");    
  59.         context.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null);    
  60.      
  61.         return context.getSocketFactory();    
  62.     }    
  63. }    



本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
Webservice 和 SSL 问题故障排除
java 关于TLS的Renegotiation说明
Yale CAS + .net Client 实现 SSO(1)
CAS单点登录之mysql数据库用户验证及常见问题
JDK安全证书的一个错误消息 No subject alternative names present的解决办法
Binder通讯机制,大纲和学习计划
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服