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

时间:2013-06-14 12:02:29

标签: java ssl mqtt mosquitto

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

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

我希望通过使用预共享密钥来加密连接(身份验证并不重要),这是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实现的套接字?

感谢您的帮助: - )

3 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分:1)

我敢打赌,Paho客户端不支持开箱即用的TLS PSK。例如,TL​​S-PSK支持在openssl中只是相对较新的,因此它并没有得到广泛支持也就不足为奇了。例如,Python不支持它。

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

您可能最好将您的问题转到Paho邮件列表。

答案 2 :(得分:0)

是的,有可能通过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,但是这个方法对我来说很有用,因为TLS代理可以使用明文HiveMQ作为TLS代理。

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

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