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



我正在尝试配置一个Pre - Shared Key加密连接,在一个蚊虫mqtt代理和一个用Java编写的使用Eclipse Paho客户端库的应用程序之间。

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

我想通过使用Pre - Shared Key对连接进行加密(身份验证不重要),这是蚊虫代理绝对支持的,但我不确定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/

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

  • https://stackoverflow.com/questions/15403999/jsse-implementation-of-tls-psk
  • 定义JCA中TLS的密码套件

我打赌Paho客户端不支持TLS PSK。例如,TLS-PSK支持在openssl中只是相对较新的,所以它没有得到广泛支持并不奇怪。例如,Python不支持。

我所知道的唯一支持TLS-PSK的MQTT客户端是那些基于蚊子到C/c++库的客户端,如蚊to_pub/蚊to_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使用无意义体生成它们。为了便于阅读,我把它们从代码中去掉了。

我不知道蚊子,但这种方法对我有效,在隧道后面有一个明文的HiveMQ作为tls代理。

如果您需要更改/选择密码,那么只需在MyPSKTlsClient中重写getCipherSuites,像这样:

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

最新更新