Устройство автоматической подготовки в группе регистрации не работает (java SDK)

Я выполнил этот пример

https://docs.microsoft.com/en-us/azure/iot-dps/quick-enroll-device-x509-java

Он не отображается в разделе «Регистрационные записи» группы регистрации, но вызывает следующую ошибку:

PROVISIONING_DEVICE_STATUS_FAILED, исключение: com.microsoft.azure.sdk.iot.provisioning.device.internal.exceptions.ProvisioningDeviceHubException: информация сертификата подписи не соответствует элементам цепочки

Регистрация:

public class DeviceRegistration {
String idScope;
String globalEndpoint;
String clientCert;
String clientCertPrivateKey;
String signerCert;

public DeviceRegistration(String idScope, String globalEndpoint, String clientCert, String clientCertPrivateKey, String signerCert) {
    this.idScope = idScope;
    this.globalEndpoint = globalEndpoint;
    this.clientCert = clientCert;
    this.clientCertPrivateKey = clientCertPrivateKey;
    this.signerCert = signerCert;
}

public void register(ProvisioningDeviceClientRegistrationCallback callback) throws Exception {
    Collection<String> signerCertificates = new LinkedList<>();
    signerCertificates.add(signerCert);
    ProvisioningDeviceClient provisioningDeviceClient = null;

    SecurityProvider securityProviderX509 = new SecurityProviderX509Cert(clientCert, clientCertPrivateKey, signerCertificates);
    provisioningDeviceClient = ProvisioningDeviceClient.create(globalEndpoint, idScope, ProvisioningDeviceClientTransportProtocol.HTTPS,
                                                               securityProviderX509);

    provisioningDeviceClient.registerDevice(callback, this);

}

private static String loadFile(String filename) throws Exception {
    File f = new File(filename);
    if (!f.exists())
        throw new Exception("File not found: " + filename);
    BufferedReader reader = new BufferedReader(new FileReader(f));
    char[] buffer = new char[(int) f.length()];
    reader.read(buffer);
    reader.close();
    return new String(buffer);
}

public static void main(String[] args){
    try {
        CountDownLatch countDownLatch = new CountDownLatch(1);
        DeviceRegistration deviceRegistration = new DeviceRegistration(args[0], args[1], loadFile(args[2]), loadFile(args[3]), loadFile(args[4]));
        deviceRegistration.register(new ProvisioningDeviceClientRegistrationCallback() {
            @Override
            public void run(ProvisioningDeviceClientRegistrationResult provisioningDeviceClientRegistrationResult, Exception e, Object context) {
                if (provisioningDeviceClientRegistrationResult.getProvisioningDeviceClientStatus() == ProvisioningDeviceClientStatus.PROVISIONING_DEVICE_STATUS_ASSIGNED) {
                    System.out.println("IotHUb Uri : " + provisioningDeviceClientRegistrationResult.getIothubUri());
                    System.out.println("Device ID : " + provisioningDeviceClientRegistrationResult.getDeviceId());
                    countDownLatch.countDown();
                } else {
                    System.out.println("Result: "+provisioningDeviceClientRegistrationResult.getProvisioningDeviceClientStatus()+", Exception: "+e);
                }
            }
        });
        countDownLatch.await();
    } catch (Exception e) {
        e.printStackTrace();
    }

}}

person muelli    schedule 12.06.2018    source источник


Ответы (1)


Удалите отдельную регистрацию и убедитесь, что вы прошли проверку сертификата подписи X.509 (на вкладке «Сертификаты» на портале Azure). Если у вас есть как группа регистрации, так и индивидуальная регистрация для устройства, индивидуальная регистрация имеет приоритет.

