IoT Java Device SDK не может разрешить клиентскую конечную точку в Linux

Я прошел через руководство по IoT в консоли AWS для настройки устройства Linux/Java, которое загружает zip-файл и в конечном итоге использует код здесь: https://github.com/aws/aws-iot-device-sdk-java. Когда я запускаю сценарий start.sh из архива, я вижу исключение UnknownHostException, и сценарий завершается ошибкой.

Cert file:../java-thing.cert.pem Private key: ../java-thing.private.key
Sep 21, 2017 10:23:11 PM com.amazonaws.services.iot.client.mqtt.AwsIotMqttConnectionListener onFailure
WARNING: Connect request failure
MqttException (0) - java.net.UnknownHostException: a2vnfud9kry2r9.iot.us-east-1.amazonaws.com
        at org.eclipse.paho.client.mqttv3.internal.ExceptionHelper.createMqttException(ExceptionHelper.java:38)
        at org.eclipse.paho.client.mqttv3.internal.ClientComms$ConnectBG.run(ClientComms.java:664)
        at java.lang.Thread.run(Thread.java:748)
Caused by: java.net.UnknownHostException: a2vnfud9kry2r9.iot.us-east-1.amazonaws.com
        at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:184)
        at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
        at java.net.Socket.connect(Socket.java:589)
        at sun.security.ssl.SSLSocketImpl.connect(SSLSocketImpl.java:668)
        at org.eclipse.paho.client.mqttv3.internal.TCPNetworkModule.start(TCPNetworkModule.java:70)
        at org.eclipse.paho.client.mqttv3.internal.SSLNetworkModule.start(SSLNetworkModule.java:86)
        at org.eclipse.paho.client.mqttv3.internal.ClientComms$ConnectBG.run(ClientComms.java:650)
        ... 1 more

Диагностика подключения, как это предлагается в официальных документах, не вызывает проблем; подключается нормально:

openssl s_client -connect a2vnfud9kry2r9.iot.us-east-1.amazonaws.com:8443 -CAfile root-CA.crt -cert java-thing.cert.pem -key java-thing.private.key

Что также странно, так это то, что проверка связи с конечной точкой клиента работает, но другие инструменты, такие как telnet, не могут разрешить имя хоста.

Что я делаю неправильно?


person noelob    schedule 26.09.2017    source источник
comment
Может ли это быть проблемой с IPv6 в Linux? Я пробовал тот же учебник на OSX, и он отлично работает.   -  person noelob    schedule 26.09.2017


Ответы (1)


Я понял, как обойти это: установить -Djava.net.preferIPv4Stack=true.

Конечные точки IoT в AWS поддерживают как IPv6, так и IPv4, а Java по умолчанию предпочитает IPv6. Из документов:

Сетевой стек Java сначала проверяет, поддерживается ли IPv6 в базовой ОС. Если IPv6 поддерживается, он пытается использовать стек IPv6. В частности, в системах с двумя стеками создается сокет IPv6.

Похоже, что-то в моей сетевой конфигурации Ubuntu настроено неправильно для правильной работы IPv6. Если кто-то может пролить свет на то, почему, это было бы здорово.

Моя проблема, вероятно, связана с этой.

person noelob    schedule 11.10.2017