Compartir vía


Conexión de un dispositivo de bajada a una puerta de enlace Azure IoT Edge

Se aplica a:icono de yes IoT Edge 1.1

Importante

La fecha de finalización del soporte técnico de IoT Edge 1.1 fue el 13 de diciembre de 2022. Compruebe el ciclo de vida del producto de Microsoft para obtener información sobre cómo se admite este producto, servicio, tecnología o API. Para más información sobre cómo actualizar a la versión más reciente de IoT Edge, consulte Actualización de IoT Edge.

En este artículo se proporcionan instrucciones para establecer una conexión de confianza entre dispositivos descendentes y puertas de enlace de IoT Edge transparentes. En un escenario de puerta de enlace transparente, uno o varios dispositivos pueden pasar sus mensajes a través de un dispositivo de puerta de enlace único que mantiene la conexión con IoT Hub.

Hay tres pasos generales para configurar una conexión de puerta de enlace transparente correcta. En este artículo se describe el tercer paso:

  1. Configure el dispositivo de puerta de enlace como servidor para que los dispositivos de bajada puedan conectarse a él de forma segura. Configure la puerta de enlace para recibir mensajes de los dispositivos de bajada y enrutarlos al destino adecuado. Para estos pasos, consulte Configuración de un dispositivo IoT Edge para que actúe como puerta de enlace transparente.

  2. Crear una identidad de dispositivo para el dispositivo descendente para que pueda autenticarse en IoT Hub. Configura el dispositivo de destino para enviar mensajes mediante el dispositivo de puerta de enlace. Para estos pasos, consulte Autenticación de un dispositivo descendente en Azure IoT Hub.

  3. Conecte el dispositivo de bajada al dispositivo de puerta de enlace y empiece a enviar mensajes.

En este artículo se describen los conceptos básicos para las conexiones de dispositivos aguas abajo y se le asesora en la configuración de los dispositivos mediante:

  • Descripción de los aspectos básicos de la seguridad de la capa de transporte (TLS) y los certificados.
  • Descripción del funcionamiento de las bibliotecas de TLS en distintos sistemas operativos y del tratamiento de los certificados en cada sistema operativo.
  • Recorrer ejemplos de Azure IoT en varios lenguajes para ayudarle a empezar.

En este artículo, los términos puerta de enlace y puerta de enlace de IoT Edge hacen referencia a un dispositivo IoT Edge configurado como puerta de enlace transparente.

Nota:

Un dispositivo aguas abajo emite datos directamente a Internet o a dispositivos de puerta de enlace (compatible o no con IoT Edge). Un dispositivo hijo puede ser un dispositivo descendente o un dispositivo gateway en una topología en bucle.

Prerrequisitos

Preparación de un dispositivo de bajada

Un dispositivo de bajada puede ser cualquier aplicación o plataforma que tenga una identidad creada con el servicio en la nube Azure IoT Hub. En muchos casos, estas aplicaciones usan el SDK de dispositivo IoT de Azure. Un dispositivo descendente podría ser incluso una aplicación que se ejecuta en el propio dispositivo gateway IoT Edge. Sin embargo, otro dispositivo IoT Edge no puede ser inferior a una puerta de enlace de IoT Edge.

Nota:

Los dispositivos IoT registrados con IoT Hub pueden usar módulos gemelos para aislar diferentes procesos, hardware o funciones en un único dispositivo. Las puertas de enlace de IoT Edge admiten conexiones de módulo inferiores mediante la autenticación de clave simétrica, pero no la autenticación de certificado X.509.

Para conectar un dispositivo de bajada a una puerta de enlace IoT Edge, necesita dos cosas:

  • Un dispositivo o aplicación que esté configurada con una cadena de conexión de dispositivo de IoT Hub anexada con información para conectarse a la puerta de enlace.

    Este paso se completó en el artículo anterior Autenticación de un dispositivo de bajada en Azure IoT Hub.

  • El dispositivo o la aplicación tienen que confiar en el certificado raíz de la autoridad de certificación de la puerta de enlace para validar las conexiones de seguridad de la capa de transporte (TLS) al dispositivo de la puerta de enlace.

    Este paso se explica con detalle en el resto de este artículo. Este paso se puede ser realizar de dos maneras: mediante la instalación del certificado de entidad de certificación en el almacén de certificados del sistema operativo o (para determinados lenguajes) haciendo referencia al certificado dentro de las aplicaciones mediante los SDK de Azure IoT.

