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 collegano dispositivi a AWS IoT Core, sono disponibili più tipi di autenticazione. È possibile utilizzare certificati client X.509 che possono essere utilizzati per autenticare le connessioni di client e dispositivi o definire autorizzatori personalizzati per gestire la propria logica di autenticazione e autorizzazione dei client. In questo argomento viene illustrato 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 supporta l'autenticazione personalizzata con certificati X.509 utilizzando il certificato X.509 e il tipo di autenticazione con autorizzazione personalizzata, 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 dei dispositivi, vedere Protocolli di comunicazione dei AWS IoT Core dispositivi.
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. Inoltre, i client devono fornire l'estensione SNI (Server Name Indication)
Il processo di autenticazione dei dispositivi utilizzando l'autenticazione personalizzata con certificati client X.509 prevede i seguenti passaggi.
Fase 1: Registrare i certificati client X.509 con AWS IoT Core
Se non l'hai già fatto, registra e attiva i certificati client X.509 con. AWS IoT Core Altrimenti, passare alla fase successiva.
Per registrare e attivare i certificati client con AWS IoT Core, procedi nel seguente modo:
-
Se crei certificati client direttamente con AWS IoT. Questi certificati client verranno registrati automaticamente con AWS IoT Core.
-
Se crei i tuoi certificati client, segui queste istruzioni per registrarli AWS IoT Core.
-
Per attivare i certificati client, 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 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
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.
tls
- Questo oggetto contiene informazioni relative al protocollo TLS (Transport Layer Security).-
serverName
- La stringa del nome host SNI (Server Name Indication). AWS IoT Core richiede che i dispositivi inviino l'estensione SNI 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 dicertificateId
. Per ulteriori informazioni, consulta Certificato.
Esempio di risposta alla funzione Lambda
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. 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.
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
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.
{ "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 client. Puoi seguire le istruzioni dettagliate nella Fase 3: Creare una risorsa di autorizzazione del cliente e la relativa autorizzazione. Per ulteriori informazioni, consulta Creazione di un autorizzatore.
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.
Fase 4: Impostare il tipo di autenticazione e il protocollo dell'applicazione in una configurazione di dominio
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)
Se non disponi di una configurazione di dominio, usa il create-domain-configurationcomando 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-name
domainConfigurationName
\ --authentication-typeCUSTOM_AUTH_X509
\ --application-protocolSECURE_MQTT
\ --authorizer-config '{ "defaultAuthorizerName":my-custom-authorizer
}'
Se hai già una configurazione di dominio, usa il update-domain-configurationcomando 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-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, vedi Scelta del 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 CreateDomainConfiguratione UpdateDomainConfigurationconsulta l'AWS IoT API Reference. Per ulteriori informazioni sulla configurazione del dominio, consulta Configurazioni del dominio.