person nberdy - MSFT    schedule 12.06.2018
comment
Уже сделали это. Сертификат проверен, индивидуальная регистрация удалена. Когда я снова запускаю пример, он отображается под индивидуальной регистрацией ... - person muelli; 12.06.2018
comment
Ваш код создает индивидуальную регистрацию. Это код устройства, которое вы моделируете? Устройства никогда не должны создавать регистрации. Вот пример кода для создания группы регистрации: github.com/Azure/azure-iot-sdk-java/blob/master/provisioning/ - person nberdy - MSFT; 13.06.2018
comment
У меня сложилось впечатление (в документации это не очень ясно), что у меня есть 1) создать группу 2) зарегистрировать устройство в этой группе и 3) зарегистрировать устройство (первый контакт). Я создал группу с примером, который вы упомянули выше. Я предполагаю, что могу просто зарегистрироваться. Сделал это (пример из документации), и ничего не происходит (тайм-аут). Реквизиты для регистрации групп пусты. - person muelli; 13.06.2018
comment
Спасибо за размещение кода! Прелесть групп заключается в том, что вам не нужно регистрировать устройство в группе - вам просто нужно создать группу, тогда каждое устройство, имеющее сертификат, подписанный сертификатом, связанным с группой, сможет зарегистрироваться. Ваш код по-прежнему создает индивидуальную регистрацию, а не группу, как вы хотите. Если у вас уже создана группа регистрации (возможно, потому, что вы создали ее на портале), попробуйте следующее: убедитесь, что у вас нет индивидуальной регистрации, убедитесь, что сертификат устройства связан с сертификатом подписи, затем запустите моделируемое устройство. - person nberdy - MSFT; 13.06.2018
comment
Также вот пример кода устройства для Java: github.com/Azure/azure-iot-sdk-java/blob/master/provisioning / - person nberdy - MSFT; 13.06.2018
comment
Большое спасибо за ваше терпение! Я обновил вопрос выше до текущего статуса. Я выполняю регистрацию устройства, как в примере (на самом деле, я скопировал это). Проблема заключалась в отсутствии сертификата подписавшего. Поэтому я добавил его в список (см. Фрагмент). Затем я получаю сообщение об ошибке, которое вы видите выше (сертификат подписавшего не совпадает с сертификатом CA). Мне непонятно, что мне нужно поместить в «Ваш публичный лист сертификата здесь». Это сертификат клиента? Или сертификат клиента плюс корневой сертификат? Документы MS здесь довольно скудные ... Спасибо. - person muelli; 13.06.2018
comment
Что ж, теперь я удалил группу и сертификат в разделе Сертификат в DPS. Сгенерировал новый сертификат, добавил его в раздел «Сертификаты», проверил - ОК. Затем я создал еще один сертификат для группы с другим CN. Добавил группу программно - ОК. Таким образом, сертификат в разделе «Сертификаты» и сертификат для группы теперь разные (различаются своим CN). Затем я запустил указанную выше программу с клиентским сертификатом, закрытым ключом и подписывающей стороной, все они получены из группового сертификата, и я получаю: - person muelli; 13.06.2018
comment
Результат: PROVISIONING_DEVICE_STATUS_FAILED, исключение: com.microsoft.azure.sdk.iot.provisioning.device.internal.exceptions.ProvisioningDeviceHubException: сертификат CA не найден - person muelli; 13.06.2018
comment
Ладно, похоже, мы по крайней мере сузили проблему. Похоже, у вас есть три сертификата: корневой сертификат, который вы загрузили и проверили, промежуточный сертификат, созданный из корневого сертификата, который вы поместили в группу регистрации, и листовой сертификат, созданный из промежуточного сертификата. Таким образом, цепочка сертификатов для сертификата вашего устройства должна выглядеть так (CN = корневой сертификат) - ›(CN = промежуточный сертификат) -› (CN = сертификат устройства). Не могли бы вы таким образом проверить цепочку ваших сертификатов? - person nberdy - MSFT; 14.06.2018
comment
Нет. Я использую DiceEmulator из образца MS. Он создает только эти сертификаты: root, client (промежуточный), подписывающий. Итак, я загрузил корень в Certificates of DPS и использовал клиентский (промежуточный) сертификат для создания группы регистрации. Но какой сертификат следует использовать на устройстве? ИМО ему нужен еще один промежуточный продукт, подписанный корнем или предыдущий промежуточный. - person muelli; 14.06.2018
comment
Я хочу добиться следующего: загрузить / проверить корень в разделе «Сертификаты DPS» как единственное действие, выполняемое вручную. Остальное должно делаться автоматически. Создайте одну группу регистрации и зарегистрируйте всех моих клиентов как устройства под ней. Получение URI центра IoT и имени устройства, а также отправка / получение сообщений. Я хотел использовать DiceEmulator для создания сертификатов за кулисами. - person muelli; 14.06.2018
comment
Я на шаг впереди. Я зарегистрировал корневой сертификат в разделе «Сертификаты» и проверил его - Хорошо. Затем я вручную создал группу регистрации, но не использовал промежуточное звено, а указал на корневой сертификат сверху. Затем я программно запустил регистрацию устройства, и она отображается в разделе «Регистрационные записи» группы. Но в головоломке есть один недостающий элемент: он всегда использует имя группы в качестве идентификатора устройства. В классе ProvisioningDeviceClient нет метода для программной установки идентификатора устройства. Также не в обратном вызове. Как программно установить идентификатор устройства? - person muelli; 14.06.2018
comment
Рад слышать, что вы продвинулись дальше! При использовании группы регистрации DPS всегда использует CN сертификата устройства в качестве идентификатора устройства. - person nberdy - MSFT; 14.06.2018
comment
Так что для этого мне потребуется подписать сертификат устройства корневым сертификатом группы. Это невозможно с DiceSimulator. Поэтому я не могу использовать групповую регистрацию, но должен вернуться к индивидуальному или использовать openssl, который мне не нужен. - person muelli; 14.06.2018
comment
Есть новости по этой проблеме? Я тоже застрял в этом и не могу добавить другое устройство с тем же сертификатом. @ AndreasMüller удалось ли вам найти решение? - person Alex; 28.12.2018