Inicio rápido: Aprovisionamiento de un dispositivo simulado de certificado X.509
En este inicio rápido, crea un dispositivo simulado en una máquina Windows. El dispositivo simulado está configurado para usar la atestación de certificados X.509 para la autenticación. Después de configurar el dispositivo, aprovisiónelo en un centro de IoT mediante Azure IoT Hub Device Provisioning Service.
Si no conoce el proceso de aprovisionamiento, consulte la información general sobre el aprovisionamiento. Asegúrese de completar los pasos descritos en Configuración del servicio Azure IoT Hub Device Provisioning con Azure Portal antes de continuar.
En este inicio rápido se muestra una solución para una estación de trabajo basada en Windows. No obstante, también puede realizar los procedimientos en Linux. Para obtener un ejemplo de Linux, vea el Tutorial: Aprovisionamiento de la geolatencia.
Requisitos previos
Si no tiene una suscripción a Azure, cree una cuenta gratuita antes de empezar.
Realice los pasos que se describen en Configuración de IoT Hub Device Provisioning Service con Azure Portal.
Los siguientes requisitos previos corresponden a un entorno de desarrollo de Windows. En el caso de Linux o macOS, consulte la sección correspondiente en Preparación del entorno de desarrollo en la documentación del SDK.
Instale Visual Studio 2022 con la carga de trabajo "Desarrollo para el escritorio con C++" habilitada. También se admiten Visual Studio 2015, Visual Studio 2017 y Visual Studio 19. En el caso de Linux o macOS, consulte la sección correspondiente en Preparación del entorno de desarrollo en la documentación del SDK.
Instale el sistema de compilación de CMake más reciente. Asegúrese de comprobar la opción que agrega el ejecutable de CMake a la ruta de acceso.
Importante
Confirme que los requisitos previos de Visual Studio (Visual Studio y la carga de trabajo "Desarrollo para el escritorio con C++") estén instalados en la máquina antes de empezar la instalación de
CMake
. Una vez que los requisitos previos están en su lugar, y se ha comprobado la descarga, instale el sistema de compilación de CMake. Igualmente, tenga en cuenta que las versiones anteriores del sistema de compilación CMake no generan el archivo de solución que se usa en este artículo. Asegúrese de usar la versión más reciente de CMake.
Los siguientes requisitos previos corresponden a un entorno de desarrollo de Windows. En el caso de Linux o macOS, consulte la sección correspondiente en Preparación del entorno de desarrollo en la documentación del SDK.
Instale el SDK de .NET 6.0 o una versión posterior en una máquina con Windows. Para comprobar la versión, use el siguiente comando.
dotnet --info
Los siguientes requisitos previos corresponden a un entorno de desarrollo de Windows. En el caso de Linux o macOS, consulte la sección correspondiente en Preparación del entorno de desarrollo en la documentación del SDK.
- Instale Node.js v4.0 o una versión superior en la máquina.
Los siguientes requisitos previos corresponden a un entorno de desarrollo de Windows.
- Python 3.6 o una versión superior en la máquina.
Los siguientes requisitos previos corresponden a un entorno de desarrollo de Windows. En el caso de Linux o macOS, consulte la sección correspondiente en Preparación del entorno de desarrollo en la documentación del SDK.
Instale Java SE Development Kit 8 o cualquier versión posterior, en la máquina.
Descargue e instale Maven.
Instale la última versión de Git. Asegúrese de que Git se ha agregado a las variables de entorno accesibles desde la ventana de comandos. Consulte las herramientas de cliente de Git de Software Freedom Conservancy para instalar la versión más reciente de las herramientas
git
, lo que incluye Git Bash, la aplicación de línea de comandos que puede usar para interactuar con su repositorio de Git local.Asegúrese de que OpenSSL está instalado en la máquina. En Windows, la instalación de Git incluye una instalación de OpenSSL. Puede acceder a OpenSSL desde el símbolo del sistema de Git Bash. Para comprobar que OpenSSL está instalado, abra un símbolo del sistema de Git Bash y escriba
openssl version
.Nota:
A menos que esté familiarizado con OpenSSL y ya lo tenga instalado en la máquina Windows, se recomienda usar OpenSSL desde el símbolo del sistema de Git Bash. Como alternativa, puede optar por descargar el código fuente y compilar OpenSSL. Para más información, consulte la página Descargas de OpenSSL. O bien, puede descargar la precompilación de OpenSSL de un tercero. Para más información, consulte la wiki de OpenSSL. Microsoft no garantiza la validez de los paquetes descargados de terceros. Si decide compilar o descargar OpenSSL, asegúrese de que se puede acceder al binario de OpenSSL en la ruta de acceso y de que la variable de entorno
OPENSSL_CNF
esté establecida en la ruta de acceso del archivo openssl.cnf.Abra un símbolo del sistema de Windows y un símbolo del sistema de Git Bash.
En los pasos de este inicio rápido se supone que usa una máquina Windows y la instalación de OpenSSL que se instala como parte de Git. Se usa el indicador Git Bash para emitir comandos OpenSSL y el indicador de comandos de Windows para todo lo demás. Si usa Linux, puede emitir todos los comandos desde un shell de Bash.
Preparación del entorno de desarrollo
En esta sección, preparará un entorno de desarrollo que se usa para compilar el SDK de Azure IoT para C. El código de ejemplo intenta aprovisionar el dispositivo durante la secuencia de arranque del dispositivo.
Abra un explorador web y vaya a la página de la versión del SDK de Azure IoT para C.
Seleccione la pestaña Etiquetas en la parte superior de la página.
Copie el nombre de etiqueta de la versión más reciente del SDK de Azure IoT para C.
En el símbolo del sistema de Windows, ejecute los siguientes comandos para clonar la versión más reciente del repositorio de GitHub del SDK de dispositivo loT de Azure para C. Reemplace
<release-tag>
con el nombre de la etiqueta que copió en el paso anterior, por ejemplo:lts_01_2023
.git clone -b <release-tag> https://github.com/Azure/azure-iot-sdk-c.git cd azure-iot-sdk-c git submodule update --init
Esta operación puede tardar varios minutos en completarse.
Una vez completada la operación, ejecute los siguientes comandos desde el directorio
azure-iot-sdk-c
:mkdir cmake cd cmake
El código de ejemplo usa un certificado X.509 para proporcionar atestación mediante la autenticación de X.509. Ejecute el siguiente comando para compilar una versión del SDK específica para su plataforma de desarrollo que incluya el cliente de aprovisionamiento de dispositivos. Se genera una solución de Visual Studio para el dispositivo simulado en el directorio
cmake
.Al especificar la ruta de acceso que se usa con
-Dhsm_custom_lib
en el comando siguiente, asegúrese de usar la ruta de acceso absoluta a la biblioteca en el directoriocmake
que ha creado anteriormente. En la ruta de acceso que se muestra se supone que ha clonado el SDK de C en el directorio raíz de la unidad de C. Si usó otro directorio, ajuste la ruta de acceso según corresponda.
Sugerencia
Si cmake
no encuentra el compilador de C++, es posible que aparezcan errores de compilación al ejecutar el comando anterior. Si eso sucede, pruebe a ejecutar este comando en el símbolo del sistema de Visual Studio.
Una vez realizada la compilación, las últimas líneas de salida son similares a las siguientes:
-- Building for: Visual Studio 17 2022 -- Selecting Windows SDK version 10.0.19041.0 to target Windows 10.0.22000. -- The C compiler identification is MSVC 19.32.31329.0 -- The CXX compiler identification is MSVC 19.32.31329.0 ... -- Configuring done -- Generating done -- Build files have been written to: C:/azure-iot-sdk-c/cmake
En el símbolo del sistema de Windows, clone el repositorio de GitHub de los ejemplos de kit de desarrollo de software para internet de las cosas de Azure para C# mediante el comando siguiente:
git clone https://github.com/Azure/azure-iot-sdk-csharp.git
En el símbolo del sistema de Windows, clone el repositorio de GitHub del SDK de Azure IoT para Node.js mediante los siguientes comandos:
git clone https://github.com/Azure/azure-iot-sdk-node.git
En el símbolo del sistema de Windows, clone el repositorio de GitHub del SDK de dispositivo loT de Azure para Python con el comando siguiente:
git clone -b v2 https://github.com/Azure/azure-iot-sdk-python.git --recursive
Nota
Los ejemplos que se usan en este tutorial se encuentran en la rama v2 del repositorio azure-iot-sdk-python. La versión 3 del SDK de Python está disponible para su uso en la versión beta.
En el símbolo del sistema de Windows, clone el repositorio de GitHub de los ejemplos de Azure IoT para Java:
git clone https://github.com/Azure/azure-iot-sdk-java.git --recursive
Vaya al directorio
azure-iot-sdk-java
raíz y compile el proyecto para descargar todos los paquetes necesarios.cd azure-iot-sdk-java mvn install -DskipTests=true
Creación de un certificado de dispositivo X.509 autofirmado
En esta sección, se usa OpenSSL para crear un certificado X.509 autofirmado y una clave privada. Este certificado se carga en su instancia de servicio de aprovisionamiento y es verificado por el servicio.
Precaución
Use certificados creados con OpenSSL en este inicio rápido solo para pruebas de desarrollo. No use estos certificados en producción. Estos certificados expiran después de 30 días y pueden contener contraseñas codificadas de forma rígida, como 1234. Para saber cómo obtener certificados adecuados para usarse en producción, consulte Cómo obtener un certificado de entidad de certificación X.509 en la documentación de Azure IoT Hub.
Realice los pasos de esta sección en el símbolo del sistema de Git Bash.
En el símbolo del sistema de Git Bash, vaya a un directorio donde le gustaría crear los certificados.
Ejecute el comando siguiente:
winpty openssl req -outform PEM -x509 -sha256 -newkey rsa:4096 -keyout device-key.pem -out device-cert.pem -days 30 -extensions usr_cert -addext extendedKeyUsage=clientAuth -subj "//CN=my-x509-device"
Importante
La barra diagonal adicional que se proporciona para el nombre de firmante (
//CN=my-x509-device
) solo es necesaria para escapar la cadena con Git en plataformas Windows.Cuando se le pida que Enter PEM pass phrase: (Escriba la frase de contraseña de PEM:) use la frase de contraseña
1234
.Cuando se le pregunte de nuevo Verifying - Enter PEM pass phrase: (Verificando: escriba la fase de contraseña de PEM), use de nuevo la frase de contraseña
1234
.Ahora se deben generar un archivo de certificado de clave pública (device-cert.pem) y un archivo de clave privada (device-key.pem) en el directorio donde ejecutó el comando
openssl
.El archivo de certificado tiene su nombre común de sujeto (CN) establecido en
my-x509-device
. En el caso de las inscripciones basadas en X.509, el identificador de registro se establece en el nombre común. El identificador de registro es una cadena que no distingue mayúsculas de minúsculas de caracteres alfanuméricos más los caracteres especiales:'-'
,'.'
,'_'
,':'
. El último carácter debe ser alfanumérico o un guion ('-'
). El nombre común debe respetar este formato. DPS admite identificadores de registro de hasta 128 caracteres; sin embargo, la longitud máxima del nombre común del firmante en un certificado X.509 es de 64 caracteres. El identificador de registro, por lo tanto, se limita a 64 caracteres cuando se utilizan certificados X.509.El archivo de certificado está codificado en Base 64. Para ver el nombre común del firmante (CN) y otras propiedades del archivo de certificado, escriba el siguiente comando:
Certificate: Data: Version: 3 (0x2) Serial Number: 77:3e:1d:e4:7e:c8:40:14:08:c6:09:75:50:9c:1a:35:6e:19:52:e2 Signature Algorithm: sha256WithRSAEncryption Issuer: CN = my-x509-device Validity Not Before: May 5 21:41:42 2022 GMT Not After : Jun 4 21:41:42 2022 GMT Subject: CN = my-x509-device Subject Public Key Info: Public Key Algorithm: rsaEncryption RSA Public-Key: (4096 bit) Modulus: 00:d2:94:37:d6:1b:f7:43:b4:21:c6:08:1a:d6:d7: e6:40:44:4e:4d:24:41:6c:3e:8c:b2:2c:b0:23:29: ... 23:6e:58:76:45:18:03:dc:2e:9d:3f:ac:a3:5c:1f: 9f:66:b0:05:d5:1c:fe:69:de:a9:09:13:28:c6:85: 0e:cd:53 Exponent: 65537 (0x10001) X509v3 extensions: X509v3 Basic Constraints: CA:FALSE Netscape Comment: OpenSSL Generated Certificate X509v3 Subject Key Identifier: 63:C0:B5:93:BF:29:F8:57:F8:F9:26:44:70:6F:9B:A4:C7:E3:75:18 X509v3 Authority Key Identifier: keyid:63:C0:B5:93:BF:29:F8:57:F8:F9:26:44:70:6F:9B:A4:C7:E3:75:18 X509v3 Extended Key Usage: TLS Web Client Authentication Signature Algorithm: sha256WithRSAEncryption 82:8a:98:f8:47:00:85:be:21:15:64:b9:22:b0:13:cc:9e:9a: ed:f5:93:b9:4b:57:0f:79:85:9d:89:47:69:95:65:5e:b3:b1: ... cc:b2:20:9a:b7:f2:5e:6b:81:a1:04:93:e9:2b:92:62:e0:1c: ac:d2:49:b9:36:d2:b0:21
El código de ejemplo requiere una clave privada que no está cifrada. Ejecute el siguiente comando para crear una clave privada sin cifrar:
Cuando aparezca el mensaje Escriba la frase de contraseña para device-key.pem:, use la misma frase de contraseña que utilizó anteriormente:
1234
.
Mantenga abierto el símbolo del sistema de Git Bash. Lo necesitará más adelante en esta guía rápida.
El código de ejemplo de C# está configurado para usar los certificados X.509 almacenados en un archivo con formato PKCS#12 protegido con contraseña (certificate.pfx
). Todavía necesita el archivo de certificado de clave pública con formato PEM (device-cert.pem
) que acaba de crear para crear una entrada de inscripción individual más adelante en este inicio rápido.
Para generar el archivo con formato PKCS12 que el ejemplo espera, escriba el siguiente comando:
Cuando aparezca el mensaje Escriba la frase de contraseña para device-key.pem:, use la misma frase de contraseña que utilizó anteriormente:
1234
.Cuando aparezca el mensaje Escriba la contraseña de exportación: use la contraseña
1234
.Cuando aparezca el mensaje Comprobando. Escriba la contraseña de exportación:, use la contraseña
1234
de nuevo.Ahora se debe generar un archivo de certificado con formato PKCS12 (certificate.pfx) en el directorio donde ejecutó el comando
openssl
.Copie el archivo de certificado con formato PKCS12 en el directorio del proyecto para el ejemplo de aprovisionamiento de dispositivos X.509. La ruta de acceso especificada es relativa a la ubicación donde descargó el repositorio de ejemplo.
cp certificate.pfx ./azure-iot-sdk-csharp/provisioning/device/samples/"Getting Started"/X509Sample
No necesita el indicador Git Bash para el resto de este inicio rápido. Sin embargo, es posible que desee mantenerlo abierto para comprobar el certificado si tiene problemas en pasos posteriores.
El código de ejemplo requiere una clave privada que no está cifrada. Ejecute el siguiente comando para crear una clave privada sin cifrar:
Cuando aparezca el mensaje Escriba la frase de contraseña para device-key.pem:, use la misma frase de contraseña que utilizó anteriormente:
1234
.Copie el certificado del dispositivo y la clave privada no cifrada en el directorio del proyecto para el ejemplo de aprovisionamiento de dispositivos X.509. La ruta de acceso especificada es relativa a la ubicación donde descargó el SDK.
cp device-cert.pem ./azure-iot-sdk-node/provisioning/device/samples cp unencrypted-device-key.pem ./azure-iot-sdk-node/provisioning/device/samples
No necesita el indicador Git Bash para el resto de este inicio rápido. Sin embargo, es posible que desee mantenerlo abierto para comprobar el certificado si tiene problemas en pasos posteriores.
Copie el certificado de dispositivo y la clave privada en el directorio del proyecto para el ejemplo de aprovisionamiento de dispositivos X.509. La ruta de acceso especificada es relativa a la ubicación donde descargó el SDK.
cp device-cert.pem ./azure-iot-sdk-python/samples/async-hub-scenarios cp device-key.pem ./azure-iot-sdk-python/samples/async-hub-scenarios
No necesita el indicador Git Bash para el resto de este inicio rápido. Sin embargo, es posible que desee mantenerlo abierto para comprobar el certificado si tiene problemas en pasos posteriores.
El código de ejemplo de Java requiere una clave privada que no está cifrada. Ejecute el siguiente comando para crear una clave privada sin cifrar:
Cuando aparezca el mensaje Escriba la frase de contraseña para device-key.pem:, use la misma frase de contraseña que utilizó anteriormente:
1234
.
Mantenga abierto el símbolo del sistema de Git Bash. Lo necesitará más adelante en esta guía rápida.
Creación de una inscripción de dispositivos
Azure IoT Hub Device Provisioning Service admite dos tipos de inscripciones:
- Grupos de inscripción: usados para inscribir varios dispositivos relacionados.
- Inscripciones individuales: usadas para inscribir un solo dispositivo.
En este artículo se muestra una inscripción de un dispositivo que se va a aprovisionar con un centro de IoT.
Inicie sesión en Azure Portal y vaya a la instancia de Device Provisioning Service.
Seleccione Administrar inscripciones de la sección Configuración del menú de navegación.
Seleccione la pestaña Inscripciones individuales y, después, Agregar inscripción individual.
En Registro y aprovisionamiento de la página Agregar inscripción, proporcione la siguiente información para configurar los detalles de inscripción:
Campo Descripción Atestación Seleccione Certificados de cliente X.509 como Mecanismo de atestación. Configuración del certificado X.509 Cargue uno o dos certificados que se usarán para comprobar el dispositivo para esta inscripción. Estado de aprovisionamiento Active la casilla Habilitar esta inscripción si desea que esta inscripción esté disponible para aprovisionar su dispositivo. Desactive esta casilla si desea que la inscripción esté deshabilitada. Podrá cambiar esta configuración más adelante. Directiva de reaprovisionamiento Elija una directiva de reaprovisionamiento que refleje cómo desea que DPS controle los dispositivos que soliciten el reaprovisionamiento. Para obtener más información, consulte Directivas de reaprovisionamiento. Seleccione Siguiente: centros de IoT.
En la pestaña Centros de IoT de la página Agregar inscripción, proporcione la siguiente información para determinar qué centros de IoT pueden aprovisionar dispositivos de inscripción para:
Campo Descripción Centros de IoT de destino Seleccione uno o varios de los centros de IoT vinculados o agregue un nuevo vínculo a un centro de IoT. Para más información sobre cómo vincular centros de IoT a la instancia de DPS, consulte Vinculación y administración de centros de IoT. Directiva de asignación Si seleccionó más de un centro de IoT vinculado, seleccione cómo quiere asignar dispositivos a los distintos centros. Para más información sobre las directivas de asignación, consulte Uso de directivas de asignación.
Si seleccionó solo un centro de IoT vinculado, se recomienda usar la directiva Distribución uniformemente ponderada.Seleccione Siguiente: configuración del dispositivo
En la pestaña Configuración del dispositivo de la página Agregar inscripción, proporcione la siguiente información para definir cómo se configurarán los dispositivos recién aprovisionados:
Campo Descripción Id. de dispositivo Proporcione un id. de dispositivo que se asignará al dispositivo aprovisionado en IoT Hub. Si no proporciona un id. de dispositivo, se usará el id. de registro. IoT Edge Compruebe la opción Habilitar IoT Edge en los dispositivos aprovisionados si el dispositivo aprovisionado ejecutará Azure IoT Edge. Desactive esta casilla si esta inscripción es para un dispositivo no habilitado para IoT Edge. Etiquetas de dispositivo Use este cuadro de texto para proporcionar las etiquetas que quiera aplicar al dispositivo gemelo del dispositivo aprovisionado. Propiedades deseadas Use este cuadro de texto para proporcionar las propiedades deseadas que quiera aplicar al dispositivo gemelo del dispositivo aprovisionado. Para más información, consulte Información y uso de dispositivos gemelos en IoT Hub.
Seleccione Siguiente: Review + create (Revisar y crear).
En la pestaña Revisar y crear, compruebe todos los valores y seleccione Crear.
Preparación y ejecución del código de aprovisionamiento de dispositivos
En esta sección, usted actualiza el código de ejemplo para enviar la secuencia de arranque del dispositivo a la instancia del servicio de aprovisionamiento de dispositivos. Esta secuencia de arranque hace que el dispositivo se reconozca y se asigne a un centro de IoT vinculado a la instancia de DPS.
En esta sección, usted usa el símbolo del sistema de Git Bash y el IDE de Visual Studio.
Configuración del código del dispositivo de aprovisionamiento
En esta sección, actualizará el código de ejemplo con la información de la instancia de Device Provisioning Service.
En Azure Portal, seleccione la pestaña Información general de Device Provisioning Service.
Copie el valor de del Ámbito de id.
Inicie Visual Studio y abra el nuevo archivo de solución que se creó en el directorio
cmake
que creó en el directorio raíz del repositorio de Git azure-iot-sdk-c. El archivo de solución se llamaazure_iot_sdks.sln
.En el Explorador de soluciones de Visual Studio, vaya a Provisioning_Samples > prov_dev_client_sample > Archivos de código fuente y abra prov_dev_client_sample.c.
Busque la constante
id_scope
y reemplace el valor por el valor de Ámbito de id. que copió en el paso 2.static const char* id_scope = "0ne00000A0A";
Busque la definición de la función
main()
en el mismo archivo. Asegúrese de que la variablehsm_type
está establecida enSECURE_DEVICE_TYPE_X509
.SECURE_DEVICE_TYPE hsm_type; //hsm_type = SECURE_DEVICE_TYPE_TPM; hsm_type = SECURE_DEVICE_TYPE_X509; //hsm_type = SECURE_DEVICE_TYPE_SYMMETRIC_KEY;
Guarde los cambios.
Haga clic con el botón derecho en el proyecto prov_dev_client_sample y seleccione Establecer como proyecto de inicio.
Configuración del código auxiliar del HSM personalizado
Los detalles de la interacción con el almacenamiento seguro real basado en hardware varían en función del hardware. Como resultado, el certificado y la clave privada usados por el dispositivo simulado en este inicio rápido están codificados en el código stub personalizado del Módulo de Seguridad de Hardware (HSM).
Para actualizar el código auxiliar del HSM personalizado con el fin de simular la identidad del dispositivo con el identificador my-x509-device
:
En el Explorador de soluciones de Visual Studio, vaya a Provisioning_Samples > custom_hsm_example > Archivos de código fuente y abra custom_hsm_example.c.
Actualice el valor de cadena de la constante de cadena
COMMON_NAME
con el nombre común que utilizó al generar el certificado de dispositivo:my-x509-device
.static const char* const COMMON_NAME = "my-x509-device";
Actualice el valor de cadena de la cadena constante
CERTIFICATE
mediante el certificado de dispositivo, device-cert.pem, que generó anteriormente.La sintaxis del texto del certificado del ejemplo debe seguir el siguiente patrón, sin espacios adicionales ni análisis realizados por Visual Studio.
static const char* const CERTIFICATE = "-----BEGIN CERTIFICATE-----\n" "MIIFOjCCAyKgAwIBAgIJAPzMa6s7mj7+MA0GCSqGSIb3DQEBCwUAMCoxKDAmBgNV\n" ... "MDMwWhcNMjAxMTIyMjEzMDMwWjAqMSgwJgYDVQQDDB9BenVyZSBJb1QgSHViIENB\n" "-----END CERTIFICATE-----";
La actualización manual de este valor de cadena puede ser propensa a errores. Para generar la sintaxis correcta, puede copiar y pegar el siguiente comando en el símbolo del sistema de Git Bash y presione ENTRAR. Este comando genera la sintaxis para el valor de constante de la cadena
CERTIFICATE
y la escribe en la salida.sed -e 's/^/"/;$ !s/$/""\\n"/;$ s/$/"/' device-cert.pem
Copie y pegue el texto del certificado de salida para el valor de constante.
Actualice el valor de cadena de la constante
PRIVATE_KEY
con la clave privada sin cifrar para el certificado de dispositivo: uncrypted-device-key.pem.La sintaxis del texto de la clave privada debe seguir el siguiente patrón, sin espacios adicionales ni análisis realizados por Visual Studio.
static const char* const PRIVATE_KEY = "-----BEGIN RSA PRIVATE KEY-----\n" "MIIJJwIBAAKCAgEAtjvKQjIhp0EE1PoADL1rfF/W6v4vlAzOSifKSQsaPeebqg8U\n" ... "X7fi9OZ26QpnkS5QjjPTYI/wwn0J9YAwNfKSlNeXTJDfJ+KpjXBcvaLxeBQbQhij\n" "-----END RSA PRIVATE KEY-----";
La actualización manual de este valor de cadena puede ser propensa a errores. Para generar la sintaxis correcta, puede copiar y pegar el siguiente comando en el símbolo del sistema de Git Bash y presione ENTRAR. Este comando genera la sintaxis para el valor de constante de la cadena
PRIVATE_KEY
y la escribe en la salida.sed -e 's/^/"/;$ !s/$/""\\n"/;$ s/$/"/' unencrypted-device-key.pem
Copie y pegue el texto de la clave privada de salida para el nuevo valor de la constante.
Guarde los cambios.
Haga clic con el botón derecho en el proyecto custom_hsm_-_example y seleccione Compilar.
Importante
Debe compilar el proyecto custom_hsm_example antes de compilar el resto de la solución en la sección siguiente.
Ejecución del ejemplo
En el menú de Visual Studio, seleccione Depurar>Iniciar sin depurar para ejecutar la solución. Si se le pida que recompile el proyecto, seleccione Sí para recompilar el proyecto antes de su ejecución.
La salida siguiente es un ejemplo de arranque correcto del dispositivo simulado
my-x509-device
y su conexión al servicio de aprovisionamiento. El dispositivo se ha asignado a un centro de IoT y se ha registrado:Provisioning API Version: 1.8.0 Registering Device Provisioning Status: PROV_DEVICE_REG_STATUS_CONNECTED Provisioning Status: PROV_DEVICE_REG_STATUS_ASSIGNING Registration Information received from service: contoso-iot-hub-2.azure-devices.net, deviceId: my-x509-device Press enter key to exit:
En esta sección, se usa el símbolo del sistema de Windows.
En Azure Portal, seleccione la pestaña Información general de Device Provisioning Service.
Copie el valor de del Ámbito de id.
En el símbolo del sistema de Windows, cambie al directorio X509Sample. Este directorio se encuentra en el directorio .\azure-iot-sdk-csharp\provisioning\device\samples\getting started\X509Sample fuera del directorio donde ha clonado los ejemplos en el equipo.
Escriba el siguiente comando para compilar y ejecutar el ejemplo de aprovisionamiento de dispositivos X.509 (reemplace el valor
<IDScope>
por el ámbito de id. que copió en la sección anterior). El archivo de certificado es de manera predeterminada ./certificate.pfx y solicita la contraseña .pfx.dotnet run -- -s <IDScope>
Si desea pasar el certificado y la contraseña como un parámetro, puede usar el siguiente formato.
Nota
Se pueden usar más parámetros mientras se ejecuta la aplicación para cambiar TransportType (-t) y GlobalDeviceEndpoint (-g).
dotnet run -- -s 0ne00000A0A -c certificate.pfx -p 1234
El dispositivo se conecta a DPS y se asigna a un centro de IoT. A continuación, el dispositivo envía un mensaje de telemetría al centro de IoT.
Loading the certificate... Enter the PFX password for certificate.pfx: **** Found certificate: A33DB11B8883DEE5B1690ACFEAAB69E8E928080B CN=my-x509-device; PrivateKey: True Using certificate A33DB11B8883DEE5B1690ACFEAAB69E8E928080B CN=my-x509-device Initializing the device provisioning client... Initialized for registration Id my-x509-device. Registering with the device provisioning service... Registration status: Assigned. Device my-x509-device registered to MyExampleHub.azure-devices.net. Creating X509 authentication for IoT Hub... Testing the provisioned device with IoT Hub... Sending a telemetry message... Finished.
En esta sección, se usa el símbolo del sistema de Windows.
En Azure Portal, seleccione la pestaña Información general de Device Provisioning Service.
Copie el valor de del Ámbito de id.
En el símbolo del sistema de Windows, vaya al directorio de ejemplo e instale los paquetes necesarios para el ejemplo. La ruta de acceso que se muestra es relativa a la ubicación en la que ha clonado el SDK.
cd .\azure-iot-sdk-node\provisioning\device\samples npm install
En el ejemplo se usan cinco variables de entorno para autenticar y aprovisionar un dispositivo IoT mediante DPS. Estas variables de entorno son:
Nombre de la variable Descripción PROVISIONING_HOST
Punto de conexión que se va a usar para conectarse a la instancia de DPS. Para esta guía de inicio rápido, use el punto de conexión global, global.azure-devices-provisioning.net
.PROVISIONING_IDSCOPE
Ámbito de identificador de la instancia de DPS. PROVISIONING_REGISTRATION_ID
El identificador de registro del dispositivo. Debe coincidir con el nombre común del firmante en el certificado de dispositivo. CERTIFICATE_FILE
Ruta de acceso al archivo de certificado del dispositivo. KEY_FILE
Ruta de acceso al archivo de clave privada del dispositivo. Agregue las variables de entorno para el punto de conexión del dispositivo global y el ámbito de id. Reemplace
<id-scope>
por el valor que copió en el paso 2.set PROVISIONING_HOST=global.azure-devices-provisioning.net set PROVISIONING_IDSCOPE=<id-scope>
Establezca la variable de entorno del identificador de registro del dispositivo. El identificador de registro del dispositivo IoT debe coincidir con el nombre común del firmante que aparece en su certificado de dispositivo. Si ha seguido los pasos en esta guía de inicio rápido para generar un certificado de prueba autofirmado,
my-x509-device
es el nombre del firmante y el id. de registro del dispositivo.set PROVISIONING_REGISTRATION_ID=my-x509-device
Establezca las variables de entorno para los archivos de clave privada de dispositivo (sin cifrar) y el certificado del dispositivo.
set CERTIFICATE_FILE=.\device-cert.pem set KEY_FILE=.\unencrypted-device-key.pem
Ejecute el ejemplo y compruebe que el dispositivo se haya aprovisionado correctamente.
node register_x509.js
Debería ver una salida similar al ejemplo siguiente:
registration succeeded assigned hub=contoso-hub-2.azure-devices.net deviceId=my-x509-device Client connected send status: MessageEnqueued
En esta sección, se usa el símbolo del sistema de Windows.
En Azure Portal, seleccione la pestaña Información general de Device Provisioning Service.
Copie los valores del Ámbito de id. y el Punto de conexión global del dispositivo.
En el símbolo del sistema de Windows, vaya al directorio del ejemplo provision_x509.py. La ruta de acceso que se muestra es relativa a la ubicación en la que ha clonado el SDK.
cd ./azure-iot-sdk-python/samples/async-hub-scenarios
En este ejemplo se usan seis variables de entorno para autenticar y aprovisionar un dispositivo IoT mediante DPS. Estas variables de entorno son:
Nombre de la variable Descripción PROVISIONING_HOST
El punto de conexión global que se usa para conectarse a la instancia de DPS. PROVISIONING_IDSCOPE
Ámbito de identificador de la instancia de DPS. DPS_X509_REGISTRATION_ID
El identificador de registro del dispositivo. También debe coincidir con el nombre del firmante en el certificado del dispositivo. X509_CERT_FILE
Ruta de acceso al archivo de certificado del dispositivo. X509_KEY_FILE
Ruta de acceso al archivo de clave privada del certificado de dispositivo. PASS_PHRASE
La frase de contraseña usada para cifrar el certificado y el archivo de clave privada ( 1234
).Agregue las variables de entorno para el punto de conexión del dispositivo global y el ámbito de id.
set PROVISIONING_HOST=global.azure-devices-provisioning.net set PROVISIONING_IDSCOPE=<ID scope for your DPS resource>
Establezca la variable de entorno del identificador de registro. El identificador de registro del dispositivo IoT debe coincidir con el nombre del firmante que aparece en su certificado de dispositivo. Si ha seguido los pasos en esta guía de inicio rápido para generar un certificado de prueba autofirmado,
my-x509-device
es el nombre del firmante y el id. de registro del dispositivo.set DPS_X509_REGISTRATION_ID=my-x509-device
Establezca las variables de entorno del archivo de certificado, el archivo de clave privada y la frase de contraseña.
set X509_CERT_FILE=./device-cert.pem set X509_KEY_FILE=./device-key.pem set PASS_PHRASE=1234
Revise el código del archivo provision_x509.py. Si no usa la versión 3.7 de Python o una posterior, realice el cambio en el código mencionado aquí para reemplazar
asyncio.run(main())
y guarde los cambios.Ejecute el ejemplo. El ejemplo se conecta a DPS, que aprovisiona el dispositivo a un centro de IoT. Una vez aprovisionado el dispositivo, el ejemplo envía algunos mensajes de prueba al centro de IoT.
$ python azure-iot-sdk-python/samples/async-hub-scenarios/provision_x509.py RegistrationStage(RequestAndResponseOperation): Op will transition into polling after interval 2. Setting timer. The complete registration result is my-x509-device TestHub12345.azure-devices.net initialAssignment null Will send telemetry from the provisioned device sending message #4 sending message #7 sending message #2 sending message #8 sending message #5 sending message #9 sending message #1 sending message #6 sending message #10 sending message #3 done sending message #4 done sending message #7 done sending message #2 done sending message #8 done sending message #5 done sending message #9 done sending message #1 done sending message #6 done sending message #10 done sending message #3
En esta sección, usted usa tanto el símbolo del sistema de Windows como el símbolo del sistema de Git Bash.
En Azure Portal, seleccione la pestaña Información general de Device Provisioning Service.
Copie los valores del Ámbito de id. y el Punto de conexión global del dispositivo.
En el símbolo del sistema de Windows, vaya a la carpeta del proyecto de ejemplo. La ruta de acceso que se muestra es relativa a la ubicación en la que ha clonado el SDK.
cd .\azure-iot-sdk-java\provisioning\provisioning-device-client-samples\provisioning-X509-sample
Escriba la información del servicio de aprovisionamiento y de la identidad X.509 en el código de ejemplo. esta información se utiliza durante el aprovisionamiento para la atestación del dispositivo simulado, antes del registro de dispositivo.
Abra el archivo
.\src\main\java\samples\com\microsoft\azure\sdk\iot\ProvisioningX509Sample.java
en el editor que prefiera.Actualice los valores siguientes con el ámbito de id. y el punto de conexión global del servicio de aprovisionamiento que copió anteriormente.
private static final String idScope = "[Your ID scope here]"; private static final String globalEndpoint = "[Your Provisioning Service Global Endpoint here]"; private static final ProvisioningDeviceClientTransportProtocol PROVISIONING_DEVICE_CLIENT_TRANSPORT_PROTOCOL = ProvisioningDeviceClientTransportProtocol.HTTPS;
Actualice el valor de la cadena de constante
leafPublicPem
con el valor del certificado, device-cert.pem.La sintaxis del texto del certificado debe seguir el siguiente patrón, sin espacios adicionales ni caracteres.
private static final String leafPublicPem = "-----BEGIN CERTIFICATE-----\n" + "MIIFOjCCAyKgAwIBAgIJAPzMa6s7mj7+MA0GCSqGSIb3DQEBCwUAMCoxKDAmBgNV\n" + ... "MDMwWhcNMjAxMTIyMjEzMDMwWjAqMSgwJgYDVQQDDB9BenVyZSBJb1QgSHViIENB\n" + "-----END CERTIFICATE-----";
La actualización manual de este valor de cadena puede ser propensa a errores. Para generar la sintaxis correcta, puede copiar y pegar el siguiente comando en el símbolo del sistema de Git Bash y presione ENTRAR. Este comando genera la sintaxis para el valor de constante de la cadena
leafPublicPem
y la escribe en la salida.sed 's/^/"/;$ !s/$/\\n" +/;$ s/$/"/' device-cert.pem
Copie y pegue el texto del certificado de salida para el valor de constante.
Actualice el valor de cadena de la constante
leafPrivateKey
con la clave privada sin cifrar para el certificado de dispositivo: uncrypted-device-key.pem.La sintaxis del texto de la clave privada debe seguir el siguiente patrón, sin espacios adicionales ni caracteres.
private static final String leafPrivateKey = "-----BEGIN PRIVATE KEY-----\n" + "MIIJJwIBAAKCAgEAtjvKQjIhp0EE1PoADL1rfF/W6v4vlAzOSifKSQsaPeebqg8U\n" + ... "X7fi9OZ26QpnkS5QjjPTYI/wwn0J9YAwNfKSlNeXTJDfJ+KpjXBcvaLxeBQbQhij\n" + "-----END PRIVATE KEY-----";
La actualización manual de este valor de cadena puede ser propensa a errores. Para generar la sintaxis correcta, puede copiar y pegar el siguiente comando en el símbolo del sistema de Git Bash y presione ENTRAR. Este comando genera la sintaxis para el valor de constante de la cadena
leafPrivateKey
y la escribe en la salida.sed 's/^/"/;$ !s/$/\\n" +/;$ s/$/"/' unencrypted-device-key.pem
Copie y pegue el texto de la clave privada de salida para el nuevo valor de la constante.
Guarde los cambios.
Compile el ejemplo y luego vaya a la carpeta
target
.mvn clean install cd target
La compilación genera el archivo .jar en la carpeta
target
con el siguiente formato de archivo:provisioning-x509-sample-{version}-with-deps.jar
; por ejemplo:provisioning-x509-sample-1.8.1-with-deps.jar
. Ejecute el archivo .jar. Es posible que tenga que reemplazar la versión en el comando siguiente.java -jar ./provisioning-x509-sample-1.8.1-with-deps.jar
El ejemplo se conecta a DPS, que aprovisiona el dispositivo a un centro de IoT. Una vez aprovisionado el dispositivo, el ejemplo envía algunos mensajes de prueba al centro de IoT.
Starting... Beginning setup. WARNING: sun.reflect.Reflection.getCallerClass is not supported. This will impact performance. 2022-05-11 09:42:05,025 DEBUG (main) [com.microsoft.azure.sdk.iot.provisioning.device.ProvisioningDeviceClient] - Initialized a ProvisioningDeviceClient instance using SDK version 2.0.0 2022-05-11 09:42:05,027 DEBUG (main) [com.microsoft.azure.sdk.iot.provisioning.device.ProvisioningDeviceClient] - Starting provisioning thread... Waiting for Provisioning Service to register 2022-05-11 09:42:05,030 INFO (global.azure-devices-provisioning.net-6255a8ba-CxnPendingConnectionId-azure-iot-sdk-ProvisioningTask) [com.microsoft.azure.sdk.iot.provisioning.device.internal.task.ProvisioningTask] - Opening the connection to device provisioning service... 2022-05-11 09:42:05,252 INFO (global.azure-devices-provisioning.net-6255a8ba-Cxn6255a8ba-azure-iot-sdk-ProvisioningTask) [com.microsoft.azure.sdk.iot.provisioning.device.internal.task.ProvisioningTask] - Connection to device provisioning service opened successfully, sending initial device registration message 2022-05-11 09:42:05,286 INFO (global.azure-devices-provisioning.net-6255a8ba-Cxn6255a8ba-azure-iot-sdk-RegisterTask) [com.microsoft.azure.sdk.iot.provisioning.device.internal.task.RegisterTask] - Authenticating with device provisioning service using x509 certificates 2022-05-11 09:42:06,083 INFO (global.azure-devices-provisioning.net-6255a8ba-Cxn6255a8ba-azure-iot-sdk-ProvisioningTask) [com.microsoft.azure.sdk.iot.provisioning.device.internal.task.ProvisioningTask] - Waiting for device provisioning service to provision this device... 2022-05-11 09:42:06,083 INFO (global.azure-devices-provisioning.net-6255a8ba-Cxn6255a8ba-azure-iot-sdk-ProvisioningTask) [com.microsoft.azure.sdk.iot.provisioning.device.internal.task.ProvisioningTask] - Current provisioning status: ASSIGNING Waiting for Provisioning Service to register 2022-05-11 09:42:15,685 INFO (global.azure-devices-provisioning.net-6255a8ba-Cxn6255a8ba-azure-iot-sdk-ProvisioningTask) [com.microsoft.azure.sdk.iot.provisioning.device.internal.task.ProvisioningTask] - Device provisioning service assigned the device successfully IotHUb Uri : MyExampleHub.azure-devices.net Device ID : java-device-01 2022-05-11 09:42:25,057 INFO (main) [com.microsoft.azure.sdk.iot.device.transport.ExponentialBackoffWithJitter] - NOTE: A new instance of ExponentialBackoffWithJitter has been created with the following properties. Retry Count: 2147483647, Min Backoff Interval: 100, Max Backoff Interval: 10000, Max Time Between Retries: 100, Fast Retry Enabled: true 2022-05-11 09:42:25,080 INFO (main) [com.microsoft.azure.sdk.iot.device.transport.ExponentialBackoffWithJitter] - NOTE: A new instance of ExponentialBackoffWithJitter has been created with the following properties. Retry Count: 2147483647, Min Backoff Interval: 100, Max Backoff Interval: 10000, Max Time Between Retries: 100, Fast Retry Enabled: true 2022-05-11 09:42:25,087 DEBUG (main) [com.microsoft.azure.sdk.iot.device.DeviceClient] - Initialized a DeviceClient instance using SDK version 2.0.3 2022-05-11 09:42:25,129 DEBUG (main) [com.microsoft.azure.sdk.iot.device.transport.mqtt.MqttIotHubConnection] - Opening MQTT connection... 2022-05-11 09:42:25,150 DEBUG (main) [com.microsoft.azure.sdk.iot.device.transport.mqtt.Mqtt] - Sending MQTT CONNECT packet... 2022-05-11 09:42:25,982 DEBUG (main) [com.microsoft.azure.sdk.iot.device.transport.mqtt.Mqtt] - Sent MQTT CONNECT packet was acknowledged 2022-05-11 09:42:25,983 DEBUG (main) [com.microsoft.azure.sdk.iot.device.transport.mqtt.Mqtt] - Sending MQTT SUBSCRIBE packet for topic devices/java-device-01/messages/devicebound/# 2022-05-11 09:42:26,068 DEBUG (main) [com.microsoft.azure.sdk.iot.device.transport.mqtt.Mqtt] - Sent MQTT SUBSCRIBE packet for topic devices/java-device-01/messages/devicebound/# was acknowledged 2022-05-11 09:42:26,068 DEBUG (main) [com.microsoft.azure.sdk.iot.device.transport.mqtt.MqttIotHubConnection] - MQTT connection opened successfully 2022-05-11 09:42:26,070 DEBUG (main) [com.microsoft.azure.sdk.iot.device.transport.IotHubTransport] - The connection to the IoT Hub has been established 2022-05-11 09:42:26,071 DEBUG (main) [com.microsoft.azure.sdk.iot.device.transport.IotHubTransport] - Updating transport status to new status CONNECTED with reason CONNECTION_OK 2022-05-11 09:42:26,071 DEBUG (main) [com.microsoft.azure.sdk.iot.device.DeviceIO] - Starting worker threads 2022-05-11 09:42:26,073 DEBUG (main) [com.microsoft.azure.sdk.iot.device.transport.IotHubTransport] - Invoking connection status callbacks with new status details 2022-05-11 09:42:26,074 DEBUG (main) [com.microsoft.azure.sdk.iot.device.transport.IotHubTransport] - Client connection opened successfully 2022-05-11 09:42:26,075 INFO (main) [com.microsoft.azure.sdk.iot.device.DeviceClient] - Device client opened successfully Sending message from device to IoT Hub... 2022-05-11 09:42:26,077 DEBUG (main) [com.microsoft.azure.sdk.iot.device.transport.IotHubTransport] - Message was queued to be sent later ( Message details: Correlation Id [aaaa0000-bb11-2222-33cc-444444dddddd] Message Id [aaaa0000-bb11-2222-33cc-444444dddddd] ) Press any key to exit... 2022-05-11 09:42:26,079 DEBUG (MyExampleHub.azure-devices.net-java-device-01-ee6c362d-Cxn7a1fb819-e46d-4658-9b03-ca50c88c0440-azure-iot-sdk-IotHubSendTask) [com.microsoft.azure.sdk.iot.device.transport.IotHubTransport] - Sending message ( Message details: Correlation Id [aaaa0000-bb11-2222-33cc-444444dddddd] Message Id [aaaa0000-bb11-2222-33cc-444444dddddd] ) 2022-05-11 09:42:26,422 DEBUG (MQTT Call: java-device-01) [com.microsoft.azure.sdk.iot.device.transport.IotHubTransport] - IotHub message was acknowledged. Checking if there is record of sending this message ( Message details: Correlation Id [aaaa0000-bb11-2222-33cc-444444dddddd] Message Id [aaaa0000-bb11-2222-33cc-444444dddddd] ) 2022-05-11 09:42:26,425 DEBUG (MyExampleHub.azure-devices.net-java-device-01-ee6c362d-Cxn7a1fb819-e46d-4658-9b03-ca50c88c0440-azure-iot-sdk-IotHubSendTask) [com.microsoft.azure.sdk.iot.device.transport.IotHubTransport] - Invoking the callback function for sent message, IoT Hub responded to message ( Message details: Correlation Id [aaaa0000-bb11-2222-33cc-444444dddddd] Message Id [aaaa0000-bb11-2222-33cc-444444dddddd] ) with status OK Message sent!
Confirmación del registro de aprovisionamiento de dispositivos
Para ver en qué centro de IoT se aprovisionó el dispositivo, examine los detalles de registro de la inscripción individual que creó anteriormente:
En Azure Portal, vaya al servicio de aprovisionamiento de dispositivos.
En el menú de Configuración, seleccione Administrar inscripciones.
Seleccione Inscripciones individuales. La entrada de inscripción X.509 que creó anteriormente, my-x509-device, debería aparecer en la lista.
Seleccione la entrada de inscripción. El centro de IoT al que se asignó el dispositivo y cuyo id. de dispositivo aparecen en Estado de registro.
Para comprobar el dispositivo en el centro de IoT:
En Azure Portal, vaya al centro de IoT al que se asignó el dispositivo.
En el menú Administración de dispositivos, seleccione Dispositivos.
Si el dispositivo se aprovisionó correctamente, su id. de dispositivo (my-x509-device) debe aparecer en la lista y el valor Estado establecido como habilitado. Si no ve el dispositivo, seleccione Actualizar.
Importante
Si ha cambiado el valor predeterminado de Estado inicial del dispositivo gemelo en la entrada de inscripción para el dispositivo, el dispositivo puede extraer el estado gemelo deseado desde el centro y actuar en consecuencia. Para más información, consulte Información y uso de dispositivos gemelos en IoT Hub
Limpieza de recursos
Si planea seguir trabajando con el ejemplo de cliente de dispositivo y explorándolo, no quite los recursos que se hayan creado en esta guía de inicio rápido. Si no va a continuar, use el siguiente comando para eliminar todos los recursos que se hayan creado en la guía de inicio rápido.
Eliminación de la inscripción de dispositivos
Cierre la ventana de salida de ejemplo del cliente del dispositivo en su máquina.
En Azure Portal, seleccione Todos los recursos en el menú de la izquierda.
Seleccione la instancia de Device Provisioning Service.
En el menú de Configuración, seleccione Administrar inscripciones.
Seleccione la pestaña Inscripciones individuales.
Active la casilla situada junto al campo Id. de registro del dispositivo que registró en este inicio rápido.
En la parte superior de la página, seleccione Eliminar.
Elimine el registro del dispositivo de IoT Hub
En Azure Portal, seleccione Todos los recursos en el menú de la izquierda.
Seleccione IoT Hub.
En el menú Exploradores, seleccione Dispositivos de IoT.
Active la casilla situada junto al campo Id. de dispositivo del dispositivo que registró en este inicio rápido.
En la parte superior de la página, seleccione Eliminar.
Pasos siguientes
En este inicio rápido, ha aprovisionado un único dispositivo en el centro de IoT mediante una inscripción individual. Luego, obtenga información sobre cómo aprovisionar múltiples dispositivos en varios centros.