Autenticación personalizada con certificados de cliente X.509 - AWS IoT Core

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

Autenticación personalizada con certificados de cliente X.509

Al conectar dispositivos a AWS IoT Core, tiene varios tipos de autenticación disponibles. Puede usar certificados de cliente X.509, que se pueden usar para autenticar las conexiones de clientes y dispositivos, o definir autorizadores personalizados para administrar su propia lógica de autenticación y autorización de clientes. En este tema se explica cómo utilizar la autenticación personalizada con los certificados de cliente X.509.

El uso de la autenticación personalizada con certificados X.509 puede resultar útil si ya ha autenticado sus dispositivos con certificados X.509 y desea realizar validaciones adicionales y autorizaciones personalizadas. Por ejemplo, si almacena los datos de sus dispositivos, como sus números de serie, en el certificado de cliente X.509, una vez AWS IoT Core autenticado el certificado de cliente X.509, puede utilizar un autorizador personalizado para identificar dispositivos específicos en función de la información almacenada en el campo del certificado. CommonName El uso de la autenticación personalizada con los certificados X.509 puede mejorar la gestión de la seguridad de los dispositivos al conectarlos AWS IoT Core y proporciona más flexibilidad a la hora de gestionar la lógica de autenticación y autorización. AWS IoT Core admite la autenticación personalizada con certificados X.509 mediante el certificado X.509 y el tipo de autenticación con autorizador personalizado, que funciona tanto con el protocolo MQTT como con el protocolo HTTPS. Para obtener más información sobre los tipos de autenticación y los protocolos de aplicación que admiten los puntos de conexión de los dispositivos de AWS IoT Core , consulte Protocolos de comunicación de dispositivos.

nota

Las regiones no admiten la autenticación personalizada con certificados de cliente X.509. AWS GovCloud (US)

importante

Debe usar un punto de conexión creado con configuraciones de dominio. Además, los clientes deben proporcionar la extensión de indicación del nombre del servidor (SNI) al conectarse a. AWS IoT Core

Paso 1: registre sus certificados de cliente X.509 en AWS IoT Core

Si aún no lo ha hecho, registre y active sus certificados de cliente X.509 con. AWS IoT Core De no ser así, vaya al siguiente paso.

Para registrar y activar sus certificados de cliente con ellos AWS IoT Core, siga estos pasos:

  1. Si crea certificados de cliente directamente con AWS IoT. Estos certificados de cliente se registrarán automáticamente en AWS IoT Core.

  2. Si crea sus propios certificados de cliente, siga estas instrucciones para registrarlos AWS IoT Core.

  3. Siga estas instrucciones para activar sus certificados de cliente.

Paso 2: creación de una función de Lambda

AWS IoT Core utiliza autorizadores personalizados para implementar esquemas de autenticación y autorización personalizados. Un autorizador personalizado está asociado a una función de Lambda que determina si un dispositivo está autenticado y qué operaciones puede realizar el dispositivo. Cuando un dispositivo se conecta a AWS IoT Core, AWS IoT Core recupera los detalles del autorizador, incluidos el nombre del autorizador y la función Lambda asociada, e invoca la función Lambda. La función de Lambda recibe un evento que contiene un objeto JSON con los datos del certificado de cliente X.509 del dispositivo. La función de Lambda utiliza este objeto JSON del evento para evaluar la solicitud de autenticación, decidir las acciones que se van a realizar y enviar una respuesta.

Ejemplo de evento de la función de Lambda

El siguiente objeto JSON de ejemplo contiene todos los campos posibles que se pueden incluir. El objeto JSON real solo contendrá los campos relevantes para la solicitud de conexión específica.

{ "token": "aToken", "signatureVerified": true, "protocols": [ "tls", "mqtt" ], "protocolData": { "tls": { "serverName": "serverName", "x509CertificatePem": "x509CertificatePem", "principalId": "principalId" }, "mqtt": { "clientId": "myClientId", "username": "myUserName", "password": "myPassword" } }, "connectionMetadata": { "id": "UUID" } }
signatureVerified

Es un valor booleano que indica si la firma del token configurada en el autorizador se verifica o no antes de invocar la función de Lambda del autorizador. Si el autorizador está configurado para desactivar la firma de token, este campo será falso.

protocols

Es una matriz que contiene los protocolos esperados para la solicitud.

protocolData

Es un objeto que contiene información de los protocolos utilizados en la conexión. Proporciona detalles específicos del protocolo que pueden ser útiles para la autenticación, la autorización y mucho más.