Aspectos básicos del certificado y TLS

El desafío de una conexión segura de los dispositivos de bajada a IoT Edge es igual que en cualquier otra comunicación cliente/servidor segura que se produce en Internet. Un cliente y un servidor se comunican de forma segura a través de Internet mediante la seguridad de la capa de transporte (TLS). TLS se crea mediante construcciones estándar de infraestructura de clave pública (PKI) denominadas certificados. TLS es una especificación bastante compleja que aborda una amplia gama de temas relacionados con la protección de dos puntos de conexión. En esta sección se resumen los conceptos relevantes para que pueda conectar de forma segura los dispositivos a una puerta de enlace IoT Edge.

Cuando un cliente se conecta a un servidor, el servidor presenta una cadena de certificados, denominada cadena de certificados de servidor. Una cadena de certificados normalmente consta de un certificado de entidad de certificación (CA) raíz, uno o varios certificados de entidad de certificación intermedios y, finalmente, el propio certificado del servidor. Un cliente establece la confianza con un servidor mediante la comprobación criptográfica de la cadena de certificados de servidor completa. Esta validación de cliente de la cadena de certificados de servidor se denomina validación de la cadena de servidores. El cliente desafía al servidor a demostrar la posesión de la clave privada asociada al certificado de servidor en un proceso denominado prueba de posesión. La combinación de validación de cadena de servidor y prueba de posesión se denomina autenticación del servidor. Para validar una cadena de certificados de servidor, un cliente necesita una copia del certificado de la entidad de certificación raíz que se usó para crear (o emitir) el certificado del servidor. Normalmente, al conectarse a sitios web, un explorador viene preconfigurado con certificados de entidad de certificación usados habitualmente para que el cliente tenga un proceso de conexión directo.

Cuando un dispositivo se conecta a Azure IoT Hub, el dispositivo es el cliente y el servicio en la nube de IoT Hub es el servidor. El servicio en la nube de IoT Hub está respaldado por un certificado de entidad de certificación raíz llamado Baltimore CyberTrust Root, que está disponible públicamente y ampliamente utilizado. Puesto que el certificado de entidad de certificación de IoT Hub ya está instalado en la mayoría de los dispositivos, muchas implementaciones de TLS (OpenSSL, Schannel, LibreSSL) lo utilizan automáticamente durante la validación de certificados de servidor. Sin embargo, un dispositivo que puede conectarse correctamente a IoT Hub puede tener problemas al intentar conectarse a una puerta de enlace IoT Edge.

Cuando un dispositivo se conecta a una puerta de enlace IoT Edge, el dispositivo de bajada es el cliente y el dispositivo de puerta de enlace es el servidor. Azure IoT Edge le permite crear cadenas de certificados de puerta de enlace como consideren oportuno. Puede usar un certificado de entidad de certificación pública, como Baltimore o usar un certificado de entidad de certificación de raíz autofirmado (o interno). Los certificados de entidad de certificación pública a menudo tienen un costo asociado, por lo que se utilizan normalmente en escenarios de producción. Los certificados de entidad de certificación autofirmados se prefieren para desarrollo y pruebas. Si usa los certificados de demostración, estos son certificados de Autoridad Certificadora (CA) raíz autofirmados.

Cuando se usa un certificado de entidad de certificación raíz autofirmado para una puerta de enlace IoT Edge, este se debe instalar o proporcionar a todos los dispositivos de bajada que intentan conectarse a la puerta de enlace.

Configuración del certificado de puerta de enlace

Para más información sobre los certificados de IoT Edge y algunas implicaciones de producción, consulte Detalles de uso de certificados de IoT Edge.

