如何在Eclipse PAHO Java MQTT客户端和Mosquitto代理之间创建PSK连接?

我正在尝试在mosquitto mqtt代理和使用Eclipse Paho客户端库的Java编写的应用程序之间配置预共享密钥加密连接。

我已经成功地在两者之间建立连接,使用无加密并使用SSL,其中服务器证书经过身份validation但没有客户端证书。

我想通过使用预共享密钥来加密连接(身份validation并不重要),这是mosquitto代理肯定支持的,但我不确定Eclipse Paho库是否支持它。

该库为您提供了两种配置安全连接的方法。 要么通过

setSSLProperties(java.util.Properties props) 

方法 – 使用以下属性:

 com.ibm.ssl.protocol com.ibm.ssl.contextProvider com.ibm.ssl.keyStore com.ibm.ssl.keyStorePassword com.ibm.micro.security.Password.obfuscate(char[] password). com.ibm.ssl.keyStoreType com.ibm.ssl.keyStoreProvider com.ibm.ssl.trustStore com.ibm.ssl.trustStorePassword com.ibm.micro.security.Password.obfuscate(char[] password). com.ibm.ssl.trustStoreType com.ibm.ssl.trustStoreProvider com.ibm.ssl.enabledCipherSuites com.ibm.ssl.keyManager com.ibm.ssl.trustManager 

或通过

 setSocketFactory(javax.net.SocketFactory socketFactory) 

方法。

有没有人对我使用的工具和库有任何经验,任何人都可以提供任何建议,以便我可以得到一些有用的东西?

是否有可能创建一个ssl套接字工厂,它能够返回一个可以应对我需要的PSK实现的套接字?

谢谢你的帮助 :-)

Paho客户端依赖于JVM运行时中提供的任何安全性密码等; Paho不提供任何自己。

据我所知,主流JVM提供商都没有提供TLS-PSK支持。 可以添加来自第三方的支持,例如http://www.bouncycastle.org/

您可能还想检查有关此主题的这些(目前尚未回答的)问题:

我敢打赌,Paho客户端不支持开箱即用的TLS PSK。 例如,TL​​S-PSK支持在openssl中仅相对较新,所以它并没有得到广泛支持并不令人惊讶。 例如,Python不支持它。

我所知道的唯一支持TLS-PSK的MQTT客户端是基于mosquitto C / C ++库的那些客户端,例如mosquitto_pub / mosquitto_sub。

你可能会更好地将你的问题引导到Paho邮件列表。

是的,有可能通过paho mqtt客户端传递使用充气城堡进行TLS-PSK的SocketFactory。 虽然不是很漂亮(也许有人有更好的解决方案吗?)。

我的答案基于这个例子: http ://tiebing.blogspot.de/2013/09/java-bouncy-castle-tls-psk-example.html从那里你拿内部类Z_PSKIdentity和MyPSKTlsClient。

然后你需要一个像这样的SocketFactory:

 class PskSocketFactory extends SSLSocketFactory { public Socket createSocket() { SSLSocket mySocket = new SSLSocket() { TlsClientProtocol protocol = null; @Override public void startHandshake() throws IOException { try { protocol = new TlsClientProtocol(super.getInputStream(), super.getOutputStream(), new SecureRandom()); } catch (Exception e) { e.printStackTrace(); } Z_PSKIdentity pskIdentity = new Z_PSKIdentity(); MyPSKTlsClient client = new MyPSKTlsClient(pskIdentity); protocol.connect(client); } @Override public InputStream getInputStream() throws IOException { return protocol.getInputStream(); } @Override public OutputStream getOutputStream() throws IOException { return protocol.getOutputStream(); } return mySocket; } } } 

SSLSocketFactory和SSLSocket中有很多抽象方法。 你需要实现它们,但据我所知它们没有被使用,所以你可以让你的IDE用无意义的机构生成它们。 为了便于阅读,我把它们从代码中删除了。

我不知道mosquitto,但是这个方法对我来说有一个明确的HiveMQ后面的stunnel作为TLS代理。

如果您需要更改/选择密码,那么只需覆盖MyPSKTlsClient中的getCipherSuites,如下所示:

 public int[] getCipherSuites() { return new int[] { CipherSuite.TLS_PSK_WITH_AES_256_CBC_SHA }; }