

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

# Autenticazione e autorizzazione personalizzata
<a name="custom-authentication"></a>

 AWS IoT Core consente di definire autorizzatori personalizzati in modo da poter gestire l'autenticazione e l'autorizzazione dei client. Ciò è utile quando è necessario utilizzare meccanismi di autenticazione diversi da quelli supportati AWS IoT Core nativamente. (Per ulteriori informazioni sui meccanismi supportati in modo nativo, consulta [Autenticazione client](client-authentication.md)).  

 Ad esempio, se state migrando dispositivi esistenti sul campo verso AWS IoT Core e questi dispositivi utilizzano un token bearer personalizzato o un nome utente e una password MQTT per l'autenticazione, potete migrarli AWS IoT Core senza dover fornire loro nuove identità. È possibile utilizzare l'autenticazione personalizzata con tutti i protocolli di comunicazione supportati. AWS IoT Core Per ulteriori informazioni sui protocolli supportati da AWS IoT Core , consulta [Protocolli di dispositivo di comunicazione](protocols.md). 

**Topics**
+ [Informazioni sul flusso di lavoro di autenticazione personalizzato](custom-authorizer.md)
+ [Creazione e gestione di autorizzazioni personalizzate (CLI)](config-custom-auth.md)
+ [Autenticazione personalizzata con certificati client X.509](custom-auth-509cert.md)
+ [Connessione a AWS IoT Core tramite autenticazione personalizzata](custom-auth.md)
+ [Risoluzione dei problemi relativi agli autorizzatori](custom-auth-troubleshooting.md)

# Informazioni sul flusso di lavoro di autenticazione personalizzato
<a name="custom-authorizer"></a>

