我在java中创建了一个MQTT Broker和一个客户端.它也可以完美地使用SSL.使用paho libs使用java编写的代理服务器和客户端,启用SSL很容易.我们只需要将URL中的协议从tcp切换到ssl IE:ssl://.messaging.internetofthings.ibmcloud.com:8883并在te src代码中设置一些道具:
java.util.Properties sslClientProps = new java.util.Properties();
sslClientProps.setProperty("com.ibm.ssl.protocol", "TLSv1.2");
options.setSSLProperties(sslClientProps);
Run Code Online (Sandbox Code Playgroud)
在SSLContext上
SSLContext sslContext = SSLContext.getInstance("TLSv1.2");
sslContext.init(null, null, null);
Run Code Online (Sandbox Code Playgroud)
创建安全和加密的连接(检查使用WireShark嗅探数据包).
使用特定的CA受信任证书也很有效(messaging.pem文件)
CertificateFactory cf = CertificateFactory.getInstance("X.509");
InputStream certFile = MqttHandler.class.getResourceAsStream("messaging.pem");
Certificate ca = cf.generateCertificate(certFile);
KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
keyStore.load(null, null);
keyStore.setCertificateEntry("ca", ca);
TrustManager trustManager = TrustManagerUtils.getDefaultTrustManager(keyStore);
SSLContext sslContext = SSLContextUtils.createSSLContext("TLSv1.2", null, trustManager);
options.setSocketFactory(sslContext.getSocketFactory());
Run Code Online (Sandbox Code Playgroud)
我需要使用Android客户端和自定义MQTT Java服务器代理(不使用SSL,MQTT发布和订阅也适用于Android).
麻烦似乎与从Android 创建SSLSocketFactory有关.
我做了这个测试:
1)设置SSL道具(就像我在上面报告的java客户端的src中所做的那样)
2)在Android客户端上传递CA可信证书(正如我在上面报告的java客户端的src中所做的那样)
3)以BouncyCastle格式(与Android兼容)从受信任的CA生成密钥存储区,如http://rijware.com/accessing-a-secure-mqtt-broker-with-android/所述,并在Android上传递密钥存储区客户:
CertificateFactory cf = CertificateFactory.getInstance("X.509");
InputStream keyStoreFile = getAssets().open("raw_key_file");
//keystore trusted
KeyStore keystoreTrust = …Run Code Online (Sandbox Code Playgroud)