Creación y aprovisionamiento de dispositivos IoT Edge a escala en Linux mediante certificados X.509

Se aplica a:icono Sí IoT Edge 1.1 Otras versiones:IoT Edge 1.3, IoT Edge 1.4

Se aplica a:marca de verificación de IoT Edge 1.3 IoT Edge 1.3 marca de verificación de IoT Edge 1.4 IoT Edge 1.4 Otras versiones:IoT Edge 1.1

En este artículo se proporcionan instrucciones completas para el aprovisionamiento automático de uno o varios dispositivos Linux IoT Edge con certificados X.509. Puede aprovisionar automáticamente los dispositivos Azure IoT Edge con Azure IoT Hub Device Provisioning Service (DPS). Si no está familiarizado con el proceso de aprovisionamiento automático, revise la información general sobre el aprovisionamiento antes de continuar.

Las tareas son las siguientes:

  1. Generar certificados y claves.
  2. Crear una inscripción individual para un dispositivo o una inscripción de grupo para un conjunto de dispositivos.
  3. Instalar el entorno de ejecución de IoT Edge y registrar el dispositivo con IoT Hub.

El uso de certificados X.509 como un mecanismo de atestación es una manera excelente para escalar la producción y simplificar el aprovisionamiento de dispositivos. Normalmente, los certificados X.509 están organizados en una cadena de certificados de confianza. Comenzando por un certificado raíz de confianza o autofirmado, cada certificado de la cadena firma al certificado inmediatamente inferior. Este patrón crea una cadena delegada de confianza desde el certificado raíz a través de todos los certificados intermedios hasta el certificado "hoja" final que está instalado en un dispositivo.

Sugerencia

Si el dispositivo tiene un módulo de seguridad de hardware (HSM), como un TPM 2.0, se recomienda almacenar las claves X.509 de forma segura en el HSM. Obtenga más información sobre cómo implementar el aprovisionamiento sin interacción a gran escala descrito en este proyecto con el ejemplo iotedge-tpm2cloud.

Requisitos previos

Recursos en la nube

Requisitos de los dispositivos

Un dispositivo Linux físico o virtual para que sea el dispositivo IoT Edge.

Generación de los certificados de identidad del dispositivo

El certificado de identidad del dispositivo es un certificado de hoja que se conecta a través de una cadena de certificados de confianza con el certificado de la entidad de certificación X.509 (CA) superior. El nombre común (CN) del certificado de identidad del dispositivo debe estar establecido en el id. de dispositivo que quiere que tenga el dispositivo en el centro de IoT.

Los certificados de identidad del dispositivo solo se usan para aprovisionar al dispositivo IoT Edge y autenticarlo con Azure IoT Hub. No son certificados de firma, a diferencia de los certificados de CA que el dispositivo IoT Edge presenta a los módulos o los dispositivos hoja para la comprobación. Para obtener más información, consulte los detalles de uso de los certificados de Azure IoT Edge.

Después de crear el certificado de identidad del dispositivo, debe tener dos archivos: un archivo. cer o. pem que contiene la parte pública del certificado y un archivo. cer o. pem con la clave privada del certificado. Si planea usar una inscripción de grupo en DPS, también necesitará la parte pública de un certificado de CA raíz o intermedio en la misma cadena de certificados de confianza.

Necesita los siguientes archivos para configurar el aprovisionamiento automático con X.509:

  • El certificado de identidad del dispositivo y su certificado de clave privada. El certificado de identidad de dispositivo se carga en DPS si crea una inscripción individual. La clave privada se pasa al entorno de ejecución de Azure IoT Edge.
  • Una cadena de certificados completa, que debe contener al menos la identidad del dispositivo y los certificados intermedios. La cadena de certificados completa se pasa al entorno de ejecución de Azure IoT Edge.
  • Un certificado intermedio o raíz de entidad de certificación de la cadena de certificados de confianza. Este certificado se carga en DPS si crea una inscripción de grupo.

Nota

Actualmente, una limitación en libiothsm impide el uso de certificados que expiran el 1 de enero de 2038 o en una fecha posterior.

