#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!