tls: este objeto contiene información relacionada con el protocolo TLS (seguridad de la capa de transporte).

  • serverName: es la cadena de nombre de host Indicación del nombre del servidor (SNI). AWS IoT Core requiere que los dispositivos envíen la extensión SNI al protocolo de seguridad de la capa de transporte (TLS) y proporcionen la dirección completa del punto de conexión en el campo host_name.

  • x509CertificatePem: es el certificado X.509 en formato PEM, que se utiliza para la autenticación de cliente en la conexión TLS.

  • principalId: es el identificador de la entidad principal asociado al cliente en la conexión TLS.

mqtt- Este objeto contiene información relacionada con el protocolo MQTT.

  • clientId: solo es necesario incluir una cadena en caso de que el dispositivo envíe este valor.

  • username: es el nombre de usuario proporcionado en el paquete MQTT Connect.

  • password: es la contraseña proporcionada en el paquete MQTT Connect.

connectionMetadata

Son los metadatos de la conexión.

id: es el identificador de conexión, que puede utilizar para registrarse y solucionar problemas.

nota

En este objeto JSON del evento, x509CertificatePem y principalId son dos campos nuevos en la solicitud. El valor de principalId es el mismo que el valor de certificateId. Para obtener más información, consulte Certificate.

Ejemplo de respuesta de la función de Lambda

La función de Lambda debe usar información del objeto JSON del evento para autenticar la conexión entrante y decidir qué acciones se permiten en la conexión.

El siguiente objeto JSON contiene un ejemplo de una respuesta que puede enviar la función de Lambda.

{ "isAuthenticated": true, "principalId": "xxxxxxxx", "disconnectAfterInSeconds": 86400, "refreshAfterInSeconds": 300, "policyDocuments": [ { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "iot:Publish", "Resource": "arn:aws:iot:us-east-1:123456789012:topic/customauthtesting" } ] } ] }

En este ejemplo, esta función debe enviar una respuesta que contenga los siguientes valores.

isAuthenticated

Es un valor booleano que indica si la solicitud se ha autenticado.

principalId

Es una cadena alfanumérica que actúa como identificador del token enviado por la solicitud de autorización personalizada. El valor debe ser una cadena alfanumérica con un mínimo de 1 y un máximo de 128 caracteres. Identifica la conexión en los registros. El valor de principalId debe ser el mismo que el valor de principalId en el objeto JSON del evento (es decir, el CertificateID del certificado X.509).

policyDocuments

Una lista de documentos de políticas con formato JSON AWS IoT Core . El valor es opcional y admite variables de política de objetos y variables de política de certificados. El número máximo de documentos de políticas es de 10. Cada documento de política puede contener un máximo de 2048 caracteres. Si tiene varias políticas asociadas a su certificado de cliente y a la función de Lambda, el permiso es una recopilación de todas las políticas. Para obtener más información sobre la creación de AWS IoT Core políticas, consulte Políticas.

disconnectAfterInSeconds

Un entero que especifica la duración máxima (en segundos) de la conexión a la AWS IoT Core puerta de enlace. El valor mínimo es 300 segundos y el máximo, 86 400 segundos. disconnectAfterInSeconds es para toda la vida útil de una conexión y no se actualiza al actualizar la política de forma consecutiva.

refreshAfterInSeconds

Es un entero que especifica el intervalo entre las actualizaciones de la política. Cuando pasa este intervalo, AWS IoT Core invoca la función Lambda para permitir la actualización de las políticas. El valor mínimo es de 300 segundos y el máximo es de 86 400 segundos.

Ejemplo de función de Lambda

A continuación, se muestra una función de Lambda Node.js de ejemplo. La función examina el certificado X.509 del cliente y extrae la información relevante, como el número de serie, la huella digital y el nombre del sujeto. Si la información extraída coincide con los valores esperados, el cliente podrá conectarse. Este mecanismo garantiza que solo los clientes autorizados con certificados válidos puedan establecer una conexión.