Uso de certificados de prueba (opcional)

Si no tiene una entidad de certificación disponible para crear nuevos certificados de identidad y quiere probar este escenario, el repositorio de Git de Azure IoT Edge contiene scripts que puede usar para generar certificados de prueba. Estos certificados están diseñados solo para pruebas de desarrollo y no deben usarse en producción.

Para crear certificados de prueba, siga los pasos descritos en Creación de certificados de demostración para probar las características de dispositivo IoT Edge. Complete las dos secciones necesarias para configurar los scripts de generación de certificados y crear un certificado de CA raíz. A continuación, siga los pasos para crear un certificado de identidad del dispositivo. Cuando haya terminado, debe tener la cadena de certificados y el par de claves siguientes:

  • <WRKDIR>/certs/iot-edge-device-identity-<name>-full-chain.cert.pem
  • <WRKDIR>/private/iot-edge-device-identity-<name>.key.pem

Necesita ambos certificados en el dispositivo IoT Edge. Si va a usar la inscripción individual en DPS, deberá cargar el archivo. cert.pem. Si va a usar la inscripción de grupos en DPS, también necesitará un certificado de CA raíz o intermedio en la misma cadena de certificados de confianza que se va a cargar. Si usa certificados de demostración, use el certificado <WRKDIR>/certs/azure-iot-test-only.root.ca.cert.pem para la inscripción de grupos.

Crear una inscripción de DPS

Use las claves y los certificados generados para crear una inscripción en DPS para uno o varios dispositivos IoT Edge.

Si desea aprovisionar un único dispositivo IoT Edge, cree una inscripción individual. Si necesita aprovisionar varios dispositivos, siga los pasos para crear una inscripción de grupo de DPS.

Al crear una inscripción en DPS, tiene la oportunidad de declarar un Estado inicial de dispositivo gemelo. En el dispositivo gemelo, puede establecer etiquetas para agrupar dispositivos por cualquier métrica que necesite en su solución, como la región, el entorno, la ubicación o el tipo de dispositivo. Estas etiquetas se usan para crear implementaciones automáticas.

Para más información sobre las inscripciones en Device Provisioning Service, vea Administración de inscripciones de dispositivos.

Creación de una inscripción individual de DPS

Las inscripciones individuales usan la parte pública del certificado de identidad de un dispositivo y la asocian con el certificado del dispositivo.

Sugerencia

Los pasos de este artículo son para Azure Portal, pero también puede crear inscripciones individuales mediante la CLI de Azure. Para más información, consulte az iot dps enrollment. Como parte del comando de la CLI, use la marca edge-enabled para especificar que la inscripción es para un dispositivo de IoT Edge.

  1. En Azure Portal, vaya a la instancia de IoT Hub Device Provisioning Service.

  2. En Configuración, seleccione Administrar inscripciones.

  3. Seleccione Add individual enrollment (Agregar inscripción individual) y, a continuación, complete los pasos siguientes para configurar la inscripción:

    • Mecanismo: Seleccione X.509.

    • Primary Certificate .pem or .cer file (Archivo .pem o .cer del certificado principal): cargue el archivo público desde el certificado de identidad del dispositivo. Si usó los scripts para generar un certificado de prueba, elija el siguiente archivo:

      <WRKDIR>\certs\iot-edge-device-identity-<name>.cert.pem

    • Id. de dispositivo IoT Hub: Si lo desea, proporcione un identificador para el dispositivo. Puede usar identificadores de dispositivo para dirigirse a un dispositivo individual para la implementación del módulo. Si no especifica un id. de dispositivo, se usa el nombre común (CN) en el certificado X. 509.

    • Dispositivo IoT Edge: Seleccione Verdadero para declarar que la inscripción es para un dispositivo IoT Edge.

    • Seleccione los centros de IoT a los que se puede asignar este dispositivo: elija la instancia de IoT Hub vinculada a la que quiere conectar el dispositivo. Puede elegir varios centros y el dispositivo se asignará a uno de ellos según la directiva de asignación seleccionada.

    • Estado inicial de dispositivo gemelo: agregue un valor de etiqueta para que se agregue al dispositivo gemelo, si lo desea. Puede usar etiquetas para los grupos de dispositivos de destino de la implementación automática. Por ejemplo:

      {
          "tags": {
             "environment": "test"
          },
          "properties": {
             "desired": {}
          }
      }
      
  4. Seleccione Guardar.

