【问题标题】:How can I create a PSK connection between the Eclipse PAHO Java MQTT client and the Mosquitto broker?如何在 Eclipse PAHO Java MQTT 客户端和 Mosquitto 代理之间创建 PSK 连接?
【发布时间】:2013-06-14 12:02:28
【问题描述】:

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

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

我想使用 Pre Shared Key 对连接进行加密(身份验证不重要),mosquitto broker 肯定支持,但我不确定 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 实现的套接字?

感谢您的帮助:-)

【问题讨论】:

    标签: java ssl mqtt mosquitto


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

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

      您最好将问题直接发送到 Paho 邮件列表。

      【讨论】:

      • 感谢您提供的信息 - 我没有意识到 TLS-PSK 最近才被引入到 openssl 中,所以这是有道理的。也感谢您的建议 - 我尝试通过邮件列表进行联系,但在尝试发送查询或加入请求后几个小时,我收到了很多“交付失败”通知......但我会坚持下去 :)
      【解决方案3】:

      是的,可以向 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,但这种方法对我有用,在 stunnel 后面有一个明文 HiveMQ 作为 TLS 代理。

      如果您需要更改/选择密码,则只需像这样覆盖 MyPSKTlsClient 中的 getCipherSuites:

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

      【讨论】:

        猜你喜欢
        • 2012-10-11
        • 1970-01-01
        • 1970-01-01
        • 2023-03-22
        • 2021-05-07
        • 1970-01-01
        • 2017-08-19
        • 2013-11-30
        • 1970-01-01
        相关资源
        最近更新 更多