Клиент Eclipse Paho MQTT на Java с использованием TLS

#java #mqtt #tls1.2 #paho

#java #mqtt #tls1.2 #пау

Вопрос:

Мне нужно создать клиент MQTT на Java, который использует Eclipse Paho.

Мой брокер MQTT стоит за обратным прокси-сервером Nginx TCP, у которого включен TLS. Поэтому мне нужно настроить клиент на использование TLS.

Тем не менее, я не хочу предоставлять своему клиенту сертификат (я не думаю, что мне это действительно нужно, поскольку я могу подключиться к узловому клиенту MQTT с включенным TLS, и этому клиенту не предоставляется никакого сертификата; то же самое, как мне сказали, с клиентом .NET Core).

Возможно ли это сделать с помощью библиотеки Eclipse Paho? Все примеры, которые я могу найти, используют сертификат.

Ответ №1:

Да, вам просто нужно указать ssl:// mqtts:// URL tcp:// -адрес or вместо or mqtt://

например, используя пример на странице клиента Paho Java:

 String topic        = "MQTT Examples";
String content      = "Message from MqttPublishSample";
int qos             = 2;
String broker       = "tcp://mqtt.eclipse.org:1883";
String clientId     = "JavaSample";
MemoryPersistence persistence = new MemoryPersistence();
 

Вам просто нужно изменить broker строку на:

 String broker       = "ssl://mqtt.eclipse.org:8883";
 

Это предполагает, что nginx прослушивает порт 8883 и что брокер использует сертификат, подписанный общедоступным доверенным центром сертификации.

Все это также описано в Javadoc здесь

Комментарии:

1. Большое спасибо за очень быстрый ответ. Всего два замечания. 1) Брокер MQTT вообще не настроен на использование сертификата, Nginx — единственный, у которого есть сертификат TLS. 2) Я попробовал пример Java-клиента Paho с предложенной модификацией, как вы сообщили об этом выше, и я получил исключение типа MqttException (0) - javax.net.ssl.SSLHandshakeException: PKIX path validation failed: java.security.cert.CertPathValidatorException: validity check failed .

2. Что касается клиента, то nginx является брокером. Второй момент заключается в том, что вы не используете сертификат от реального центра сертификации. Вам нужно будет добавить сертификат CA в хранилище доверия и предоставить пользовательский SSLSocketFactory

3. Хорошо, большое спасибо за замечание о клиенте и Nginx, понятно, что вы говорите. Я очень скоро попытаюсь настроить и предоставить пользовательский SSLSocketFactory интерфейс и дам вам знать, если это сработает.

4. Это работающий пример того, что сказал @hardillb: github.com/iakko/mqtt-paho-tls-example . Это также устраняет проблему с исключением SSLHandshakeException.

5. Большое спасибо за замечание и указание, @iakko!