Inclusión del certificado de entidad de certificación raíz

Para comprobar los certificados del dispositivo de puerta de enlace, el dispositivo de bajada necesita su propia copia del certificado de entidad de certificación raíz. Si ha usado los scripts proporcionados en el repositorio git de IoT Edge para crear certificados de prueba, el certificado de ca raíz se denomina azure-iot-test-only.root.ca.cert.pem. Si no lo ha hecho ya como parte de los otros pasos de preparación del dispositivo de bajada, mueva este archivo de certificado a cualquier directorio de este dispositivo. Puede usar un servicio como Azure Key Vault o una función como protocolo de copia segura para mover el archivo de certificado.

Instalación de certificados en el sistema operativo

Una vez que el certificado de la autoridad certificadora raíz está en el dispositivo cliente, debe asegurarse de que las aplicaciones que se conectan a la puerta de enlace puedan acceder al certificado.

La instalación del certificado de entidad de certificación raíz en el almacén de certificados del sistema operativo generalmente permite que la mayoría de las aplicaciones lo usen. Hay algunas excepciones, como las aplicaciones de NodeJS, que no utilizan el almacén de certificados del sistema operativo y utilizan en su lugar el almacén de certificados interno del entorno de ejecución de Node. Si no puede instalar el certificado en el nivel de sistema operativo, vaya directamente a Uso de certificados con SDK de Azure IoT.

Ubuntu

Los siguientes comandos son un ejemplo de cómo instalar un certificado de entidad de certificación en un host con Ubuntu. En este ejemplo se supone que usa el certificado azure-iot-test-only.root.ca.cert.pem de los artículos de requisitos previos y que ha copiado el certificado en una ubicación del dispositivo descendente.

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

Verá un mensaje que dice "Updating certificates in /etc/ssl/certs... 1 added, 0 removed; done." (Actualizando certificados en /etc/ssl/certs...1 agregado, 0 quitados, listo)

Windows

Los siguientes pasos son un ejemplo de cómo instalar un certificado de entidad de certificación en un host con Windows. En este ejemplo se supone que usa el certificado azure-iot-test-only.root.ca.cert.pem de los artículos de requisitos previos y que ha copiado el certificado en una ubicación del dispositivo de bajada.

Puede instalar certificados mediante import-Certificate de PowerShell como administrador:

import-certificate  <file path>\azure-iot-test-only.root.ca.cert.pem -certstorelocation cert:\LocalMachine\root

También puede instalar certificados mediante la utilidad certlm :

  1. En el menú Inicio, busque y seleccione Administrar certificados de equipo. Se abre una utilidad denominada certlm .
  2. Vaya a Certificados - Equipo Local>Entidades de certificación raíz de confianza.
  3. Haga clic con el botón derecho en Certificados y seleccione Todas las tareas>Importar. Se debe iniciar el asistente para importación de certificados.
  4. Siga los pasos tal como se indica e importe el archivo del certificado <path>/azure-iot-test-only.root.ca.cert.pem. Cuando se haya completado, verá el mensaje "Importación correcta".

También puede instalar certificados mediante programación con las API de .NET, como se muestra más adelante en el ejemplo de .NET de este artículo.

Normalmente, las aplicaciones usan la pila TLS proporcionada por Windows denominada Schannel para conectarse de forma segura a través de TLS. Schannel requiere que los certificados se instalen en el almacén de certificados de Windows antes de intentar establecer una conexión TLS.

Uso de certificados con los SDK de Azure IoT

En esta sección se describe cómo los SDK de IoT de Azure se conectan a un dispositivo IoT Edge mediante aplicaciones de ejemplo sencillas. El objetivo de todos los ejemplos es conectar el cliente del dispositivo y enviar mensajes de telemetría a la puerta de enlace y, a continuación, cerrar la conexión y salir.