L'autenticazione personalizzata consente di definire come autenticare e autorizzare i client utilizzando le [risorse dell'autorizzatore](https://docs.aws.amazon.com/iot/latest/apireference/API_AuthorizerDescription.html).  Ogni autorizzatore contiene un riferimento a una funzione Lambda gestita dal cliente, una chiave pubblica opzionale per la convalida delle credenziali del dispositivo e informazioni di configurazione aggiuntive. Il diagramma seguente illustra il flusso di lavoro di autorizzazione per l'autenticazione personalizzata in. AWS IoT Core

![\[Flusso di lavoro di autorizzazione personalizzato per l'autenticazione personalizzata in. AWS IoT Core\]](http://docs.aws.amazon.com/it_it/iot/latest/developerguide/images/custom-authentication.png)


## AWS IoT Core flusso di lavoro di autenticazione e autorizzazione personalizzato
<a name="custom-authentication-workflow"></a>

Nell'elenco seguente viene illustrato ogni passaggio del flusso di lavoro di autenticazione e autorizzazione personalizzata.

1. Un dispositivo si connette all'endpoint di AWS IoT Core dati di un cliente utilizzando uno dei dispositivi supportati[Protocolli di dispositivo di comunicazione](protocols.md). Il dispositivo passa le credenziali nei campi di intestazione o nei parametri di query della richiesta (per i WebSockets protocolli HTTP Publish o MQTT over) o nel campo nome utente e password del messaggio MQTT CONNECT (per i protocolli MQTT e MQTT over). WebSockets 

1. AWS IoT Core verifica una delle due condizioni:
   + La richiesta in arrivo specifica un autorizzatore.
   + Per l'endpoint di AWS IoT Core dati che riceve la richiesta è configurato un autorizzatore predefinito.

   Se AWS IoT Core trova un autorizzatore in uno di questi modi, AWS IoT Core attiva la funzione Lambda associata all'autorizzatore.

1.  (Facoltativo) Se hai abilitato la firma con token, AWS IoT Core convalida la firma della richiesta utilizzando la chiave pubblica memorizzata nell'autorizzatore prima di attivare la funzione Lambda. Se la convalida non riesce, AWS IoT Core interrompe la richiesta senza invocare la funzione Lambda.  

1. La funzione Lambda riceve le credenziali e i metadati di connessione nella richiesta e prende una decisione di autenticazione.

1. La funzione Lambda restituisce i risultati della decisione di autenticazione e un documento di AWS IoT Core policy che specifica quali azioni sono consentite nella connessione. La funzione Lambda restituisce anche informazioni che specificano la frequenza di AWS IoT Core riconvalida delle credenziali nella richiesta richiamando la funzione Lambda.

1. AWS IoT Core valuta l'attività sulla connessione rispetto alla policy ricevuta dalla funzione Lambda.

1. Dopo aver stabilito la connessione e richiamato inizialmente l'autorizzatore personalizzato Lambda, la chiamata successiva può essere ritardata fino a 5 minuti su connessioni inattive senza alcuna operazione MQTT. Dopodiché, le chiamate successive seguiranno l'intervallo di aggiornamento nell'autorizzatore personalizzato Lambda. Questo approccio può prevenire invocazioni eccessive che potrebbero superare il limite di concorrenza Lambda del tuo. Account AWS

## Considerazioni sul dimensionamento
<a name="custom-authentication-scaling"></a>

 Poiché una funzione Lambda gestisce l'autenticazione e l'autorizzazione per l'autorizzatore, la funzione è soggetta ai prezzi e ai limiti del servizio Lambda, ad esempio la frequenza di esecuzione simultanea. Per ulteriori informazioni sui prezzi Lambda, consulta [Prezzi Lambda](https://aws.amazon.com/lambda/pricing/). È possibile gestire il carico sulla funzione Lambda regolando `refreshAfterInSeconds` e `disconnectAfterInSeconds` nella risposta della funzione Lambda. Per ulteriori informazioni sui contenuti della risposta della funzione Lambda, consulta [Scrittura della funzione Lambda](custom-auth-lambda.md).

**Nota**  
Se si lascia abilitata la firma, è possibile impedire l'attivazione eccessiva di Lambda da parte di client non riconosciuti. Consideralo prima di disabilitare l'accesso all'autorizzatore.

**Nota**  
Il limite di timeout della funzione Lambda per l'autorizzatore personalizzato è di 5 secondi.

# Creazione e gestione di autorizzazioni personalizzate (CLI)
<a name="config-custom-auth"></a>

AWS IoT Core implementa schemi di autenticazione e autorizzazione personalizzati utilizzando autorizzatori personalizzati. Un autorizzatore personalizzato è una AWS IoT Core risorsa che offre la flessibilità necessaria per definire e implementare le regole e le politiche in base ai requisiti specifici. Per creare un autorizzatore personalizzato con step-by-step istruzioni, vedi [Tutorial: Creazione di un autorizzatore personalizzato](https://docs.aws.amazon.com//iot/latest/developerguide/custom-auth-tutorial.html) per. AWS IoT Core

Ogni autorizzatore è costituito dai seguenti componenti: 
+  *Nome*: stringa univoca definita dall'utente che identifica l'autorizzatore.
+  *ARN della funzione Lambda*: L'Amazon Resource Name (ARN) della funzione Lambda che implementa la logica di autorizzazione e di autenticazione.  
+  *Nome della chiave dei token*: Il nome della chiave utilizzato per estrarre il token dalle intestazioni HTTP, dai parametri di query o dal nome utente MQTT CONNECT per eseguire la convalida della firma. Questo valore è obbligatorio se la firma è abilitata nell'autorizzazione. 
+  *Contrassegno di firma disabilitato (facoltativo)*: valore booleano che specifica se disattivare il requisito di firma sulle credenziali. Ciò è utile per gli scenari in cui la firma delle credenziali non ha senso, ad esempio gli schemi di autenticazione che utilizzano il nome utente e la password MQTT. Il valore predefinito è `false`, pertanto la firma è abilitata per impostazione predefinita. 
+  *Chiave pubblica per la firma di token*: chiave pubblica utilizzata da AWS IoT Core per convalidare la firma del token. La sua lunghezza minima è di 2.048 bit. Questo valore è obbligatorio se la firma è abilitata nell'autorizzatore.  

Lambda addebita per il numero di volte in cui la tua funzione Lambda viene eseguita e per il tempo necessario per l'esecuzione del codice nella funzione. Per maggiori informazioni sui prezzi di Lambda consulta [Prezzi Lambda](https://aws.amazon.com/lambda/pricing/). Per ulteriori informazioni sulla creazione di funzioni Lambda, consulta [Guida per gli sviluppatori di Lambda](https://docs.aws.amazon.com/lambda/latest/dg/).

**Nota**  
Se si lascia abilitata la firma, è possibile impedire l'attivazione eccessiva di Lambda da parte di client non riconosciuti. Consideralo prima di disabilitare l'accesso nel tuo autorizzatore.

**Nota**  
Il limite di timeout della funzione Lambda per l'autorizzatore personalizzato è di 5 secondi.

**Topics**
+ [Scrittura della funzione Lambda](custom-auth-lambda.md)
+ [Creazione di un autorizzatore](custom-auth-create-authorizer.md)
+ [Autorizzazione AWS IoT a richiamare la funzione Lambda](custom-auth-authorize.md)
+ [Verificare le autorizzazioni](custom-auth-testing.md)
+ [Gestione degli autorizzatori personalizzati](custom-auth-manage.md)

# Scrittura della funzione Lambda
<a name="custom-auth-lambda"></a>

 Quando AWS IoT Core richiama l'autorizzatore, attiva la Lambda associata all'autorizzatore con un evento che contiene il seguente oggetto JSON. L'oggetto JSON di esempio contiene tutti i campi possibili. I campi non rilevanti per la richiesta di connessione non sono inclusi.

```
{
    "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 funzione Lambda deve utilizzare queste informazioni per autenticare la connessione in ingresso e decidere quali azioni sono consentite nella connessione. La funzione deve inviare una risposta che contiene i seguenti valori. 
+  `isAuthenticated`: valore booleano che indica se la richiesta è stata autenticata.
+  `principalId`: Una stringa alfanumerica che funge da identificatore per il token inviato dalla richiesta di autorizzazione personalizzata. Il valore deve essere una stringa alfanumerica con almeno uno e non più di 128 caratteri e corrisponde a questo pattern di espressione regolare (regex):`([a-zA-Z0-9]){1,128}`. I caratteri speciali che non sono alfanumerici non possono essere utilizzati con l'in. `principalId` AWS IoT Core Consultate la documentazione relativa agli altri AWS servizi se sono consentiti caratteri speciali non alfanumerici per. `principalId`
+  `policyDocuments`: Un elenco di documenti relativi alle policy in formato JSON Per ulteriori informazioni sulla creazione di AWS IoT Core policy, vedere. AWS IoT Core [AWS IoT Core politiche](iot-policies.md) Il numero massimo di documenti di policy è di 10. Ogni documento di policy può contenere un massimo di 2.048 caratteri.
+  `disconnectAfterInSeconds`: numero intero che specifica la durata massima (in secondi) della connessione al gateway di AWS IoT Core . Il valore minimo è 300 secondi e il valore massimo è 86400 secondi. Il valore predefinito è 86.400.
**Nota**  
Il valore di `disconnectAfterInSeconds` (restituito dalla funzione Lambda) viene impostato quando viene stabilita la connessione. Questo valore non può essere modificato durante le successive chiamate Lambda di aggiornamento delle policy.
+  `refreshAfterInSeconds`: numero intero che specifica l'intervallo tra gli aggiornamenti delle policy. Passato questo intervallo, AWS IoT Core richiama la funzione Lambda per consentire gli aggiornamenti delle policy. Il valore minimo è 300 secondi e il valore massimo è 86400 secondi. 

  Il seguente oggetto JSON contiene un esempio di risposta che la funzione Lambda può inviare. 

 **\$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**

 Il `policyDocument` valore deve contenere un documento di policy valido. AWS IoT Core Per ulteriori informazioni sulle AWS IoT Core politiche, vedere[AWS IoT Core politiche](iot-policies.md). In MQTT su TLS e MQTT su WebSockets connessioni, AWS IoT Core memorizza nella cache questa politica per l'intervallo specificato nel valore del campo. `refreshAfterInSeconds` Nel caso di connessioni HTTP, la funzione Lambda viene richiamata per ogni richiesta di autorizzazione a meno che il dispositivo non utilizzi connessioni persistenti HTTP (chiamate anche HTTP keep-alive o riutilizzo della connessione HTTP), è possibile scegliere di abilitare la memorizzazione nella cache durante la configurazione dell'autorizzatore. Durante questo intervallo, AWS IoT Core autorizza le azioni in una connessione stabilita contro questa policy memorizzata nella cache senza attivare nuovamente la funzione Lambda. Se si verificano errori durante l'autenticazione personalizzata, interrompe la connessione. AWS IoT Core AWS IoT Core interrompe inoltre la connessione se è rimasta aperta per un periodo superiore al valore specificato nel parametro. `disconnectAfterInSeconds` 

 Di seguito JavaScript è riportato un esempio di funzione Lambda di Node.js che cerca una password nel messaggio MQTT Connect con un valore `test` di e restituisce un criterio che concede il permesso di connettersi AWS IoT Core a un client `myClientName` denominato e pubblicare su un argomento che contiene lo stesso nome client. Se non trova la password prevista, restituisce una policy che nega queste due operazioni. 

```
// 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 suddetta funzione Lambda restituisce il seguente JSON quando riceve la password prevista di `test` nel messaggio MQTT Connect. I valori delle proprietà `password` e `principalId` saranno i valori del messaggio 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
}
```

# Creazione di un autorizzatore
<a name="custom-auth-create-authorizer"></a>

 [È possibile creare un autorizzatore utilizzando l'API. CreateAuthorizer](https://docs.aws.amazon.com/iot/latest/apireference/API_CreateAuthorizer.html) L'esempio seguente descrive il 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]
```

Puoi utilizzare il parametro `signing-disabled` per disattivare la convalida della firma per ogni chiamata dell'autorizzatore. Si consiglia vivamente di non disattivare la firma a meno che non sia necessario. La convalida della firma ti protegge da invocazioni eccessive della funzione Lambda da dispositivi sconosciuti. Non è possibile aggiornare lo status `signing-disabled` di un autorizzatore dopo averlo creata. Per modificare questo comportamento, è necessario creare un altro autorizzatore personalizzato con un valore diverso per il parametro `signing-disabled`. 

I valori per i parametri `tokenKeyName` e `tokenSigningPublicKeys` sono facoltativi se la firma è stata disabilitata. Sono valori obbligatori se la firma è abilitata. 

Dopo aver creato la funzione Lambda e l'autorizzatore personalizzato, devi concedere esplicitamente al AWS IoT Core servizio l'autorizzazione a richiamare la funzione per tuo conto. Puoi farlo con il seguente comando. 

**Nota**  
L'endpoint IoT predefinito potrebbe non supportare l'utilizzo di autorizzazioni personalizzate con funzioni Lambda. Puoi invece utilizzare le configurazioni di dominio per definire un nuovo endpoint e quindi specificare quell'endpoint per l'autorizzatore personalizzato.

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

# Autorizzazione AWS IoT a richiamare la funzione Lambda
<a name="custom-auth-authorize"></a>

In questa sezione, concederai l'autorizzazione della risorsa di autorizzazione personalizzata che hai appena creato per eseguire la funzione Lambda. Per concedere l'autorizzazione, è possibile utilizzare il comando dell'interfaccia a riga di comando [add-permission](https://docs.aws.amazon.com//cli/latest/reference/lambda/add-permission.html).

**Concedi l'autorizzazione alla tua funzione Lambda utilizzando il AWS CLI**

1. Una volta inseriti i valori, inserisci il comando seguente. Attenzione: il valore `statement-id` deve essere univoco. Sostituisci `Id-1234` con il valore esatto che hai, altrimenti potresti ricevere un `ResourceConflictException` errore.

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

1. Se il comando viene completato correttamente, restituisce un'istruzione di autorizzazione come questa. È possibile passare alla sezione successiva per testare l'autorizzazione ad hoc.

   ```
   {
       "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\"}}}"
   }
   ```

   Se il comando non ha esito positivo, restituisce un errore come questo. Dovrai esaminare e correggere l'errore prima di continuare.

   ```
   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
   ```

# Verificare le autorizzazioni
<a name="custom-auth-testing"></a>

 Puoi utilizzare l'[TestInvokeAuthorizer](https://docs.aws.amazon.com/iot/latest/apireference/API_TestInvokeAuthorizer.html)API per testare l'invocazione e restituire i valori del tuo autorizzatore. Questa API consente di specificare i metadati del protocollo e di testare la convalida della firma nell'autorizzatore.

Le seguenti schede mostrano come utilizzare per testare l'autorizzatore AWS CLI .

------
#### [ 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
```

------

Il valore del parametro `token-signature` è il token firmato. Per ulteriori informazioni su come modificare questo valore, consulta [Firma del token](custom-auth.md#custom-auth-token-signature).

Se l'autorizzatore accetta un nome utente e una password, puoi trasferire queste informazioni utilizzando il parametro `--mqtt-context`. Nelle seguenti schede viene illustrato come utilizzare l'API `TestInvokeAuthorizer` per inviare un oggetto JSON che contiene un nome utente, una password e un nome client all'autorizzatore personalizzato.

------
#### [ 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"}'
```

------

La password deve essere con codifica base64. Nell'esempio seguente viene illustrato come codificare una password in un ambiente simile a UNIX.

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

# Gestione degli autorizzatori personalizzati
<a name="custom-auth-manage"></a>

 Puoi gestire i tuoi autorizzatori utilizzando quanto segue. APIs 
+ [ListAuthorizers](https://docs.aws.amazon.com/iot/latest/apireference/API_ListAuthorizers.html): Mostra tutti gli autorizzatori presenti nel tuo account.
+  [DescribeAuthorizer](https://docs.aws.amazon.com/iot/latest/apireference/API_DescribeAuthorizer.html): visualizza le proprietà dell'autorizzatore specificato. Questi valori includono data di creazione, data ultima modifica e altri attributi.
+ [SetDefaultAuthorizer](https://docs.aws.amazon.com/iot/latest/apireference/API_SetDefaultAuthorizer.html): specifica l'autorizzatore predefinito per gli endpoint di dati AWS IoT Core . AWS IoT Core utilizza questo autorizzatore se un dispositivo non trasmette AWS IoT Core le credenziali e non specifica un autorizzatore. Per ulteriori informazioni sull'utilizzo delle AWS IoT Core credenziali, vedere. [Autenticazione client](client-authentication.md)
+ [UpdateAuthorizer](https://docs.aws.amazon.com/iot/latest/apireference/API_UpdateAuthorizer.html): modifica lo stato, il nome della chiave del token o le chiavi pubbliche per l'autorizzatore specificato.
+  [DeleteAuthorizer](https://docs.aws.amazon.com/iot/latest/apireference/API_DeleteAuthorizer.html): elimina l'autorizzatore specificato. 

**Nota**  
 Non è possibile aggiornare i requisiti di firma di un autorizzatore. Ciò significa che non è possibile disabilitare la firma in un autorizzatore esistente che la richiede. Inoltre, non è possibile richiedere la firma a un autorizzatore esistente che non la richiede. 

# Autenticazione personalizzata con certificati client X.509
<a name="custom-auth-509cert"></a>

Quando si collegano dispositivi a AWS IoT Core, sono disponibili più [tipi di autenticazione](protocols.md#connection-protocol-auth-mode). È possibile utilizzare [certificati client X.509](https://docs.aws.amazon.com//iot/latest/developerguide/x509-client-certs.html) che possono essere utilizzati per autenticare le connessioni di client e dispositivi o definire [autorizzatori personalizzati](https://docs.aws.amazon.com//iot/latest/developerguide/custom-authentication.html) per gestire la propria logica di autenticazione e autorizzazione dei client. Questo argomento spiega come utilizzare l'autenticazione personalizzata con i certificati client X.509.

L'utilizzo dell'autenticazione personalizzata con i certificati X.509 può essere utile se hai già autenticato i tuoi dispositivi utilizzando certificati X.509 e desideri eseguire ulteriori convalide e autorizzazioni personalizzate. Ad esempio, se si archiviano i dati dei dispositivi, come i numeri di serie, nel certificato client X.509, dopo aver AWS IoT Core autenticato il certificato client X.509, è possibile utilizzare un autorizzatore personalizzato per identificare dispositivi specifici in base alle informazioni memorizzate nel campo del certificato. CommonName L'utilizzo dell'autenticazione personalizzata con certificati X.509 può migliorare la gestione della sicurezza dei dispositivi durante la connessione dei dispositivi AWS IoT Core e offre maggiore flessibilità nella gestione della logica di autenticazione e autorizzazione. AWS IoT Core [https://docs.aws.amazon.com//iot/latest/developerguide/mqtt.html](https://docs.aws.amazon.com//iot/latest/developerguide/mqtt.html) [Per ulteriori informazioni sui tipi di autenticazione e sui protocolli applicativi supportati dagli endpoint dei dispositivi, vedere Protocolli di comunicazione dei AWS IoT Core dispositivi.](https://docs.aws.amazon.com//iot/latest/developerguide/protocols.html)

**Nota**  
L'autenticazione personalizzata con certificati client X.509 non è supportata nelle regioni. AWS GovCloud (US) 

**Importante**  
[È necessario utilizzare un endpoint creato utilizzando configurazioni di dominio.](iot-custom-endpoints-configurable.md) Inoltre, i client devono fornire l'estensione [SNI (Server Name Indication)](https://www.rfc-editor.org/rfc/rfc3546#section-3.1) durante la connessione a. AWS IoT Core

**Topics**
+ [Fase 1: Registrare i certificati client X.509 con AWS IoT Core](#custom-auth-509cert-client)
+ [Passaggio 2: creazione di una funzione Lambda](#custom-auth-509cert-lambda)
+ [Fase 3: Creare un autorizzatore personalizzato](#custom-auth-509cert-authorizer)
+ [Fase 4: Impostare il tipo di autenticazione e il protocollo applicativo in una configurazione di dominio](#custom-auth-509cert-domainconfig)

## Fase 1: Registrare i certificati client X.509 con AWS IoT Core
<a name="custom-auth-509cert-client"></a>

Se non l'hai già fatto, registra e attiva i certificati client [X.509](https://docs.aws.amazon.com//iot/latest/developerguide/x509-client-certs.html) con. AWS IoT Core Altrimenti, passare alla fase successiva.

Per registrare e attivare i certificati client con AWS IoT Core, procedi nel seguente modo:

1. Se [crei certificati client direttamente con AWS IoT](https://docs.aws.amazon.com//iot/latest/developerguide/device-certs-create.html). Questi certificati client verranno registrati automaticamente con AWS IoT Core.

1. Se [crei i tuoi certificati client](https://docs.aws.amazon.com//iot/latest/developerguide/device-certs-your-own.html), segui [queste istruzioni per registrarli AWS IoT Core](https://docs.aws.amazon.com//iot/latest/developerguide/register-device-cert.html).

1. Per attivare i certificati client, segui [queste istruzioni](https://docs.aws.amazon.com//iot/latest/developerguide/activate-or-deactivate-device-cert.html).

## Passaggio 2: creazione di una funzione Lambda
<a name="custom-auth-509cert-lambda"></a>

AWS IoT Core utilizza autorizzatori personalizzati per implementare schemi di autenticazione e autorizzazione personalizzati. Un autorizzatore personalizzato è associato a una funzione Lambda che determina se un dispositivo è autenticato e quali operazioni il dispositivo è autorizzato a eseguire. Quando un dispositivo si connette a AWS IoT Core, AWS IoT Core recupera i dettagli dell'autorizzatore, incluso il nome dell'autorizzatore e la funzione Lambda associata, e richiama la funzione Lambda. La funzione Lambda riceve un evento che contiene un oggetto JSON con i dati del certificato client X.509 del dispositivo. La tua funzione Lambda utilizza questo oggetto JSON di eventi per valutare la richiesta di autenticazione, decidere le azioni da intraprendere e inviare una risposta.

### Esempio di evento della funzione Lambda
<a name="custom-auth-509cert-event"></a>

L'oggetto JSON di esempio seguente contiene tutti i campi possibili che possono essere inclusi. L'oggetto JSON effettivo conterrà solo i campi relativi alla richiesta di connessione specifica.

```
{
	"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`  
Un valore booleano che indica se la firma del token configurata nell'autorizzatore è verificata o meno prima di richiamare la funzione Lambda dell'autorizzatore. Se l'autorizzatore è configurato per disabilitare la firma tramite token, questo campo sarà falso. 

`protocols`  
Un array che contiene i protocolli previsti per la richiesta.

`protocolData`  
Un oggetto che contiene informazioni sui protocolli utilizzati nella connessione. Fornisce dettagli specifici del protocollo che possono essere utili per l'autenticazione, l'autorizzazione e altro ancora.  
`tls`- Questo oggetto contiene informazioni relative al protocollo TLS (Transport Layer Security).   
+ `serverName`- La stringa del [nome host SNI (Server Name Indication)](https://www.rfc-editor.org/rfc/rfc3546#section-3.1). AWS IoT Core richiede che i dispositivi inviino l'[estensione SNI](https://www.rfc-editor.org/rfc/rfc3546#section-3.1) al protocollo Transport Layer Security (TLS) e forniscano l'indirizzo completo dell'endpoint sul campo. `host_name`
+ `x509CertificatePem`- Il certificato X.509 in formato PEM, utilizzato per l'autenticazione del client nella connessione TLS.
+ `principalId`- L'identificatore principale associato al client nella connessione TLS.
`mqtt`- Questo oggetto contiene informazioni relative al protocollo MQTT.  
+ `clientId`- È necessario includere una stringa solo nel caso in cui il dispositivo invii questo valore.
+ `username`- Il nome utente fornito nel pacchetto MQTT Connect.
+ `password`- La password fornita nel pacchetto MQTT Connect.

`connectionMetadata`  
Metadati della connessione.  
`id`- L'ID di connessione, che è possibile utilizzare per la registrazione e la risoluzione dei problemi.

**Nota**  
In questo caso, oggetto JSON, `x509CertificatePem` e `principalId` ci sono due nuovi campi nella richiesta. Il valore di `principalId` è uguale al valore di`certificateId`. Per ulteriori informazioni, consulta [Certificato](https://docs.aws.amazon.com//iot/latest/apireference/API_Certificate.html).

### Esempio di risposta alla funzione Lambda
<a name="custom-auth-509cert-response"></a>

La funzione Lambda deve utilizzare le informazioni dell'oggetto JSON dell'evento per autenticare la connessione in ingresso e decidere quali azioni sono consentite nella connessione.

Il seguente oggetto JSON contiene un esempio di risposta che la funzione Lambda può inviare.

```
{
	"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"
				}
			]
		}
	]
}
```

In questo esempio, questa funzione dovrebbe inviare una risposta che contenga i seguenti valori.

`isAuthenticated`  
Un valore booleano che indica se la richiesta è autenticata.

`principalId`  
Una stringa alfanumerica che funge da identificatore per il token inviato dalla richiesta di autorizzazione personalizzata. Il valore deve essere una stringa alfanumerica con almeno uno e non più di 128 caratteri. Identifica la connessione nei registri. Il valore di `principalId` deve essere uguale al valore dell'oggetto JSON dell'`principalId`evento (ad esempio CertificateID del certificato X.509).

`policyDocuments`  
Un elenco di documenti di policy in formato JSON. AWS IoT Core [Il valore è facoltativo e supporta le variabili [thing policy e le variabili certificate policy](https://docs.aws.amazon.com//iot/latest/developerguide/thing-policy-variables.html).](https://docs.aws.amazon.com//iot/latest/developerguide/cert-policy-variables.html) Il numero massimo di documenti relativi alle politiche è 10. Ogni documento di policy può contenere un massimo di 2.048 caratteri. Se hai più politiche collegate al certificato client e alla funzione Lambda, l'autorizzazione è una raccolta di tutte le politiche. Per ulteriori informazioni sulla creazione di AWS IoT Core politiche, consulta [Politiche](https://docs.aws.amazon.com//iot/latest/developerguide/iot-policies.html).

`disconnectAfterInSeconds`  
Un numero intero che specifica la durata massima (in secondi) della connessione al AWS IoT Core gateway. Il valore minimo è 300 secondi e il valore massimo è 86.400 secondi. `disconnectAfterInSeconds`è valido per tutta la durata di una connessione e non viene aggiornato in caso di aggiornamenti consecutivi delle policy.

`refreshAfterInSeconds`  
Un numero intero che specifica l'intervallo tra gli aggiornamenti delle policy. Al termine di questo intervallo, AWS IoT Core richiama la funzione Lambda per consentire gli aggiornamenti delle policy. Il valore minimo è 300 secondi e il valore massimo è 86400 secondi.

### Funzione Lambda di esempio
<a name="custom-auth-509cert-js-example"></a>

Di seguito è riportato un esempio di funzione Lambda di Node.js. La funzione esamina il certificato X.509 del client ed estrae le informazioni pertinenti come il numero di serie, l'impronta digitale e il nome del soggetto. Se le informazioni estratte corrispondono ai valori previsti, al client viene concesso l'accesso per la connessione. Questo meccanismo garantisce che solo i client autorizzati con certificati validi possano stabilire una connessione.

```
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 precedente funzione Lambda restituisce il seguente codice JSON quando riceve un certificato con il numero di serie, l'impronta digitale e l'oggetto previsti. Il valore di `x509CertificatePem` sarà il certificato client fornito nell'handshake TLS. Per ulteriori informazioni, consulta [Definizione della funzione Lambda](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
}
```

## Fase 3: Creare un autorizzatore personalizzato
<a name="custom-auth-509cert-authorizer"></a>

Dopo [aver definito la funzione Lambda](#custom-auth-509cert-lambda), crea un autorizzatore personalizzato per gestire la logica di autenticazione e autorizzazione del client. Puoi seguire le istruzioni dettagliate nella [Fase 3: Creare una risorsa di autorizzazione del cliente e la relativa autorizzazione](https://docs.aws.amazon.com//iot/latest/developerguide/custom-auth-tutorial.html#custom-auth-tutorial-authorizer). Per ulteriori informazioni, consulta [Creazione di un autorizzatore](https://docs.aws.amazon.com//iot/latest/developerguide/config-custom-auth.html). 

Nel processo di creazione dell'autorizzatore personalizzato, è necessario concedere l' AWS IoT autorizzazione a richiamare la funzione Lambda dopo la sua creazione. Per istruzioni dettagliate, consulta [Autorizzazione AWS IoT a richiamare la funzione Lambda](custom-auth-authorize.md).

## Fase 4: Impostare il tipo di autenticazione e il protocollo applicativo in una configurazione di dominio
<a name="custom-auth-509cert-domainconfig"></a>

Per autenticare i dispositivi utilizzando l'autenticazione personalizzata con certificati client X.509, è necessario impostare il tipo di autenticazione e il protocollo applicativo in una configurazione di dominio e inviare l'estensione SNI. Il valore di `authenticationType` deve essere e `CUSTOM_AUTH_X509` il valore di `applicationProtocol` può essere o. `SECURE_MQTT` `HTTPS`

### Imposta il tipo di autenticazione e il protocollo dell'applicazione nella configurazione del dominio (CLI)
<a name="custom-auth-509cert-cli"></a>

Se non disponi di una configurazione di dominio, usa il [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)comando per crearne una. Il valore di `authenticationType` deve essere `CUSTOM_AUTH_X509` e il valore di `applicationProtocol` può essere `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
    }'
```

Se hai già una configurazione di dominio, usa il [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)comando update `authenticationType` e `applicationProtocol` se necessario. Tieni presente che non puoi modificare il tipo o il protocollo di autenticazione sull'endpoint predefinito (`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`  
Il nome della configurazione di dominio.

`authentication-type`  
Il tipo di autenticazione della configurazione del dominio. Per ulteriori informazioni, vedi [Scelta del tipo di autenticazione](protocols.md#connection-protocol-auth-mode).

`application-protocol`  
Il protocollo applicativo con cui i dispositivi comunicano AWS IoT Core. Per ulteriori informazioni, vedere [Scelta di un protocollo applicativo](protocols.md#protocol-selection).

`--authorizer-config`  
Un oggetto che specifica la configurazione dell'autorizzatore in una configurazione di dominio.

`defaultAuthorizerName`  
Il nome dell'autorizzatore per una configurazione di dominio.

Per ulteriori informazioni, consulta [CreateDomainConfiguration](https://docs.aws.amazon.com//iot/latest/apireference/API_CreateDomainConfiguration.html)e [UpdateDomainConfiguration](https://docs.aws.amazon.com//iot/latest/apireference/API_UpdateDomainConfiguration.html)consulta l'*AWS IoT API Reference.* Per ulteriori informazioni sulla configurazione del dominio, consulta [Configurazioni del dominio](https://docs.aws.amazon.com//iot/latest/developerguide/iot-custom-endpoints-configurable.html).

# Connessione a AWS IoT Core tramite autenticazione personalizzata
<a name="custom-auth"></a>

 I dispositivi possono connettersi AWS IoT Core utilizzando l'autenticazione personalizzata con qualsiasi protocollo che AWS IoT Core supporti la messaggistica dei dispositivi. Per ulteriori informazioni sui protocolli di comunicazione supportati, consulta [Protocolli di dispositivo di comunicazione](protocols.md).  I dati di connessione che passi all'autorizzatore della funzione Lambda dipendono dal protocollo utilizzato. Per ulteriori informazioni sulla creazione dell'autorizzatore della funzione Lambda, consulta [Scrittura della funzione Lambda](custom-auth-lambda.md). Nelle sezioni seguenti viene illustrato come connettersi per l'autenticazione utilizzando ogni protocollo supportato.

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

I dispositivi che inviano dati AWS IoT Core tramite l'[API HTTP Publish](https://docs.aws.amazon.com/iot/latest/apireference/API_iotdata_Publish.html) possono passare le credenziali tramite le intestazioni di richiesta o i parametri di query nelle richieste HTTP POST. I dispositivi possono specificare un'autorizzatore da richiamare utilizzando l'intestazione `x-amz-customauthorizer-name` o i parametri di query. Se nella tua autorizzazione è abilitata la firma dei token, devi passare `token-key-name` e `x-amz-customauthorizer-signature` nelle intestazioni di richiesta o nei parametri di query. Tieni presente che il `token-signature` valore deve essere codificato come URL quando viene utilizzato JavaScript dall'interno del browser.

**Nota**  
La funzione delle autorizzazioni del cliente per il protocollo HTTPS supporta solo le operazioni di pubblicazione. Per ulteriori informazioni sul protocollo HTTP, consultare [Protocolli di dispositivo di comunicazione](protocols.md).

Le seguenti richieste di esempio mostrano come passare questi parametri sia nelle intestazioni di richiesta che nei parametri di query. 

```
//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>

 I dispositivi a cui si connettono AWS IoT Core tramite una connessione MQTT possono trasmettere le credenziali attraverso i campi `username` e `password` dei messaggi MQTT. Il valore `username` può facoltativamente contenere una stringa di query che invia valori aggiuntivi (tra cui un token, una firma e il nome di un autorizzatore) al tuo autorizzatore. Puoi utilizzare questa stringa di query se desideri utilizzare uno schema di autenticazione basato su token anziché i valori `username` e `password`.  

**Nota**  
 I dati nel campo della password sono codificati in base64 da. AWS IoT Core Devono essere decodificati dalla funzione Lambda. 

 L'esempio seguente contiene una stringa `username` che contiene parametri aggiuntivi che specificano un token e una firma.  

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

Per richiamare un autorizzatore, i dispositivi che si connettono tramite MQTT e l' AWS IoT Core autenticazione personalizzata devono connettersi alla porta 443. Devono inoltre passare l'estensione TLS Application Layer Protocol Negotiation (ALPN) con un valore di `mqtt` e l'estensione Server Name Indication (SNI) con il nome host del loro endpoint di dati. AWS IoT Core Per evitare potenziali errori, il valore per `x-amz-customauthorizer-signature` deve essere codificato in formato URL. Inoltre, è raccomandabile che anche i valori di `x-amz-customauthorizer-name` e `token-key-name` siano codificati nello stesso formato. Per ulteriori informazioni su questi valori, consulta [Protocolli di dispositivo di comunicazione](protocols.md). [AWS IoT Client per dispositivi SDKs SDKs, dispositivi mobili e AWS IoT dispositivi mobili](iot-sdks.md) V2 può configurare entrambe queste estensioni. 

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

 I dispositivi che si connettono AWS IoT Core tramite MQTT over WebSockets possono passare le credenziali in uno dei due modi seguenti. 
+ Tramite le intestazioni di richiesta o i parametri di query nella richiesta HTTP UPGRADE per stabilire la connessione. WebSockets 
+ Attraverso i campi `username` e `password` nel messaggio MQTT CONNECT.

 Se si passano le credenziali tramite il messaggio di connessione MQTT, sono necessarie le estensioni ALPN e SNI TLS. Per ulteriori informazioni su queste estensioni, consulta [MQTT](#custom-auth-mqtt). Nell'esempio seguente viene illustrato come trasferire le credenziali tramite la richiesta di aggiornamento 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
```

## Firma del token
<a name="custom-auth-token-signature"></a>

Devi firmare il token con la chiave privata della coppia di chiavi pubblica-privata che hai utilizzato nella chiamata `create-authorizer`. Gli esempi seguenti mostrano come creare la firma del token utilizzando un comando simile a Unix e. JavaScript Utilizzano l'algoritmo hash SHA-256 per codificare 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')
```

------

# Risoluzione dei problemi relativi agli autorizzatori
<a name="custom-auth-troubleshooting"></a>

 In questo argomento vengono illustrati i problemi comuni che possono causare problemi nei flussi di lavoro di autenticazione personalizzata e i passaggi per risolverli. **Per risolvere i problemi nel modo più efficace, abilita CloudWatch i log per AWS IoT Core e imposta il livello di registro su DEBUG.** È possibile abilitare CloudWatch i log nella console (). AWS IoT Core [https://console.aws.amazon.com/iot/](https://console.aws.amazon.com/iot/) Per ulteriori informazioni sull'attivazione e l'utilizzo dei registri per AWS IoT Core, consulta [Configurare la registrazione AWS IoT](configure-logging.md). 

**Nota**  
Se si lascia il livello di registro su **DEBUG** per lunghi periodi di tempo, CloudWatch potrebbe memorizzare grandi quantità di dati di registrazione. Ciò può aumentare i costi. CloudWatch Prendi in considerazione l'utilizzo della registrazione basata sulle risorse per aumentare la verbosità solo per i dispositivi di un particolare gruppo di oggetti. Per ulteriori informazioni sulle registrazioni basate sulle risorse, consulta [Configurare la registrazione AWS IoT](configure-logging.md). Inoltre, al termine della risoluzione dei problemi, ridurre il livello di registro a un livello meno verboso.

Prima di iniziare la risoluzione dei problemi, consulta [Informazioni sul flusso di lavoro di autenticazione personalizzato](custom-authorizer.md) per una visualizzazione generale del processo di autenticazione personalizzata. Questo ti aiuta a capire dove cercare la fonte di un problema.

In questo argomento vengono illustrate le due seguenti aree da esaminare.
+ Problemi relativi alla funzione Lambda dell’autorizzatore.
+ Problemi relativi al tuo dispositivo.

## Controllo della presenza di problemi nella funzione Lambda dell'autorizzatore
<a name="custom-auth-troubleshooting-lambda"></a>

Esegui la procedura seguente per assicurarti che i tentativi di connessione dei dispositivi richiamino la funzione Lambda.

1. Verifica quale funzione Lambda è associata al tuo autorizzatore.

   Puoi farlo chiamando l'[DescribeAuthorizer](https://docs.aws.amazon.com/iot/latest/apireference/API_DescribeAuthorizer.html)API o facendo clic sull'autorizzatore desiderato nella sezione **Secure** della AWS IoT Core console.

1. Controlla i parametri di chiamata per la funzione Lambda. Esegui i seguenti passaggi.

   1. Apri la AWS Lambda console ([https://console.aws.amazon.com/lambda/](https://console.aws.amazon.com/lambda/)) e seleziona la funzione associata al tuo autorizzatore.

   1. Scegli la scheda **Monitor (Monitorare)** e visualizza i parametri relativi al periodo di tempo rilevante per il problema.

1. Se non vedi alcuna chiamata, verifica di AWS IoT Core avere il permesso di richiamare la tua funzione Lambda. Se visualizzi i richiami, vai al passaggio successivo. Esegui la procedura seguente per verificare che la funzione Lambda disponga delle autorizzazioni richieste.

   1. Scegli la scheda **Autorizzazioni** per la tua funzione nella console. AWS Lambda 

   1. Trova la sezione **Resource-based Policy (Policy basata su risorse)** nella parte inferiore della pagina. Se la funzione Lambda dispone delle autorizzazioni richieste, la policy sarà simile all'esempio seguente.  
****  

      ```
      {
        "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. Questa politica concede l'`InvokeFunction`autorizzazione sulla tua funzione al AWS IoT Core preside. Se non la vedi, dovrai aggiungerla utilizzando l'[AddPermission](https://docs.aws.amazon.com/lambda/latest/dg/API_AddPermission.html)API. Nell'esempio seguente viene illustrato come eseguire questa operazione utilizzando l' AWS CLI.

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

1. Se visualizzi i richiami, verifica che non vi siano errori. Un errore potrebbe indicare che la funzione Lambda non gestisce correttamente l'evento di connessione che la AWS IoT Core invia.

   Per informazioni sulla gestione dell'evento nella funzione Lambda, consulta [Scrittura della funzione Lambda](custom-auth-lambda.md). È possibile utilizzare la funzionalità test nella AWS Lambda console ([https://console.aws.amazon.com/lambda/](https://console.aws.amazon.com/lambda/)) per codificare i valori di test della funzione per assicurarsi che la funzione gestisca gli eventi correttamente.

1. Se visualizzi i richiami senza errori, ma i tuoi dispositivi non sono in grado di connettersi (o pubblicare, sottoscrivere e ricevere messaggi), il problema potrebbe essere che la policy restituita dalla funzione Lambda non fornisce autorizzazioni per le operazioni che i tuoi dispositivi stanno tentando di eseguire. Eseguire la procedura seguente per determinare se qualcosa non è corretto nella policy restituita dalla funzione.

   1. Utilizza una query Amazon CloudWatch Logs Insights per scansionare i log in un breve periodo di tempo per verificare eventuali errori. La seguente query di esempio ordina gli eventi in base al timestamp e cerca errori.

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

   1. Aggiorna la tua funzione Lambda per registrare i dati a cui ritorna AWS IoT Core e l'evento che attiva la funzione. È possibile utilizzare questi registri per esaminare le policy create dalla funzione.

1. Se visualizzi invocazioni senza errori ma i tuoi dispositivi non sono in grado di connettersi (o pubblicare, sottoscrivere e ricevere messaggi), un altro motivo potrebbe essere che la funzione Lambda supera il limite di timeout. Il limite di timeout della funzione Lambda per l'autorizzatore personalizzato è di 5 secondi. Puoi controllare la durata della funzione nei CloudWatch log o nelle metriche. 

## Analisi dei problemi relativi ai dispositivi
<a name="custom-auth-troubleshooting-investigate"></a>

Se non riscontri problemi con il richiamo della funzione Lambda o con la policy restituita dalla funzione, cerca i problemi con la connessione dei tuoi dispositivi. Le richieste di connessione AWS IoT Core non corrette possono impedire l'attivazione dell'autorizzatore. I problemi di connessione possono verificarsi sia a livello TLS che a livello di applicazione.

**Possibili problemi di livello TLS:**
+ I clienti devono inserire un'intestazione del nome host (HTTP, MQTT over WebSockets) o l'estensione TLS Server Name Indication (HTTP, MQTT over WebSockets, MQTT) in tutte le richieste di autenticazione personalizzate. In entrambi i casi, il valore passato deve corrispondere a uno degli endpoint di dati del tuo account. AWS IoT Core Questi sono gli endpoint restituiti quando si eseguono i seguenti comandi CLI.
  + `aws iot describe-endpoint --endpoint-type iot:Data-ATS`
  + `aws iot describe-endpoint --endpoint-type iot:Data`(per gli VeriSign endpoint precedenti)
+ I dispositivi che utilizzano l'autenticazione personalizzata nelle connessioni MQTT devono anche inviare l'estensione TLS Application Layer Protocol Negotiation (ALPN) con un valore pari a `mqtt`.
+ L'autenticazione personalizzata è attualmente disponibile solo sulla porta 443.

**Possibili problemi relativi al livello dell'applicazione:**
+ Se la firma è abilitata (il campo `signingDisabled` è false nel tuo autorizzatore), cerca i seguenti problemi di firma.
  + Assicurati di passare la firma del token nell'intestazione`x-amz-customauthorizer-signature` o in un parametro di stringa di query.
  + Assicurati che il servizio non firmi un valore diverso dal token.
  + Assicurati di passare il token nel parametro di intestazione o query specificato nel campo `token-key-name` dell'autorizzatore.
+ Assicurati che il nome dell'autorizzatore che si passa nell'intestazione `x-amz-customauthorizer-name` o nel parametro della stringa di query sia valido o che disponga di un autorizzatore predefinito definito per il proprio account.