IoT-устройство с подключением Symmetri c Key к IoT Edge Device - PullRequest
2 голосов
/ 12 февраля 2020

Я пытаюсь использовать прозрачный шлюз с нисходящими устройствами. Я следую документации как создать прозрачный шлюз , предоставленной Microsoft. Я установил azure IoT Edge Runtime на виртуальную машину Ubuntu 18.04. Время выполнения IoT отлично работает с одним пользовательским модулем java.

Я создал устройство IoT на портале Azure с ключом Symmetri c. Я добавил свое IoT Edge Device в качестве родительского для этого IoT Device. Я использую java sample send-event для отправки сообщения на устройство IoT Edge.

Я скопировал строку подключения IoT-устройства с портала azure и изменил ее согласно документации Получить и изменить строку подключения . Моя строка подключения для устройства IoT выглядит следующим образом: HostName=myGatewayDevice;DeviceId=myDownstreamDevice;SharedAccessKey=xxxyyyzzz

в приведенной выше строке подключения myGatewayDevice - это hostname виртуальной машины Ubuntu, на которой выполняется среда IoT Edge. Когда я запускаю этот пример, я получаю следующее исключение

Starting...
Beginning setup.
Successfully read input parameters.
Using communication protocol MQTT.
Exception in thread "main" java.lang.IllegalArgumentException: Provided hostname did not include a valid IoT Hub name as its prefix. An IoT Hub hostname has the following format: [iotHubName].[valid URI chars]
    at com.microsoft.azure.sdk.iot.device.IotHubConnectionString.parseHubName(IotHubConnectionString.java:321)
    at com.microsoft.azure.sdk.iot.device.IotHubConnectionString.validateTerms(IotHubConnectionString.java:287)
    at com.microsoft.azure.sdk.iot.device.IotHubConnectionString.<init>(IotHubConnectionString.java:121)
    at com.microsoft.azure.sdk.iot.device.DeviceClient.<init>(DeviceClient.java:176)
    at samples.com.microsoft.azure.sdk.iot.SendEvent.main(SendEvent.java:171)

Когда я изменяю строку подключения IoT-устройства следующим образом

HostName=myiothub.azure-devices.net;DeviceId=myDownstreamDevice;SharedAccessKey=xxxyyyzzz;GatewayHostName=myGatewayDevice Я получаю ошибку ниже

Exception encountered while sending MQTT CONNECT packet
MqttException (0) - javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
    at org.eclipse.paho.client.mqttv3.internal.ExceptionHelper.createMqttException(ExceptionHelper.java:38)
    at org.eclipse.paho.client.mqttv3.internal.ClientComms$ConnectBG.run(ClientComms.java:736)
    at java.lang.Thread.run(Thread.java:748)

Пожалуйста, помогите мне исправить это. Я хочу, чтобы связь произошла с устройством IoT Edge. любая помощь будет высоко оценена.

Редактировать 1

Вот вывод sudo openssl s_client -connect RajUbuntuVM:8883 -CAfile Production/EdgeCerts/RootCACertificate/azure-iot-test-only.root.ca.cert.pem -showcerts

      0040 - 95 c4 40 5b f9 a8 0d 3c-62 83 50 05 ea 1f b9 0a   ..@[...<b.P.....
    0050 - 25 e6 99 8a 27 47 4d 55-25 3d 30 aa 00 94 ea 6a   %...'GMU%=0....j
    0060 - 89 ad 18 60 8f 6b f6 4d-66 6d 05 29 87 6e b0 38   ...`.k.Mfm.).n.8
    0070 - a7 01 38 6f 6e 11 c1 db-62 20 43 de 0d 8d ba 29   ..8on...b C....)
    0080 - ca 91 78 ff a7 5a 49 1a-d6 ed ae 1d ac 65 73 b8   ..x..ZI......es.
    0090 - e1 08 9e 41 63 59 37 ad-88 f9 bd 29 06 8e ca 14   ...AcY7....)....

    Start Time: 1581571257
    Timeout   : 7200 (sec)
    Verify return code: 0 (ok)
    Extended master secret: yes
---

Оба моих устройства IoT Device и IoT Edge Device работают на одной виртуальной машине Ubuntu. Я установил root ca в устройстве Ubuntu, как показано ниже

sudo cp <path>/azure-iot-test-only.root.ca.cert.pem /usr/local/share/ca-certificates/azure-iot-test-only.root.ca.cert.pem.crt
sudo update-ca-certificates

Разрешение:

Спасибо Silent за указание в правильном направлении. Мне нужно добавить путь azure-iot-test-only.root.ca.cert.pem.crt в мой код java. для устройств с симметричной аттестацией ключа c необходимо предоставить сертификат root ca для проверки устройства шлюза. этот сертификат не нужен для прямой связи с Azure IoT Hub для устройств Symmetri c.

1 Ответ

1 голос
/ 12 февраля 2020

Ваш IoT Edge использует (по умолчанию) самозаверяющий сертификат для входящих соединений. Вы должны сделать ваше нижестоящее устройство доверяющим этому сертификату. Подробнее об этом см. Здесь:

https://docs.microsoft.com/en-us/azure/iot-edge/how-to-connect-downstream-device

...