const crypto = require('crypto'); exports.handler = async (event) => { // Extract the certificate PEM from the event const certPem = event.protocolData.tls.x509CertificatePem; // Parse the certificate using Node's crypto module const cert = new crypto.X509Certificate(certPem); var effect = "Deny"; // Allow permissions only for a particular certificate serial, fingerprint, and subject if (cert.serialNumber === "7F8D2E4B9C1A5036DE8F7C4B2A91E5D80463BC9A1257" // This is a random serial && cert.fingerprint === "F2:9A:C4:1D:B5:E7:08:3F:6B:D0:4E:92:A7:C1:5B:8D:16:0F:E3:7A" // This is a random fingerprint && cert.subject === "allow.example.com") { effect = "Allow"; } return generateAuthResponse(event.protocolData.tls.principalId, effect); }; // Helper function to generate the authorization response. function generateAuthResponse(principalId, effect) { const authResponse = { isAuthenticated: true, principalId, disconnectAfterInSeconds: 3600, refreshAfterInSeconds: 300, policyDocuments: [ { Version: "2012-10-17", Statement: [ { Action: ["iot:Connect"], Effect: effect, Resource: [ "arn:aws:iot:us-east-1:123456789012:client/myClientName" ] }, { Action: ["iot:Publish"], Effect: effect, Resource: [ "arn:aws:iot:us-east-1:123456789012:topic/telemetry/myClientName" ] }, { Action: ["iot:Subscribe"], Effect: effect, Resource: [ "arn:aws:iot:us-east-1:123456789012:topicfilter/telemetry/myClientName" ] }, { Action: ["iot:Receive"], Effect: effect, Resource: [ "arn:aws:iot:us-east-1:123456789012:topic/telemetry/myClientName" ] } ] } ] }; return authResponse; }

La función de Lambda anterior devuelve el siguiente JSON cuando recibe un certificado con el número de serie, la huella digital y el sujeto esperados. El valor de x509CertificatePem será el certificado de cliente proporcionado en el protocolo de enlace TLS. Para obtener más información, consulte Defining your Lambda function.

{ "isAuthenticated": true, "principalId": "principalId in the event JSON object", "policyDocuments": [ { "Version": "2012-10-17", "Statement": [ { "Action": "iot:Connect", "Effect": "Allow", "Resource": "arn:aws:iot:us-east-1:123456789012:client/myClientName" }, { "Action": "iot:Publish", "Effect": "Allow", "Resource": "arn:aws:iot:us-east-1:123456789012:topic/telemetry/myClientName" }, { "Action": "iot:Subscribe", "Effect": "Allow", "Resource": "arn:aws:iot:us-east-1:123456789012:topicfilter/telemetry/myClientName" }, { "Action": "iot:Receive", "Effect": "Allow", "Resource": "arn:aws:iot:us-east-1:123456789012:topic/telemetry/myClientName" } ] } ], "disconnectAfterInSeconds": 3600, "refreshAfterInSeconds": 300 }

Paso 3: creación de un autorizador personalizado

Tras definir la función de Lambda, cree un autorizador personalizado para administrar su propia lógica de autenticación y autorización de clientes. Puede seguir las instrucciones detalladas en el Step 3: Create a customer authorizer resource and its authorization. Para obtener más información, consulte Creating an authorizer.

En el proceso de creación del autorizador personalizado, debe conceder el permiso de AWS IoT para invocar la función de Lambda una vez creada. Para obtener instrucciones detalladas, consulte AWS IoT Autorizar la invocación de la función Lambda.

Paso 4: definición del tipo de autenticación y el protocolo de aplicación en una configuración de dominio

Para autenticar los dispositivos mediante la autenticación personalizada con certificados de cliente X.509, debe establecer el tipo de autenticación y el protocolo de aplicación en una configuración de dominio y debe enviar la extensión SNI. El valor de authenticationType debe ser CUSTOM_AUTH_X509 y el valor de applicationProtocol puede ser SECURE_MQTT o HTTPS.

Definición del tipo de autenticación y el protocolo de aplicación en una configuración de dominio (CLI)

Si no tiene una configuración de dominio, utilice el comando create-domain-configuration para crear una. El valor de authenticationType debe ser CUSTOM_AUTH_X509 y el valor de applicationProtocol puede ser SECURE_MQTT o HTTPS.

aws iot create-domain-configuration \ --domain-configuration-name domainConfigurationName \ --authentication-type CUSTOM_AUTH_X509 \ --application-protocol SECURE_MQTT \ --authorizer-config '{ "defaultAuthorizerName": my-custom-authorizer }'

Si ya tiene una configuración de dominio, utilice el comando update-domain-configuration para actualizar authenticationType y applicationProtocol, si es necesario. Tenga en cuenta que no puede cambiar el tipo o el protocolo de autenticación en el punto de conexión predeterminado (iot:Data-ATS).

aws iot update-domain-configuration \ --domain-configuration-name domainConfigurationName \ --authentication-type CUSTOM_AUTH_X509 \ --application-protocol SECURE_MQTT \ --authorizer-config '{ "defaultAuthorizerName": my-custom-authorizer }'
domain-configuration-name

Es el nombre de la configuración del dominio.

authentication-type

Es el tipo de autenticación de la configuración del dominio. Para obtener más información, consulte Choosing an authentication type.

application-protocol

Es el protocolo de aplicación con el que los dispositivos se comunican con AWS IoT Core. Para obtener más información, consulte Choosing an application protocol.

--authorizer-config

Es un objeto que especifica la configuración del autorizador en una configuración de dominio.

defaultAuthorizerName

Es el nombre del autorizador para una configuración de dominio.

Para obtener más información, consulte CreateDomainConfigurationy UpdateDomainConfigurationdesde la referencia de la AWS IoT API. Para obtener más información sobre la configuración de dominios, consulte Domain configurations.