Tenga dos elementos listos antes de usar los ejemplos de nivel de aplicación:

  • La cadena de conexión de IoT Hub de su dispositivo descendente ha sido modificada para dirigir hacia el dispositivo de puerta de enlace, junto con los certificados necesarios para autenticar su dispositivo descendente en IoT Hub. Para más información, consulte Autenticar un dispositivo descendente a Azure IoT Hub.

  • La ruta de acceso completa del certificado de entidad de certificación raíz que ha copiado y guardado en algún lugar del dispositivo de bajada.

    Por ejemplo: <path>/azure-iot-test-only.root.ca.cert.pem.

NodeJS

Esta sección proporciona una aplicación de ejemplo para conectar un cliente de dispositivo de NodeJS de Azure IoT a una puerta de enlace IoT Edge. En el caso de las aplicaciones de NodeJS, debe instalar el certificado de entidad de certificación raíz en el nivel de aplicación, tal como se muestra aquí. Las aplicaciones de NodeJS no usan el almacén de certificados del sistema.

  1. Obtenga el ejemplo edge_downstream_device.js del repositorio de ejemplos del SDK de dispositivo IoT de Azure para Node.js.
  2. Asegúrese de que tiene todos los requisitos previos para ejecutar el ejemplo revisando el archivo readme.md .
  3. En el archivo edge_downstream_device.js, actualice las variables connectionString y edge_ca_cert_path .
  4. Consulte la documentación del SDK para obtener instrucciones sobre cómo ejecutar el ejemplo en el dispositivo.

Para entender el ejemplo que se está ejecutando, el siguiente fragmento de código contiene el modo en el que el SDK de cliente lee el archivo de certificado y lo usa para establecer una conexión TLS segura:

// Provide the Azure IoT device client via setOptions with the X509
// Edge root CA certificate that was used to setup the Edge runtime
var options = {
    ca : fs.readFileSync(edge_ca_cert_path, 'utf-8'),
};

.NET

Esta sección presenta una aplicación de ejemplo para conectar un cliente de dispositivo de .NET de Azure IoT a una puerta de enlace IoT Edge. Sin embargo, las aplicaciones .NET pueden usar automáticamente los certificados instalados en el almacén de certificados del sistema en los hosts con Linux y Windows.

  1. Obtenga el ejemplo de EdgeDownstreamDevice desde la carpeta de ejemplos de .NET de IoT Edge.
  2. Asegúrese de que tiene todos los requisitos previos para ejecutar el ejemplo revisando el archivo readme.md .
  3. En el archivo Properties/launchSettings.json , actualice las variables DEVICE_CONNECTION_STRING y CA_CERTIFICATE_PATH . Si desea utilizar el certificado instalado en el almacén de certificados de confianza en el sistema host, deje en blanco esta variable.
  4. Consulte la documentación del SDK para obtener instrucciones sobre cómo ejecutar el ejemplo en el dispositivo.

Para instalar mediante programación un certificado de confianza en el almacén de certificados a través de una aplicación .NET, consulte la función InstallCACert() en el archivo EdgeDownstreamDevice/Program.cs . Esta operación es idempotente, por lo que se puede ejecutar varias veces con los mismos valores sin ningún efecto adicional.

C

Esta sección presenta una aplicación de ejemplo para conectar un cliente de dispositivo de Azure IoT para C a una puerta de enlace IoT Edge. El SDK para C puede funcionar con muchas bibliotecas TLS, incluidas OpenSSL, WolfSSL y Schannel. Para más información, consulte el SDK de C de Azure IoT.

  1. Obtenga la aplicación iotedge_downstream_device_sample del SDK de dispositivo IoT de Azure para ejemplos de C.
  2. Asegúrese de que tiene todos los requisitos previos para ejecutar el ejemplo revisando el archivo readme.md .
  3. En el archivo iotedge_downstream_device_sample.c, actualice las variables connectionString y edge_ca_cert_path .
  4. Consulte la documentación del SDK para obtener instrucciones sobre cómo ejecutar el ejemplo en el dispositivo.

