

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 y autorización personalizada
<a name="custom-authentication"></a>

 AWS IoT Core le permite definir autorizadores personalizados para que pueda gestionar la autenticación y la autorización de sus propios clientes. Esto resulta útil cuando necesita utilizar mecanismos de autenticación distintos de los que son compatibles de AWS IoT Core forma nativa. (Para obtener más información sobre los mecanismos compatibles de forma nativa, consulte [Autenticación del cliente](client-authentication.md)).  

 Por ejemplo, si va a migrar los dispositivos existentes sobre el terreno AWS IoT Core y estos dispositivos utilizan un token de portador personalizado o un nombre de usuario y una contraseña de MQTT para autenticarse, puede migrarlos a ellos AWS IoT Core sin tener que proporcionarles nuevas identidades. Puede utilizar la autenticación personalizada con cualquiera de los protocolos de comunicación compatibles. AWS IoT Core Para obtener más información acerca de los protocolos compatibles con AWS IoT Core , consulte [Protocolos de comunicación de dispositivos](protocols.md). 

**Topics**
+ [Comprender el flujo de trabajo de autenticación personalizada](custom-authorizer.md)
+ [Creación y administración de autorizadores personalizados (CLI)](config-custom-auth.md)
+ [Autenticación personalizada con certificados de cliente X.509](custom-auth-509cert.md)
+ [Conectarse a AWS IoT Core mediante una autenticación personalizada](custom-auth.md)
+ [Resolución de problemas de sus autorizadores](custom-auth-troubleshooting.md)

# Comprender el flujo de trabajo de autenticación personalizada
<a name="custom-authorizer"></a>