En Administrar inscripciones, puede ver el Id. de registro de la inscripción que acaba de crear. Anótelo, ya que puede usarlo para aprovisionar el dispositivo.

Ahora que existe una inscripción para este dispositivo, el entorno de ejecución de Azure IoT Edge puede aprovisionar automáticamente el dispositivo durante la instalación.

Instalación de IoT Edge

En esta sección, preparará la máquina virtual Linux o el dispositivo físico para IoT Edge. A continuación, instalará IoT Edge.

En primer lugar, ejecute los siguientes comandos para agregar el repositorio de paquetes y luego agregue la clave de firma del paquete de Microsoft a la lista de claves de confianza.

La instalación se puede realizar con unos pocos comandos. Abra un terminal y ejecute los comandos siguientes:

  • 20.04:

    wget https://packages.microsoft.com/config/ubuntu/20.04/packages-microsoft-prod.deb -O packages-microsoft-prod.deb
    sudo dpkg -i packages-microsoft-prod.deb
    rm packages-microsoft-prod.deb
    
  • 18.04:

    wget https://packages.microsoft.com/config/ubuntu/18.04/multiarch/packages-microsoft-prod.deb -O packages-microsoft-prod.deb
    sudo dpkg -i packages-microsoft-prod.deb
    rm packages-microsoft-prod.deb
    

Nota

Los paquetes de software de Azure IoT Edge están sujetos a los términos de licencia que se encuentran cada paquete (usr/share/doc/{package-name} o el directorio LICENSE). Lea los términos de licencia antes de usar el paquete. La instalación y el uso de un paquete constituyen la aceptación de estos términos. Si no acepta los términos de licencia, no utilice ese paquete.

Instalación de un motor del contenedor

Azure IoT Edge utiliza un runtime de contenedor compatible con OCI. En los escenarios de producción, se recomienda utilizar el motor de Moby. El motor de Moby es el único motor de contenedor compatible oficialmente con IoT Edge. Las imágenes de contenedor de Docker CE/EE son totalmente compatibles con el entorno de ejecución de Moby.

Instale el motor de Moby.

sudo apt-get update; \
  sudo apt-get install moby-engine

Una vez instalado correctamente el motor de Moby, configúrelo para usar el controlador de registro local como mecanismo de registro. Para más información sobre la configuración de registro, consulte Lista de comprobación de implementación de producción.

  • Cree o abra el archivo de configuración del demonio de Docker en /etc/docker/daemon.json.

  • Establezca el controlador de registro predeterminado en el controlador de registro local, tal como se muestra en el ejemplo siguiente.

       {
          "log-driver": "local"
       }
    
  • Reinicie el motor de contenedores para que se apliquen los cambios.

    sudo systemctl restart docker
    

    Sugerencia

    Si se producen errores al instalar el motor del contenedor Moby, compruebe la compatibilidad con Moby del kernel de Linux. Algunos fabricantes de dispositivos incrustados distribuyen imágenes de dispositivos que contienen kernels de Linux personalizados sin las características necesarias para la compatibilidad del motor del contenedor. Ejecute el siguiente comando, que usa el script check-config suministrado por Moby, para comprobar la configuración del kernel:

    curl -ssl https://raw.githubusercontent.com/moby/moby/master/contrib/check-config.sh -o check-config.sh
    chmod +x check-config.sh
    ./check-config.sh
    

    En la salida del script, compruebe que todos los elementos que figuran en Generally Necessary y Network Drivers estén habilitados. Si faltan características, puede habilitarlas si vuelve a generar el kernel a partir del origen y selecciona los módulos asociados para incluirlos en el archivo .config de kernel adecuado. Igualmente, si usa un generador de configuración de kernel como defconfig o menuconfig, busque y habilite las características correspondientes y vuelva a generar el kernel como corresponda. Una vez que implemente el kernel recién modificado, vuelva a ejecutar el script check-config para comprobar que se han habilitado correctamente todas las características necesarias.