El SDK de dispositivo IoT de Azure para C proporciona una opción para registrar un certificado de entidad de certificación al configurar el cliente. Esta operación no instala el certificado en ningún lugar y en su lugar usa un formato de cadena del certificado en memoria. Al establecer una conexión, se proporciona el certificado guardado a la pila TLS subyacente.

(void)IoTHubDeviceClient_SetOption(device_handle, OPTION_TRUSTED_CERT, cert_string);

Nota:

El método para registrar un certificado de autoridad certificadora al configurar el cliente puede cambiar cuando se usa un paquete administrado o una biblioteca. Por ejemplo, la biblioteca basada en el IDE de Arduino requerirá agregar el certificado CA a una matriz de certificados definida en un archivo certs.c global, en lugar de usar la operación IoTHubDeviceClient_LL_SetOption.

En hosts con Windows, si no utiliza OpenSSL ni otra biblioteca de TLS, el SDK utiliza de manera predeterminada Schannel. Para que Schannel funcione, se debe instalar el certificado de entidad de certificación raíz de IoT Edge en el almacén de certificados de Windows, no se debe establecer mediante la operación IoTHubDeviceClient_SetOption.

Java

Esta sección presenta una aplicación de ejemplo para conectar un cliente de dispositivo de Java de Azure IoT a una puerta de enlace IoT Edge.

  1. Obtenga el ejemplo de Send-event del SDK de dispositivo IoT de Azure para ejemplos de Java.
  2. Asegúrese de que tiene todos los requisitos previos para ejecutar el ejemplo revisando el archivo readme.md .
  3. Consulte la documentación del SDK para obtener instrucciones sobre cómo ejecutar el ejemplo en el dispositivo.

Pitón

Esta sección presenta una aplicación de ejemplo para conectar un cliente de dispositivo de Python de Azure IoT a una puerta de enlace IoT Edge.

  1. Obtenga el ejemplo de send_message_downstream del SDK de dispositivo IoT de Azure para ejemplos de Python.
  2. Establezca las variables de entorno IOTHUB_DEVICE_CONNECTION_STRING y IOTEDGE_ROOT_CA_CERT_PATH como se especifica en los comentarios del script de Python.
  3. Consulte la documentación del SDK para obtener instrucciones adicionales sobre cómo ejecutar el ejemplo en el dispositivo.

Prueba de la conexión de puerta de enlace

Use este comando de ejemplo para probar que el dispositivo de bajada para probar que puede conectarse al dispositivo de puerta de enlace:

openssl s_client -connect mygateway.contoso.com:8883 -CAfile <CERTDIR>/certs/azure-iot-test-only.root.ca.cert.pem -showcerts

Este comando prueba las conexiones a través de MQTTS (puerto 8883). Si usa un protocolo diferente, ajuste el comando según sea necesario para AMQPS (5671) o HTTPS (443)

La salida de este comando puede ser larga, incluida la información sobre todos los certificados de la cadena. Si la conexión se realiza correctamente, verá una línea como Verification: OK o Verify return code: 0 (ok).

Comprobación de la conexión de puerta de enlace

Solución de problemas de la conexión de puerta de enlace

Si el dispositivo aguas abajo tiene conexión intermitente con su dispositivo de puerta de enlace, intente seguir los pasos siguientes para solucionarlo.

  1. ¿El nombre de host de la puerta de enlace en la cadena de conexión es el mismo que el valor de hostname en el archivo de configuración de IoT Edge del dispositivo de puerta de enlace?
  2. ¿Se puede resolver el nombre de host de la puerta de enlace en una dirección IP? Puede resolver conexiones intermitentes mediante el uso de DNS o bien mediante la incorporación de una entrada de archivo de host en el dispositivo bajada.
  3. ¿Están abiertos los puertos de comunicación en el firewall? Debe ser posible la comunicación basada en el protocolo usado (MQTTS:8883/AMQPS:5671/HTTPS:433) entre el dispositivo de bajada y el dispositivo IoT Edge transparente.

Pasos siguientes

Obtenga información sobre cómo IoT Edge puede ampliar las funcionalidades sin conexión a los dispositivos finales.