La autenticación personalizada le permite definir cómo autenticar y autorizar a los clientes mediante [recursos de autorizador](https://docs.aws.amazon.com/iot/latest/apireference/API_AuthorizerDescription.html).  Cada autorizador contiene una referencia a una función de Lambda administrada por el cliente, una clave pública opcional para validar las credenciales del dispositivo e información de configuración adicional. El siguiente diagrama ilustra el flujo de trabajo de autorización para la autenticación personalizada en AWS IoT Core.

![\[Flujo de trabajo de autorización personalizado para la autenticación personalizada en AWS IoT Core.\]](http://docs.aws.amazon.com/es_es/iot/latest/developerguide/images/custom-authentication.png)


## AWS IoT Core flujo de trabajo personalizado de autenticación y autorización
<a name="custom-authentication-workflow"></a>

En la siguiente lista se explica cada paso del flujo de trabajo de autenticación y autorización personalizada.

1. Un dispositivo se conecta al punto final de AWS IoT Core datos de un cliente mediante uno de los dispositivos compatibles[Protocolos de comunicación de dispositivos](protocols.md). El dispositivo pasa las credenciales a los campos de cabecera o a los parámetros de consulta de la solicitud (para los protocolos HTTP Publish o MQTT a través de WebSockets protocolos), o al campo de nombre de usuario y contraseña del mensaje MQTT CONNECT (para MQTT y MQTT a través de protocolos). WebSockets 

1. AWS IoT Core comprueba una de estas dos condiciones:
   + La solicitud entrante especifica un autorizador.
   + El punto final de AWS IoT Core datos que recibe la solicitud tiene un autorizador predeterminado configurado para ello.

   Si AWS IoT Core encuentra un autorizador de alguna de estas formas, AWS IoT Core activa la función Lambda asociada al autorizador.

1.  (Opcional) Si ha activado la firma por token, AWS IoT Core valida la firma de la solicitud mediante la clave pública almacenada en el autorizador antes de activar la función Lambda. Si se produce un error en la validación, AWS IoT Core detiene la solicitud sin invocar la función de Lambda.  

1. La función de Lambda recibe las credenciales y los metadatos de conexión de la solicitud y toma una decisión de autenticación.

1. La función Lambda devuelve los resultados de la decisión de autenticación y un documento de AWS IoT Core política que especifica qué acciones están permitidas en la conexión. La función Lambda también devuelve información que especifica la frecuencia con la que se AWS IoT Core revalidan las credenciales de la solicitud mediante la invocación de la función Lambda.

1. AWS IoT Core evalúa la actividad de la conexión con la política que ha recibido de la función Lambda.

1. Después de establecer la conexión e invocar inicialmente al autorizador personalizado de Lambda, la siguiente invocación se puede retrasar hasta cinco minutos en las conexiones inactivas sin ninguna operación de MQTT. A continuación, las invocaciones posteriores seguirán el intervalo de actualización de su autorizador de Lambda personalizado. Este enfoque puede evitar invocaciones excesivas que podrían superar el límite de simultaneidad de Lambda de su empresa. Cuenta de AWS

## Consideraciones de escalado
<a name="custom-authentication-scaling"></a>

 Como una función de Lambda gestiona la autenticación y la autorización de su autorizador, está sujeta a los límites de precios y servicios de Lambda, como la tasa de ejecución simultánea. Para obtener más información, consulte [Precios de Lambda](https://aws.amazon.com/lambda/pricing/). Puede administrar la carga de la función de Lambda ajustando los parámetros `refreshAfterInSeconds` y `disconnectAfterInSeconds` de la respuesta de la función de Lambda. Para obtener más información acerca del contenido de la respuesta de una función de Lambda, consulte [Definición de la función de Lambda](custom-auth-lambda.md).

**nota**  
Si deja habilitada la firma, puede evitar que clientes no reconocidos activen su Lambda de forma excesiva. Tenga esto en cuenta antes de deshabilitar el inicio de sesión en su autorizador.

**nota**  
El límite de tiempo de espera de la función de Lambda para el autorizador personalizado es de 5 segundos.

# Creación y administración de autorizadores personalizados (CLI)
<a name="config-custom-auth"></a>

AWS IoT Core implementa esquemas de autenticación y autorización personalizados mediante autorizadores personalizados. Un autorizador personalizado es un AWS IoT Core recurso que le brinda la flexibilidad de definir e implementar las reglas y políticas en función de sus requisitos específicos. Para crear un autorizador personalizado con step-by-step instrucciones, consulte el [tutorial: Creación de un autorizador personalizado](https://docs.aws.amazon.com//iot/latest/developerguide/custom-auth-tutorial.html) para. AWS IoT Core

Cada autorizador está formado por los siguientes componentes: 
+  *Nombre*: cadena única definida por el usuario que identifica al autorizador.
+  *ARN de la función de Lambda*: el nombre de recurso de Amazon (ARN) de la función de Lambda que implementa la lógica de autorización y autenticación.  
+  *Nombre de la clave del token*: el nombre de la clave que se utiliza para extraer el token de los encabezados HTTP, los parámetros de consulta o el nombre de usuario de MQTT CONNECT con el fin de realizar la validación de la firma. Este valor es obligatorio si la firma está habilitada en el autorizador. 
+  *Indicador de deshabilitación de firma (opcional)*: valor booleano que especifica si se debe deshabilitar el requisito de firma en las credenciales. Esto resulta útil en situaciones en las que no tiene sentido firmar las credenciales, como los esquemas de autenticación que utilizan el nombre de usuario y la contraseña de MQTT. El valor predeterminado es `false`, por lo que la firma está habilitada de forma predeterminada. 
+  *Clave pública de firma del token*: la clave pública que AWS IoT Core utiliza para validar la firma del token. Su longitud mínima es de 2048 bits. Este valor es obligatorio si la firma está habilitada en el autorizador.  

Lambda cobra por el número de veces que se ejecuta la función de Lambda y por el tiempo que tarda en ejecutarse el código de la función. Para obtener más información acerca de los precios de Lambda, consulte [Precios de Lambda](https://aws.amazon.com/lambda/pricing/). Para obtener más información acerca de la creación de funciones de Lambda, consulte la [Guía para desarrolladores de Lambda](https://docs.aws.amazon.com/lambda/latest/dg/).

**nota**  
Si deja habilitada la firma, puede evitar que clientes no reconocidos activen su Lambda de forma excesiva. Tenga esto en cuenta antes de deshabilitar el inicio de sesión en su autorizador.

**nota**  
El límite de tiempo de espera de la función de Lambda para el autorizador personalizado es de 5 segundos.

**Topics**
+ [Definición de la función de Lambda](custom-auth-lambda.md)
+ [Creación de un autorizador](custom-auth-create-authorizer.md)
+ [Autorizar la invocación AWS IoT de la función Lambda](custom-auth-authorize.md)
+ [Probar los autorizadores](custom-auth-testing.md)
+ [Administración de puntos de conexión](custom-auth-manage.md)

# Definición de la función de Lambda
<a name="custom-auth-lambda"></a>

 Cuando AWS IoT Core invoca al autorizador, activa la Lambda asociada al autorizador con un evento que contiene el siguiente objeto JSON. El objeto JSON de ejemplo contiene todos los campos posibles. No se incluye ningún campo que no sea relevante para la solicitud de conexión.

```
{
    "token" :"aToken",
    "signatureVerified": Boolean, // Indicates whether the device gateway has validated the signature.
    "protocols": ["tls", "http", "mqtt"], // Indicates which protocols to expect for the request.
    "protocolData": {
        "tls" : {
            "serverName": "serverName" // The server name indication (SNI) host_name string.
        },
        "http": {
            "headers": {
                "#{name}": "#{value}"
            },
            "queryString": "?#{name}=#{value}"
        },
        "mqtt": {
            "username": "myUserName",
            "password": "myPassword", // A base64-encoded string.
            "clientId": "myClientId" // Included in the event only when the device sends the value.
        }
    },
    "connectionMetadata": {
        "id": UUID // The connection ID. You can use this for logging.
    },
}
```

 La función de Lambda debe usar esta información para autenticar la conexión entrante y decidir qué acciones se permiten en la conexión. La función debe enviar una respuesta que contenga los siguientes valores. 
+  `isAuthenticated`: un valor booleano que indica si la solicitud se ha autenticado.
+  `principalId`: 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 entre 1 y 128 caracteres, y debe coincidir con este patrón de expresión regular (regex): `([a-zA-Z0-9]){1,128}`. No se permite el uso de caracteres especiales que no sean alfanuméricos con el in. `principalId` AWS IoT Core Consulte la documentación de otros AWS servicios si se permiten caracteres especiales no alfanuméricos para el. `principalId`
+  `policyDocuments`: Una lista de documentos de políticas con formato JSON Para obtener más información sobre la creación de AWS IoT Core políticas, consulte. AWS IoT Core [AWS IoT Core políticas](iot-policies.md) 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.
+  `disconnectAfterInSeconds`: un entero que especifica la duración máxima (en segundos) de la conexión a la puerta de enlace de AWS IoT Core . El valor mínimo es de 300 segundos y el máximo es de 86 400 segundos. El valor predeterminado es 86 400.
**nota**  
El valor de `disconnectAfterInSeconds` (devuelto por la función de Lambda) se determina cuando se establece la conexión. Este valor no se puede modificar durante las siguientes invocaciones de Lambda de actualización de políticas.
+  `refreshAfterInSeconds`: un entero que especifica el intervalo entre las actualizaciones de la política. Cuando pasa este intervalo, AWS IoT Core invoca la función de 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. 

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

 **\$1 "isAuthenticated":true, //A Boolean that determines whether client can connect. "principalId": "xxxxxxxx",  //A string that identifies the connection in logs. "disconnectAfterInSeconds": 86400,  "refreshAfterInSeconds": 300,   "policyDocuments": [       \$1         "Version": "2012-10-17",         "Statement": [            \$1               "Action": "iot:Publish",               "Effect": "Allow",               "Resource": "arn:aws:iot:us-east-1:<your\$1aws\$1account\$1id>:topic/customauthtesting"             \$1          ]        \$1     ] \$1**

 El `policyDocument` valor debe contener un documento de política válido AWS IoT Core . Para obtener más información sobre AWS IoT Core las políticas, consulte[AWS IoT Core políticas](iot-policies.md). En MQTT sobre TLS y MQTT sobre WebSockets conexiones, almacena en AWS IoT Core caché esta política durante el intervalo especificado en el valor del campo. `refreshAfterInSeconds` En el caso de las conexiones HTTP, se invoca la función de Lambda para cada solicitud de autorización, a menos que su dispositivo utilice conexiones HTTP persistentes (también denominadas HTTP keep-alive o reutilización de conexiones HTTP). Puede optar por habilitar el almacenamiento en caché al configurar el autorizador. Durante este intervalo, AWS IoT Core autoriza las acciones en una conexión establecida en contra de esta política en caché sin volver a activar la función Lambda. Si se producen errores durante la autenticación personalizada, AWS IoT Core finaliza la conexión. AWS IoT Core también termina la conexión si ha estado abierta durante más tiempo que el valor especificado en el `disconnectAfterInSeconds` parámetro. 

 A continuación, se JavaScript incluye un ejemplo de función Lambda de Node.js que busca una contraseña en el mensaje de MQTT Connect con un valor `test` de y devuelve una política que concede permiso AWS IoT Core para conectarse con un cliente `myClientName` denominado y publicar en un tema que contenga el mismo nombre de cliente. Si no encuentra la contraseña esperada, devuelve una política que deniega esas dos acciones. 

```
// A simple Lambda function for an authorizer. It demonstrates 
// how to parse an MQTT password and generate a response.

exports.handler = function(event, context, callback) { 
    var uname = event.protocolData.mqtt.username;
    var pwd = event.protocolData.mqtt.password;
    var buff = new Buffer(pwd, 'base64');
    var passwd = buff.toString('ascii');
    switch (passwd) { 
        case 'test': 
            callback(null, generateAuthResponse(passwd, 'Allow')); 
            break;
        default: 
            callback(null, generateAuthResponse(passwd, 'Deny'));  
    }
};

// Helper function to generate the authorization response.
var generateAuthResponse = function(token, effect) { 
    var authResponse = {}; 
    authResponse.isAuthenticated = true; 
    authResponse.principalId = 'TEST123'; 
    
    var policyDocument = {}; 
    policyDocument.Version = '2012-10-17';		 	 	 
    policyDocument.Statement = []; 
    var publishStatement = {}; 
    var connectStatement = {};
    connectStatement.Action = ["iot:Connect"];
    connectStatement.Effect = effect;
    connectStatement.Resource = ["arn:aws:iot:us-east-1:123456789012:client/myClientName"];
    publishStatement.Action = ["iot:Publish"]; 
    publishStatement.Effect = effect; 
    publishStatement.Resource = ["arn:aws:iot:us-east-1:123456789012:topic/telemetry/myClientName"]; 
    policyDocument.Statement[0] = connectStatement;
    policyDocument.Statement[1] = publishStatement; 
    authResponse.policyDocuments = [policyDocument]; 
    authResponse.disconnectAfterInSeconds = 3600; 
    authResponse.refreshAfterInSeconds = 300;
    
    return authResponse; 
}
```

 La función de Lambda anterior devuelve el siguiente JSON cuando recibe la contraseña esperada de `test` en el mensaje MQTT Connect. Los valores de las propiedades `password` y `principalId` serán los valores del mensaje MQTT Connect.

```
{
  "password": "password",
  "isAuthenticated": true,
  "principalId": "principalId",
  "policyDocuments": [
    {
      "Version": "2012-10-17",		 	 	 
      "Statement": [
        {
          "Action": "iot:Connect",
          "Effect": "Allow",
          "Resource": "*"
        },
        {
          "Action": "iot:Publish",
          "Effect": "Allow",
          "Resource": "arn:aws:iot:region:accountId:topic/telemetry/${iot:ClientId}"
        },
        {
          "Action": "iot:Subscribe",
          "Effect": "Allow",
          "Resource": "arn:aws:iot:region:accountId:topicfilter/telemetry/${iot:ClientId}"
        },
        {
          "Action": "iot:Receive",
          "Effect": "Allow",
          "Resource": "arn:aws:iot:region:accountId:topic/telemetry/${iot:ClientId}"
        }
      ]
    }
  ],
  "disconnectAfterInSeconds": 3600,
  "refreshAfterInSeconds": 300
}
```

# Creación de un autorizador
<a name="custom-auth-create-authorizer"></a>

 [Puede crear un autorizador mediante la API. CreateAuthorizer](https://docs.aws.amazon.com/iot/latest/apireference/API_CreateAuthorizer.html) En el siguiente ejemplo, se describe el comando. 

```
aws iot create-authorizer
--authorizer-name MyAuthorizer
--authorizer-function-arn arn:aws:lambda:us-west-2:<account_id>:function:MyAuthorizerFunction  //The ARN of the Lambda function.
[--token-key-name MyAuthorizerToken //The key used to extract the token from headers.
[--token-signing-public-keys FirstKey=
 "-----BEGIN PUBLIC KEY-----
  [...insert your public key here...] 
  -----END PUBLIC KEY-----"
[--status ACTIVE]
[--tags <value>]
[--signing-disabled | --no-signing-disabled]
```

Puede utilizar el parámetro `signing-disabled` para deshabilitar la validación de firmas en cada invocación de su autorizador. Le recomendamos encarecidamente que no deshabilite la firma a menos que sea necesario. La validación de firmas lo protege contra las invocaciones excesivas de su función de Lambda desde dispositivos desconocidos. No se puede actualizar el estado `signing-disabled` de un autorizador una vez creado. Para cambiar este comportamiento, debe crear otro autorizador personalizado con un valor de parámetro `signing-disabled` diferente. 

Los valores de los parámetros `tokenKeyName` y `tokenSigningPublicKeys` son opcionales si se deshabilita la firma. Son valores obligatorios si la firma está habilitada. 

Tras crear la función Lambda y el autorizador personalizado, debe conceder explícitamente al AWS IoT Core servicio permiso para invocar la función en su nombre. Puede hacerlo con el siguiente comando. 

**nota**  
Es posible que el punto de conexión predeterminado de IoT no admita el uso de autorizadores personalizados con funciones de Lambda. En su lugar, puede usar las configuraciones de dominio para definir un nuevo punto de conexión y, a continuación, especificarlo para el autorizador personalizado.

```
aws lambda add-permission --function-name <lambda_function_name>
--principal iot.amazonaws.com --source-arn <authorizer_arn>
--statement-id Id-123 --action "lambda:InvokeFunction"
```

# Autorizar la invocación AWS IoT de la función Lambda
<a name="custom-auth-authorize"></a>

En esta sección, concederá el permiso del recurso de autorizador personalizado que acaba de crear para ejecutar la función de Lambda. Para conceder el permiso, puede utilizar el comando de la CLI [add-permission](https://docs.aws.amazon.com//cli/latest/reference/lambda/add-permission.html).

**Conceda permiso a su función Lambda mediante el AWS CLI**

1. Después de insertar sus valores, introduzca el siguiente comando. Tenga en cuenta que el valor `statement-id` debe ser único. Reemplace `Id-1234` por el valor exacto que tiene; de lo contrario, podría producirse un error `ResourceConflictException`.

   ```
   aws lambda add-permission  \
   --function-name "custom-auth-function" \
   --principal "iot.amazonaws.com" \
   --action "lambda:InvokeFunction" \
   --statement-id "Id-1234" \
   --source-arn authorizerArn
   ```

1. Si el comando tiene éxito, devuelve una declaración de permiso, como la de este ejemplo. Puede continuar con la siguiente sección para probar el autorizador personalizado.

   ```
   {
       "Statement": "{\"Sid\":\"Id-1234\",\"Effect\":\"Allow\",\"Principal\":{\"Service\":\"iot.amazonaws.com\"},\"Action\":\"lambda:InvokeFunction\",\"Resource\":\"arn:aws:lambda:Region:57EXAMPLE833:function:custom-auth-function\",\"Condition\":{\"ArnLike\":{\"AWS:SourceArn\":\"arn:aws:lambda:Region:57EXAMPLE833:function:custom-auth-function\"}}}"
   }
   ```

   Si el comando no tiene éxito, devuelve un error, como en este ejemplo. Tendrá que revisar y corregir el error antes de continuar.

   ```
   An error occurred (AccessDeniedException) when calling the AddPermission operation: User: arn:aws:iam::57EXAMPLE833:user/EXAMPLE-1 is not authorized to perform: lambda:AddPer
   mission on resource: arn:aws:lambda:Region:57EXAMPLE833:function:custom-auth-function
   ```

# Probar los autorizadores
<a name="custom-auth-testing"></a>

 Puede usar la [TestInvokeAuthorizer](https://docs.aws.amazon.com/iot/latest/apireference/API_TestInvokeAuthorizer.html)API para probar los valores de invocación y retorno de su autorizador. Esta API te permite especificar los metadatos del protocolo y probar la validación de la firma en tu autorizador.

En las siguientes pestañas se muestra cómo utilizarla AWS CLI para probar el autorizador.

------
#### [ Unix-like ]

```
aws iot test-invoke-authorizer --authorizer-name NAME_OF_AUTHORIZER \
--token TOKEN_VALUE --token-signature TOKEN_SIGNATURE
```

------
#### [ Windows CMD ]

```
aws iot test-invoke-authorizer --authorizer-name NAME_OF_AUTHORIZER ^
--token TOKEN_VALUE --token-signature TOKEN_SIGNATURE
```

------
#### [ Windows PowerShell ]

```
aws iot test-invoke-authorizer --authorizer-name NAME_OF_AUTHORIZER `
--token TOKEN_VALUE --token-signature TOKEN_SIGNATURE
```

------

El valor del parámetro `token-signature` es el token firmado. Para obtener información sobre cómo obtener este valor, consulte [Firmar el token](custom-auth.md#custom-auth-token-signature).

Si el autorizador utiliza un nombre de usuario y una contraseña, puede transmitir esta información mediante el parámetro `--mqtt-context`. Las siguientes pestañas muestran cómo usar la API `TestInvokeAuthorizer` para enviar un objeto JSON que contenga un nombre de usuario, una contraseña y un nombre de cliente a su autorizador personalizado.

------
#### [ Unix-like ]

```
aws iot test-invoke-authorizer --authorizer-name NAME_OF_AUTHORIZER  \
--mqtt-context '{"username": "USER_NAME", "password": "dGVzdA==", "clientId":"CLIENT_NAME"}'
```

------
#### [ Windows CMD ]

```
aws iot test-invoke-authorizer --authorizer-name NAME_OF_AUTHORIZER  ^
--mqtt-context '{"username": "USER_NAME", "password": "dGVzdA==", "clientId":"CLIENT_NAME"}'
```

------
#### [ Windows PowerShell ]

```
aws iot test-invoke-authorizer --authorizer-name NAME_OF_AUTHORIZER  `
--mqtt-context '{"username": "USER_NAME", "password": "dGVzdA==", "clientId":"CLIENT_NAME"}'
```

------

Los datos de usuario deben estar codificados en base64. El siguiente ejemplo muestra cómo codificar una contraseña en un entorno similar a Unix.

```
echo -n PASSWORD | base64
```

# Administración de puntos de conexión
<a name="custom-auth-manage"></a>

 Puede administrar sus autorizadores mediante lo siguiente. APIs 
+ [ListAuthorizers](https://docs.aws.amazon.com/iot/latest/apireference/API_ListAuthorizers.html): Muestra todos los autorizadores de tu cuenta.
+  [DescribeAuthorizer](https://docs.aws.amazon.com/iot/latest/apireference/API_DescribeAuthorizer.html): Muestra las propiedades del autorizador especificado. Estos valores incluyen la fecha de creación, la fecha de la última modificación y otros atributos.
+ [SetDefaultAuthorizer](https://docs.aws.amazon.com/iot/latest/apireference/API_SetDefaultAuthorizer.html): Especifica el autorizador predeterminado para los puntos finales de AWS IoT Core datos. AWS IoT Core utiliza este autorizador si un dispositivo no transfiere AWS IoT Core las credenciales y no especifica un autorizador. Para obtener más información sobre el uso de AWS IoT Core credenciales, consulte. [Autenticación del cliente](client-authentication.md)
+ [UpdateAuthorizer](https://docs.aws.amazon.com/iot/latest/apireference/API_UpdateAuthorizer.html): cambia el estado, el nombre de la clave del token o las claves públicas del autorizador especificado.
+  [DeleteAuthorizer](https://docs.aws.amazon.com/iot/latest/apireference/API_DeleteAuthorizer.html): elimina el autorizador especificado. 

**nota**  
 No se puede actualizar el requisito de firma de un autorizador. Esto significa que no es posible deshabilitar el inicio de sesión en un autorizador existente que lo requiera. Tampoco se puede requerir el inicio de sesión en un autorizador existente que no lo requiera. 

# Autenticación personalizada con certificados de cliente X.509
<a name="custom-auth-509cert"></a>

Al conectar dispositivos a AWS IoT Core, tiene varios [tipos de autenticación disponibles](protocols.md#connection-protocol-auth-mode). Puede usar [certificados de cliente X.509](https://docs.aws.amazon.com//iot/latest/developerguide/x509-client-certs.html), que se pueden usar para autenticar las conexiones de clientes y dispositivos, o definir [autorizadores personalizados](https://docs.aws.amazon.com//iot/latest/developerguide/custom-authentication.html) 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](https://docs.aws.amazon.com//iot/latest/developerguide/mqtt.html).](https://docs.aws.amazon.com//iot/latest/developerguide/http.html) 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](https://docs.aws.amazon.com//iot/latest/developerguide/protocols.html).

**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](iot-custom-endpoints-configurable.md). Además, los clientes deben proporcionar la extensión de [indicación del nombre del servidor (SNI)](https://www.rfc-editor.org/rfc/rfc3546#section-3.1) al conectarse a. AWS IoT Core

**Topics**
+ [Paso 1: registre sus certificados de cliente X.509 con AWS IoT Core](#custom-auth-509cert-client)
+ [Paso 2: creación de una función de Lambda](#custom-auth-509cert-lambda)
+ [Paso 3: creación de un autorizador personalizado](#custom-auth-509cert-authorizer)
+ [Paso 4: definición del tipo de autenticación y el protocolo de aplicación en una configuración de dominio](#custom-auth-509cert-domainconfig)

## Paso 1: registre sus certificados de cliente X.509 con AWS IoT Core
<a name="custom-auth-509cert-client"></a>

Si aún no lo ha hecho, registre y active sus [certificados de cliente X.509](https://docs.aws.amazon.com//iot/latest/developerguide/x509-client-certs.html) 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](https://docs.aws.amazon.com//iot/latest/developerguide/device-certs-create.html). Estos certificados de cliente se registrarán automáticamente en AWS IoT Core.

1. Si [crea sus propios certificados de cliente](https://docs.aws.amazon.com//iot/latest/developerguide/device-certs-your-own.html), siga [estas instrucciones para registrarlos AWS IoT Core](https://docs.aws.amazon.com//iot/latest/developerguide/register-device-cert.html).

1. Siga [estas instrucciones](https://docs.aws.amazon.com//iot/latest/developerguide/activate-or-deactivate-device-cert.html) para activar sus certificados de cliente.

## Paso 2: creación de una función de Lambda
<a name="custom-auth-509cert-lambda"></a>

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
<a name="custom-auth-509cert-event"></a>

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)](https://www.rfc-editor.org/rfc/rfc3546#section-3.1). AWS IoT Core requiere que los dispositivos envíen la [extensión SNI](https://www.rfc-editor.org/rfc/rfc3546#section-3.1) 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 incluye 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](https://docs.aws.amazon.com//iot/latest/apireference/API_Certificate.html).

### Ejemplo de respuesta de la función de Lambda
<a name="custom-auth-509cert-response"></a>

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](https://docs.aws.amazon.com//iot/latest/developerguide/thing-policy-variables.html) y [variables de política de certificados](https://docs.aws.amazon.com//iot/latest/developerguide/cert-policy-variables.html). 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.](https://docs.aws.amazon.com//iot/latest/developerguide/iot-policies.html)

`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 name="custom-auth-509cert-js-example"></a>

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](https://docs.aws.amazon.com//iot/latest/developerguide/config-custom-auth.html#custom-auth-lambda).

```
{
	"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
<a name="custom-auth-509cert-authorizer"></a>

Tras [definir la función de Lambda](#custom-auth-509cert-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](https://docs.aws.amazon.com//iot/latest/developerguide/custom-auth-tutorial.html#custom-auth-tutorial-authorizer). Para obtener más información, consulte [Creating an authorizer](https://docs.aws.amazon.com//iot/latest/developerguide/config-custom-auth.html). 

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](custom-auth-authorize.md).

## Paso 4: definición del tipo de autenticación y el protocolo de aplicación en una configuración de dominio
<a name="custom-auth-509cert-domainconfig"></a>

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)
<a name="custom-auth-509cert-cli"></a>

Si no tiene una configuración de dominio, utilice el comando [https://docs.aws.amazon.com//cli/latest/reference/iot/create-domain-configuration.html](https://docs.aws.amazon.com//cli/latest/reference/iot/create-domain-configuration.html) 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 [https://docs.aws.amazon.com//cli/latest/reference/iot/update-domain-configuration.html](https://docs.aws.amazon.com//cli/latest/reference/iot/update-domain-configuration.html) 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](protocols.md#connection-protocol-auth-mode).

`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](protocols.md#protocol-selection).

`--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 [CreateDomainConfiguration](https://docs.aws.amazon.com//iot/latest/apireference/API_CreateDomainConfiguration.html)y [UpdateDomainConfiguration](https://docs.aws.amazon.com//iot/latest/apireference/API_UpdateDomainConfiguration.html)desde la referencia de la AWS IoT API.* Para obtener más información sobre la configuración de dominios, consulte [Domain configurations](https://docs.aws.amazon.com//iot/latest/developerguide/iot-custom-endpoints-configurable.html).

# Conectarse a AWS IoT Core mediante una autenticación personalizada
<a name="custom-auth"></a>

 Los dispositivos se pueden conectar AWS IoT Core mediante una autenticación personalizada con cualquier protocolo AWS IoT Core compatible con la mensajería del dispositivo. Para obtener más información acerca de los protocolos de comunicación compatibles, consulte [Protocolos de comunicación de dispositivos](protocols.md).  Los datos de conexión que se transfieren a la función de Lambda de su autorizador dependen del protocolo que utilice. Para obtener más información acerca de cómo crear la función de Lambda de su autorizador, consulte [Definición de la función de Lambda](custom-auth-lambda.md). En las secciones siguientes se explica cómo conectarse para autenticarse mediante cada protocolo compatible.

## HTTPS
<a name="custom-auth-http"></a>

Los dispositivos a los que se envían datos AWS IoT Core mediante la [API de publicación HTTP](https://docs.aws.amazon.com/iot/latest/apireference/API_iotdata_Publish.html) pueden transferir las credenciales a través de los encabezados de las solicitudes o de los parámetros de consulta en sus solicitudes HTTP POST. Los dispositivos pueden especificar un autorizador para invocarlo mediante el encabezado `x-amz-customauthorizer-name` o el parámetro de consulta. Si tiene habilitada la firma por token en su autorizador, debe pasar `token-key-name` y `x-amz-customauthorizer-signature` en los encabezados de las solicitudes o en los parámetros de consulta. Tenga en cuenta que el `token-signature` valor debe estar codificado en una URL cuando se utilice JavaScript desde el navegador.

**nota**  
El autorizador del cliente para el protocolo HTTPS solo admite operaciones de publicación. Para obtener más información acerca del protocolo HTTP, consulte [Protocolos de comunicación de dispositivos](protocols.md).

Los siguientes ejemplos de solicitudes muestran cómo se transfieren estos parámetros tanto en los encabezados de las solicitudes como en los parámetros de consulta. 

```
//Passing credentials via headers
POST /topics/topic?qos=qos HTTP/1.1
Host: your-endpoint 
x-amz-customauthorizer-signature: token-signature
token-key-name: token-value 
x-amz-customauthorizer-name: authorizer-name

//Passing credentials via query parameters
POST /topics/topic?qos=qos&x-amz-customauthorizer-signature=token-signature&token-key-name=token-value HTTP/1.1
```

## MQTT
<a name="custom-auth-mqtt"></a>

 Los dispositivos que se conectan AWS IoT Core mediante una conexión MQTT pueden pasar las credenciales a través de los `password` campos `username` y de los mensajes MQTT. De forma opcional, el valor de `username` también puede contener una cadena de consulta que transfiere valores adicionales (como un token, una firma y el nombre del autorizador) a su autorizador. Puede utilizar esta cadena de consulta si desea utilizar un esquema de autenticación basado en símbolos en lugar de valores `username` y `password`.  

**nota**  
 Los datos del campo de contraseña están codificados en base64 mediante. AWS IoT Core Debe descodificarlos con la función de Lambda. 

 El siguiente ejemplo contiene una cadena `username` con parámetros adicionales que especifican un token y una firma.  

```
username?x-amz-customauthorizer-name=authorizer-name&x-amz-customauthorizer-signature=token-signature&token-key-name=token-value
```

Para invocar un autorizador, los dispositivos que se conecten AWS IoT Core mediante MQTT y la autenticación personalizada deben conectarse al puerto 443. También deben pasar la extensión TLS de negociación de protocolos de capa de aplicación (ALPN) con un valor de `mqtt` y la extensión de indicación del nombre del servidor (SNI) con el nombre de host de su terminal de datos. AWS IoT Core Para evitar posibles errores, el valor de `x-amz-customauthorizer-signature` debe estar codificado como URL. También recomendamos encarecidamente que los valores de `x-amz-customauthorizer-name` y `token-key-name` estén codificados como URL. Para obtener más información acerca de estos valores, consulte[Protocolos de comunicación de dispositivos](protocols.md). V2 [SDK de dispositivos, SDK para móviles y cliente de dispositivo de AWS IoT](iot-sdks.md) puede configurar estas dos extensiones. 

## MQTT ha terminado WebSockets
<a name="custom-auth-websockets"></a>

 Los dispositivos que se conectan AWS IoT Core mediante MQTT Over WebSockets pueden transferir las credenciales de una de las dos maneras siguientes. 
+ Mediante los encabezados de las solicitudes o los parámetros de consulta de la solicitud HTTP UPGRADE para establecer la WebSockets conexión.
+ A través de los campos `username` y `password` del mensaje MQTT CONNECT.

 Si pasa las credenciales a través del mensaje de conexión de MQTT, se requieren las extensiones TLS ALPN y SNI. Para obtener más información, consulte [MQTT](#custom-auth-mqtt). El siguiente ejemplo ilustra cómo pasar credenciales a través de la solicitud de actualización de HTTP. 

```
GET /mqtt HTTP/1.1
Host: your-endpoint 
Upgrade: WebSocket 
Connection: Upgrade 
x-amz-customauthorizer-signature: token-signature
token-key-name: token-value 
sec-WebSocket-Key: any random base64 value 
sec-websocket-protocol: mqtt 
sec-WebSocket-Version: websocket version
```

## Firmar el token
<a name="custom-auth-token-signature"></a>

Debe firmar el token con la clave privada del par de claves pública-privada que utilizó en la llamada a `create-authorizer`. Los siguientes ejemplos muestran cómo crear la firma simbólica mediante un comando similar a Unix y. JavaScript Utilizan el algoritmo hash SHA-256 para codificar la firma.

------
#### [ Command line ]

```
echo -n TOKEN_VALUE | openssl dgst -sha256 -sign PEM encoded RSA private key | openssl base64
```

------
#### [ JavaScript ]

```
const crypto = require('crypto')

const key = "PEM encoded RSA private key"

const k = crypto.createPrivateKey(key)
let sign = crypto.createSign('SHA256')
sign.write(t)
sign.end()
const s = sign.sign(k, 'base64')
```

------

# Resolución de problemas de sus autorizadores
<a name="custom-auth-troubleshooting"></a>

 En este tema se explican los problemas más comunes que pueden causar problemas en los flujos de trabajo de autenticación personalizada y los pasos para resolverlos. **Para solucionar los problemas de forma más eficaz, habilite CloudWatch los registros AWS IoT Core y establezca el nivel de registro en DEBUG.** Puede habilitar CloudWatch los registros en la AWS IoT Core consola () [https://console.aws.amazon.com/iot/](https://console.aws.amazon.com/iot/). Para obtener más información acerca de cómo habilitar y configurar registros de AWS IoT Core, consulte [Configure el AWS IoT registro](configure-logging.md). 

**nota**  
Si deja el nivel de registro en **DEBUG** durante períodos prolongados, es CloudWatch posible que se almacenen grandes cantidades de datos de registro. Esto puede aumentar sus CloudWatch cargos. Considere la posibilidad de utilizar el registro basado en recursos para aumentar la verbosidad solo para los dispositivos de un grupo de objetos concreto. Para obtener más información sobre el registro basado en recursos, consulte [Configure el AWS IoT registro](configure-logging.md). Además, cuando haya terminado de solucionar problemas, reduzca el nivel de registro a un nivel menos detallado.

Antes de empezar a solucionar problemas, consulte [Comprender el flujo de trabajo de autenticación personalizada](custom-authorizer.md) para obtener una visión general del proceso de autenticación personalizada. Esto le ayudará a entender dónde buscar el origen del problema.

En este tema se analizan las dos áreas siguientes para que las investigue.
+ Cuestiones relacionadas con la función de Lambda de su autorizador.
+ Problemas relacionados con el dispositivo.

## Comprobar si hay problemas con la función de Lambda de su autorizador
<a name="custom-auth-troubleshooting-lambda"></a>

Lleve a cabo los siguientes pasos para asegurarse de que los intentos de conexión de sus dispositivos estén invocando la función de Lambda.

1. Compruebe qué función de Lambda está asociada a su autorizador.

   Puede hacerlo llamando a la [DescribeAuthorizer](https://docs.aws.amazon.com/iot/latest/apireference/API_DescribeAuthorizer.html)API o haciendo clic en el autorizador deseado en la sección **Segura** de la AWS IoT Core consola.

1. Compruebe las métricas de invocación de la función de Lambda. Para ello, siga estos pasos.

   1. Abra la AWS Lambda consola ([https://console.aws.amazon.com/lambda/](https://console.aws.amazon.com/lambda/)) y seleccione la función asociada a su autorizador.

   1. Seleccione la pestaña **Monitorizar** y consulte las métricas correspondientes al período de tiempo correspondiente a su problema.

1. Si no ve ninguna invocación, compruebe que AWS IoT Core tiene permiso para invocar la función Lambda. Si ve invocaciones, vaya directamente al siguiente paso. Lleve a cabo los siguientes pasos para comprobar que la función de Lambda tiene los permisos necesarios.

   1. Seleccione la pestaña **Permisos** para su función en la consola. AWS Lambda 

   1. Busque la sección **Política basada en recursos** en la parte inferior de la página. Si la función de Lambda tiene los permisos necesarios, la política tiene el aspecto que se muestra en el siguiente ejemplo.  
****  

      ```
      {
        "Version":"2012-10-17",		 	 	 
        "Id": "default",
        "Statement": [
          {
            "Sid": "Id123",
            "Effect": "Allow",
            "Principal": {
              "Service": "iot.amazonaws.com"
            },
            "Action": "lambda:InvokeFunction",
            "Resource": "arn:aws:lambda:us-east-1:111111111111:function:FunctionName",
            "Condition": {
              "ArnLike": {
                "AWS:SourceArn": "arn:aws:iot:us-east-1:111111111111:authorizer/AuthorizerName"
              },
              "StringEquals": {
                "AWS:SourceAccount": "111111111111"
              }
            }
          }
        ]
      }
      ```

   1. Esta política concede al AWS IoT Core director el `InvokeFunction` permiso para desempeñar sus funciones. Si no lo ves, tendrás que añadirlo mediante la [AddPermission](https://docs.aws.amazon.com/lambda/latest/dg/API_AddPermission.html)API. El siguiente ejemplo le muestra cómo hacerlo utilizando la AWS CLI.

      ```
      aws lambda add-permission --function-name FunctionName --principal iot.amazonaws.com --source-arn AuthorizerARn --statement-id Id-123 --action "lambda:InvokeFunction"
      ```

1. Si ve invocaciones, compruebe que no haya errores. Un error podría indicar que la función Lambda no gestiona correctamente el evento de conexión que se AWS IoT Core le envía.

   Para obtener información sobre cómo gestionar el evento en la función de Lambda, consulte [Definición de la función de Lambda](custom-auth-lambda.md). Puedes usar la función de prueba de la AWS Lambda consola ([https://console.aws.amazon.com/lambda/](https://console.aws.amazon.com/lambda/)) para codificar los valores de prueba de la función y asegurarte de que la función gestiona los eventos correctamente.

1. Si ve invocaciones sin errores, pero sus dispositivos no pueden conectarse (ni publicar, suscribirse ni recibir mensajes), el problema podría deberse a que la política que devuelve la función de Lambda no concede permisos para las acciones que los dispositivos están intentando realizar. Lleve a cabo los siguientes pasos para determinar si hay algún problema con la política que devuelve la función.

   1. Utilice una consulta de Amazon CloudWatch Logs Insights para escanear los registros durante un período breve y comprobar si hay errores. El siguiente ejemplo de consulta ordena los eventos por marca de tiempo y busca errores.

      ```
      display clientId, eventType, status, @timestamp | sort @timestamp desc | filter status = "Failure"    
      ```

   1. Actualice la función Lambda para registrar los datos a los que regresa AWS IoT Core y el evento que activa la función. Puede usar estos registros para inspeccionar la política que crea la función.

1. Si ve invocaciones sin errores, pero sus dispositivos no pueden conectarse (ni publicar, suscribirse ni recibir mensajes), otro motivo puede ser que la función de Lambda supere el límite de tiempo de espera. El límite de tiempo de espera de la función de Lambda para el autorizador personalizado es de 5 segundos. Puede comprobar la duración de la función en CloudWatch registros o métricas. 

## Investigar problemas con los dispositivos
<a name="custom-auth-troubleshooting-investigate"></a>

Si no encuentra problemas al invocar la función de Lambda o con la política que devuelve la función, busque problemas con los intentos de conexión de sus dispositivos. Las solicitudes de conexión mal formadas pueden provocar que AWS IoT Core no se active el autorizador. Se pueden producir problemas de conexión tanto en la capa TLS como en la de aplicación.

**Posibles problemas con la capa TLS:**
+ Los clientes deben incluir un encabezado de nombre de host (HTTP, MQTT over WebSockets) o la extensión TLS con indicación del nombre del servidor (HTTP, MQTT over WebSockets, MQTT) en todas las solicitudes de autenticación personalizadas. En ambos casos, el valor transferido debe coincidir con uno de los extremos de datos de su cuenta. AWS IoT Core Estos son los puntos de conexión que se devuelven al ejecutar los siguientes comandos de la CLI.
  + `aws iot describe-endpoint --endpoint-type iot:Data-ATS`
  + `aws iot describe-endpoint --endpoint-type iot:Data`(para puntos VeriSign finales antiguos)
+ Los dispositivos que utilizan una autenticación personalizada para las conexiones MQTT también deben pasar la extensión TLS de negociación de protocolo de capa de aplicación (ALPN) con un valor de `mqtt`.
+ La autenticación personalizada actualmente solo está disponible en el puerto 443.

**Posibles problemas en la capa de aplicación:**
+ Si la firma está habilitada (el campo `signingDisabled` es falso en su autorizador), busque los siguientes problemas de firma.
  + Asegúrese de pasar la firma simbólica en el encabezado `x-amz-customauthorizer-signature` o en un parámetro de cadena de consulta.
  + Asegúrese de que el servicio no firme un valor distinto del token.
  + Asegúrese de pasar el token al encabezado o parámetro de consulta que especificó en el campo `token-key-name` de su autorizador.
+ Asegúrese de que el nombre del autorizador que pasa en el encabezado `x-amz-customauthorizer-name` o la cadena de consulta es válido o de que ha definido un autorizador predeterminado para su cuenta.