Instalación del entorno de ejecución de IoT Edge

El demonio de seguridad de IoT Edge proporciona y mantiene los estándares de seguridad en el dispositivo IoT Edge. El demonio se inicia en cada arranque e inicia el resto del entorno de ejecución de IoT Edge para arrancar el dispositivo.

Los pasos de esta sección representan el proceso habitual para instalar la versión más reciente en un dispositivo que tenga conexión a Internet. Si tiene que instalar una versión específica, como una versión preliminar, o tiene que realizar la instalación mientras está sin conexión, siga los pasos de Instalación sin conexión o de una versión específica, más adelante en este artículo.

Instale IoT Edge versión 1.1.* junto con el paquete libiothsm-std:

sudo apt-get update; \
  sudo apt-get install iotedge

Nota

IoT Edge versión 1.1 es la rama de soporte técnico a largo plazo de IoT Edge. Si ejecuta una versión anterior, se recomienda instalar o actualizar a la revisión más reciente, ya que ya no se admiten las versiones anteriores.

El servicio IoT Edge proporciona y mantiene los estándares de seguridad en el dispositivo IoT Edge. El servicio se inicia en cada arranque e inicia el resto del entorno de ejecución de IoT Edge para arrancar el dispositivo.

A partir de la versión 1.2, el servicio de identidad de IoT controla el aprovisionamiento y la administración de identidades para IoT Edge y otros componentes de dispositivo que necesitan comunicarse con IoT Hub.

Los pasos de esta sección representan el proceso habitual para instalar la versión más reciente en un dispositivo que tenga conexión a Internet. Si tiene que instalar una versión específica, como una versión preliminar, o tiene que realizar la instalación mientras está sin conexión, siga los pasos de Instalación sin conexión o de una versión específica, más adelante en este artículo.

Nota

Los pasos de esta sección le muestran cómo instalar la versión más reciente de IoT Edge.

Si ya tiene un dispositivo IoT Edge que ejecuta una versión anterior y desea actualizar a la versión más reciente, siga los pasos descritos en Actualización del demonio de seguridad de IoT Edge y el entorno de ejecución. Las versiones más recientes son suficientemente diferentes de las versiones anteriores de IoT Edge para que sean necesarios pasos específicos para la actualización.

Instale la versión más reciente de IoT Edge y el paquete de servicio de identidad de IoT:

sudo apt-get update; \
  sudo apt-get install aziot-edge defender-iot-micro-agent-edge

El paquete defender-iot-micro-agent-edge incluye el microagente de seguridad de Microsoft Defender para IoT que proporciona visibilidad del punto de conexión en la administración de la posición de seguridad, vulnerabilidades, detección de amenazas, administración de flotas y mucho más para ayudarlo a proteger los dispositivos de IoT Edge. Se recomienda instalar el microagente con el agente de Edge para habilitar la supervisión de seguridad y la protección de los dispositivos de Edge. Para obtener más información sobre Microsoft Defender para IoT, consulte ¿Qué es Microsoft Defender para IoT para generadores de dispositivos?.

Aprovisionamiento del dispositivo con su identidad de nube

Una vez que el entorno de ejecución esté instalado en el dispositivo, configure el dispositivo con la información que usa para conectarse a Device Provisioning Service y a IoT Hub.

