Устройство IoT с подключением симметричного ключа к устройству IoT Edge

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

Я создал IoT-устройство на портале Azure с симметричным ключом. Я добавил свое устройство IoT Edge в качестве родительского для этого устройства IoT. Я использую образец java 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-код. для устройств с аттестацией симметричным ключом им необходимо предоставить сертификат корневого CA для проверки устройства шлюза. этот сертификат не требуется для прямой связи с Центром Интернета вещей Azure для симметричных устройств.


person Raj    schedule 12.02.2020    source источник


Ответы (1)


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

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

person silent    schedule 12.02.2020
comment
Привет, я отредактировал свой вопрос и добавил информацию об обновлении сертификата CA на нисходящем устройстве. Не могли бы вы проверить это однажды - person Raj; 13.02.2020