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 personalizzata con certificati client X.509
Quando si connettono i dispositivi a AWS IoT Core, sono disponibili diversi tipi di autenticazione. È possibile utilizzare certificati X.509 client che possono essere utilizzati per autenticare le connessioni tra client e dispositivi oppure definire autorizzatori personalizzati per gestire la logica di autenticazione e autorizzazione del client. Questo argomento illustra come utilizzare l'autenticazione personalizzata con i certificati X.509 client.
L'utilizzo dell'autenticazione personalizzata con X.509 certificati può essere utile se hai già autenticato i tuoi dispositivi utilizzando X.509 certificati e desideri eseguire ulteriori convalide e autorizzazioni personalizzate. Ad esempio, se memorizzi i dati dei tuoi dispositivi, come i numeri di serie, nel certificato X.509 client, dopo aver AWS IoT Core autenticato il certificato X.509 client, puoi utilizzare un autorizzatore personalizzato per identificare dispositivi specifici in base alle informazioni memorizzate nel campo del certificato. CommonName L'utilizzo dell'autenticazione personalizzata con X.509 certificati può migliorare la gestione della sicurezza dei dispositivi durante la connessione dei dispositivi AWS IoT Core e offre una maggiore flessibilità nella gestione della logica di autenticazione e autorizzazione. AWS IoT Core supporta l'autenticazione personalizzata con X.509 certificati che utilizzano il tipo di autenticazione X.509 certificato e autorizzatore personalizzato, che funziona sia con il protocollo MQTT che con il protocollo HTTPS. Per ulteriori informazioni sui tipi di autenticazione e sui protocolli applicativi supportati dagli endpoint AWS IoT Core del dispositivo, vedere Protocolli di comunicazione del dispositivo.
Nota
L'autenticazione personalizzata con certificati X.509 client non è supportata nelle AWS GovCloud (US) regioni.
Importante
È necessario utilizzare un endpoint creato utilizzando le configurazioni di dominio. Inoltre, i client devono fornire l'estensione SNI (
Il processo di autenticazione dei dispositivi mediante l'autenticazione personalizzata con certificati X.509 client prevede i seguenti passaggi.
Passaggio 1: registra i certificati X.509 dei tuoi clienti con AWS IoT Core
Se non l'hai già fatto, registra e attiva i tuoi certificati X.509 cliente con AWS IoT Core. Altrimenti, passare alla fase successiva.
Per registrare e attivare i tuoi certificati cliente con AWS IoT Core, segui i passaggi:
-
Se crei certificati client direttamente con AWS IoT. Questi certificati client verranno registrati automaticamente con AWS IoT Core.
-
Se crei i tuoi certificati cliente, segui queste istruzioni per registrarli AWS IoT Core.
-
Per attivare i tuoi certificati cliente, segui queste istruzioni.
Passaggio 2: creazione di una funzione Lambda
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 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 del dispositivo. X.509 La funzione Lambda utilizza questo oggetto JSON evento per valutare la richiesta di autenticazione, decidere le azioni da intraprendere e inviare una risposta.
Esempio di evento della funzione Lambda
L'oggetto JSON di esempio seguente contiene tutti i possibili campi 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 è stata verificata o meno prima di richiamare la funzione Lambda dell'autorizzatore. Se l'autorizzatore è configurato per disabilitare la firma dei 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 delserver Name Indication (SNI). AWS IoT Core richiede che i dispositivi inviino l'estensione SNI al protocollo Transport Layer Security (TLS) e forniscano l'indirizzo completo dell'endpoint nel campo. host_name -
x509CertificatePem- Il X.509 certificato 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- Una stringa deve essere inclusa 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 l'oggetto JSON x509CertificatePem e principalId sono due nuovi campi nella richiesta. Il valore di principalId è uguale al valore dicertificateId. Per ulteriori informazioni, vedere Certificato.
Esempio di risposta della funzione Lambda
La funzione Lambda deve utilizzare le informazioni dell'oggetto JSON dell'evento per autenticare la connessione in entrata 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 contiene 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 log. Il valore di
principalIddeve essere uguale al valore diprincipalIdnell'oggetto JSON dell'evento (ad esempio certificateID del certificato). X.509 policyDocuments-
Un elenco di documenti politici. JSON-formatted AWS IoT Core Il valore è facoltativo e supporta le variabili della politica degli oggetti e le variabili delle politiche dei certificati. Il numero massimo di documenti politici è 10. Ogni documento di policy può contenere un massimo di 2.048 caratteri. Se hai più policy allegate al certificato client e alla funzione Lambda, l'autorizzazione è una raccolta di tutte le politiche. Per ulteriori informazioni sulla creazione di AWS IoT Core policy, consulta Policy.
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 l'aggiornamento delle policy. Il valore minimo è 300 secondi e il valore massimo è 86400 secondi.
Funzione Lambda di esempio
Di seguito è riportato un esempio Node.js di funzione Lambda. La funzione esamina il X.509 certificato del cliente ed estrae le informazioni pertinenti come il numero di serie, l'impronta digitale e il nome dell'oggetto. Se le informazioni estratte corrispondono ai valori previsti, al client viene concesso l'accesso alla 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 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.
{ "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
Dopo aver definito la funzione Lambda, crea un autorizzatore personalizzato per gestire la logica di autenticazione e autorizzazione del tuo cliente. Puoi seguire le istruzioni dettagliate nella Fase 3: Creare una risorsa di autorizzazione per i clienti e la relativa autorizzazione. Per ulteriori informazioni, consulta Creazione di un autorizzatore.
Nel processo di creazione dell'autorizzatore personalizzato, devi concedere l' AWS IoT autorizzazione per richiamare la funzione Lambda dopo la sua creazione. Per istruzioni dettagliate, consulta Autorizzazione AWS IoT all'invocazione della funzione Lambda.
Passaggio 4: imposta il tipo di autenticazione e il protocollo applicativo in una configurazione di dominio
Per autenticare i dispositivi utilizzando l'autenticazione personalizzata con certificati X.509 client, è necessario impostare il tipo di autenticazione e il protocollo applicativo in una configurazione di dominio e inviare l'estensione SNI. Il valore di authenticationType must be CUSTOM_AUTH_X509 e il valore di applicationProtocol può essere SECURE_MQTT o. HTTPS
Imposta il tipo di autenticazione e il protocollo applicativo nella configurazione del dominio (CLI)
Se non disponi di una configurazione di dominio, usa il create-domain-configuration comando per crearne una. Il valore di authenticationType deve essere CUSTOM_AUTH_X509 e il valore di applicationProtocol può essere SECURE_MQTT oHTTPS.
aws iot create-domain-configuration \ --domain-configuration-namedomainConfigurationName\ --authentication-typeCUSTOM_AUTH_X509\ --application-protocolSECURE_MQTT\ --authorizer-config '{ "defaultAuthorizerName":my-custom-authorizer}'
Se disponi già di una configurazione di dominio, utilizza il update-domain-configuration 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-namedomainConfigurationName\ --authentication-typeCUSTOM_AUTH_X509\ --application-protocolSECURE_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, vedere Scelta di un tipo di autenticazione.
application-protocol-
Il protocollo applicativo con cui i dispositivi comunicano AWS IoT Core. Per ulteriori informazioni, vedere Scelta di un protocollo applicativo.
--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 e UpdateDomainConfiguration da AWS IoT API Reference. Per ulteriori informazioni sulla configurazione del dominio, consulta Configurazioni https://docs.aws.amazon.com//iot/latest/developerguide/iot-custom-endpoints-configurable.html del dominio.