Tenga lista la siguiente información:

  • El valor de Ámbito de id. del DPS. Puede recuperar este valor de la página Información general de la instancia de DPS en Azure Portal.
  • El archivo de cadena de certificados de identidad del dispositivo en el dispositivo.
  • El archivo de clave de identidad del dispositivo en el dispositivo.
  1. Abra el archivo de configuración en el dispositivo IoT Edge.

    sudo nano /etc/iotedge/config.yaml
    
  2. Busque la sección configuraciones de aprovisionamiento del archivo. Quite las marcas de comentario de las líneas de aprovisionamiento de certificado X.509 de DPS y asegúrese de que cualquier otra línea de aprovisionamiento esté comentada.

    La línea provisioning: no debe ir precedida por espacios en blanco y se debe aplicar una sangría de dos espacios a los elementos anidados.

    # DPS X.509 provisioning configuration
    provisioning:
      source: "dps"
      global_endpoint: "https://global.azure-devices-provisioning.net"
      scope_id: "SCOPE_ID_HERE"
      attestation:
        method: "x509"
    #   registration_id: "OPTIONAL_REGISTRATION_ID_LEAVE_COMMENTED_OUT_TO_REGISTER_WITH_CN_OF_IDENTITY_CERT"
        identity_cert: "REQUIRED_URI_TO_DEVICE_IDENTITY_CERTIFICATE_HERE"
        identity_pk: "REQUIRED_URI_TO_DEVICE_IDENTITY_PRIVATE_KEY_HERE"
    
    # always_reprovision_on_startup: true
    # dynamic_reprovisioning: false
    
  3. Actualice los valores de scope_id, identity_cert y identity_pk con la información de DPS y del dispositivo.

    Al agregar el certificado X.509 y la información de clave al archivo config.yaml, las rutas de acceso se deben especificas como URI de archivo. Por ejemplo:

    file:///<path>/identity_certificate_chain.pem file:///<path>/identity_key.pem

  4. De manera opcional, proporcione el registration_id del dispositivo, que debe coincidir con el nombre común (CN) del certificado de identidad. Si deja esa línea comentada, se aplicará automáticamente el CN.

  5. También puede usar las líneas always_reprovision_on_startup o dynamic_reprovisioning para configurar el comportamiento de reaprovisionamiento del dispositivo. Si un dispositivo se establece para que se vuelva a aprovisionar en el inicio, siempre intentará aprovisionar con DPS primero y, a continuación, revertir a la copia de seguridad de aprovisionamiento si se produce un error. Si un dispositivo se establece para que se vuelva a aprovisionar dinámicamente, IoT Edge (y todos los módulos) se reiniciará y volverá a aprovisionar si se detecta un evento de reaprovisionamiento, como si se moviera el dispositivo desde un IoT Hub a otro. En concreto, IoT Edge comprueba si hay errores bad_credential o device_disabled del SDK para detectar el evento de reprovisión. Para desencadenar este evento manualmente, deshabilite el dispositivo en IoT Hub. Para más información, consulte Conceptos sobre el reaprovisionamiento de dispositivos de IoT Hub.

  6. Guarde y cierre el archivo config.yaml.

  7. Reinicie el entorno de ejecución de IoT Edge para que aplique todos los cambios de configuración realizados en el dispositivo.

    sudo systemctl restart iotedge
    
  1. Cree un archivo de configuración para el dispositivo basándose en un archivo de plantilla que se proporciona como parte de la instalación de IoT Edge.

    sudo cp /etc/aziot/config.toml.edge.template /etc/aziot/config.toml
    
  2. Abra el archivo de configuración en el dispositivo IoT Edge.

    sudo nano /etc/aziot/config.toml
    
  3. Busque la sección Provisioning (Aprovisionamiento) del archivo. Quite las marcas de comentario de las líneas de aprovisionamiento de DPS con el certificado X.509 y asegúrese de que cualquier otra línea de aprovisionamiento esté comentada.

    # DPS provisioning with X.509 certificate
    [provisioning]
    source = "dps"
    global_endpoint = "https://global.azure-devices-provisioning.net"
    id_scope = "SCOPE_ID_HERE"
    
    # Uncomment to send a custom payload during DPS registration
    # payload = { uri = "PATH_TO_JSON_FILE" }
    
    [provisioning.attestation]
    method = "x509"
    registration_id = "REGISTRATION_ID_HERE"
    
    identity_cert = "DEVICE_IDENTITY_CERTIFICATE_HERE"
    
    identity_pk = "DEVICE_IDENTITY_PRIVATE_KEY_HERE"
    
    # auto_reprovisioning_mode = Dynamic
    
  4. Actualice el valor de id_scope con el identificador de ámbito que copió de la instancia de DPS.

  5. Proporcione un registration_id para el dispositivo, que es el identificador que el dispositivo tendrá en IoT Hub. El identificador de registro debe coincidir con el nombre común (CN) del certificado de identidad.

  6. Actualice los valores de identity_cert y identity_pk con la información del certificado y el dispositivo.

    El valor del certificado de identidad se puede proporcionar como un URI de archivo o se puede emitir dinámicamente mediante EST o una entidad de certificación local. Quite la marca de comentario de una sola línea, en función del formato que decida usar.

    El valor de clave privada de identidad se puede proporcionar como un URI de archivo o como un URI de PKCS#11. Quite la marca de comentario de una sola línea, en función del formato que decida usar.

    Si usa cualquier URI de PKCS#11, busque la sección PKCS#11 en el archivo de configuración y proporcione información sobre la configuración de PKCS#11.

  7. Opcionalmente, busque la sección del modo de reaprovisionamiento automático del archivo. Use el parámetro auto_reprovisioning_mode para configurar el comportamiento de reaprovisionamiento del dispositivo. Dinámico: vuelve a aprovisionar cuando el dispositivo detecta que puede haberse movido de una instancia de IoT Hub a otra. Este es el valor predeterminado. AlwaysOnStartup: vuelve a aprovisionar cuando se reinicia el dispositivo o un bloqueo hace que se reinicie(n) el(los) daemon(s). OnErrorOnly: el reaprovisionamiento del dispositivo nunca se desencadena automáticamente. Cada modo tiene una reserva de reaprovisionamiento de dispositivo implícita si este no puede conectarse a IoT Hub durante el aprovisionamiento de identidades debido a errores de conectividad. Para más información, consulte Conceptos sobre el reaprovisionamiento de dispositivos de IoT Hub.

  1. Opcionalmente, quite el comentario del parámetro payload para especificar la ruta de acceso a un archivo JSON local. El contenido del archivo se enviará a DPS como datos adicionales cuando el dispositivo se registre. Esto es útil para la asignación personalizada. Por ejemplo, si desea asignar los dispositivos en función de un identificador de modelo de IoT Plug and Play sin intervención humana.
  1. Guarde y cierre el archivo.

  2. Aplique los cambios de configuración que ha realizado a IoT Edge.

    sudo iotedge config apply
    

Comprobación de instalación correcta

Si el entorno de ejecución se inició correctamente, puede ir a IoT Hub y empezar a implementar módulos de IoT Edge en el dispositivo.

Puede comprobar que la inscripción individual que ha creado en Device Provisioning Service se ha usado. En Azure Portal, vaya a la instancia de Device Provisioning Service. Abra los detalles de la inscripción para la inscripción individual que ha creado. Tenga en cuenta que el estado de la inscripción está asignado y se muestra el id. de dispositivo.

Use los siguientes comandos en el dispositivo para comprobar que la instancia de IoT Edge se haya instalado e iniciado correctamente.

Compruebe el estado del servicio IoT Edge.

systemctl status iotedge

Examine los registros del servicio.

journalctl -u iotedge --no-pager --no-full

Enumere los módulos en ejecución.

iotedge list

Compruebe el estado del servicio IoT Edge.

sudo iotedge system status

Examine los registros del servicio.

sudo iotedge system logs

Enumere los módulos en ejecución.

sudo iotedge list

Pasos siguientes

El proceso de inscripción en Device Provisioning Service permite establecer el id. de dispositivo y las etiquetas del dispositivo gemelo al mismo tiempo que se aprovisiona el nuevo dispositivo. Puede usar esos valores para dirigirse a dispositivos individuales o grupos de dispositivos con la administración automática de dispositivos. Aprenda a implementar y supervisar los módulos de IoT Edge a escala mediante Azure Portal o la CLI de Azure.