Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.
Benutzerdefinierte Authentifizierung mit Client-Zertifikaten X.509
Wenn Sie Geräte mit verbinden AWS IoT Core, stehen Ihnen mehrere Authentifizierungstypen zur Verfügung. Sie können X.509 Client-Zertifikate verwenden, die zur Authentifizierung von Client- und Geräteverbindungen verwendet werden können, oder benutzerdefinierte Autorisierer definieren, um Ihre eigene Client-Authentifizierungs- und Autorisierungslogik zu verwalten. In diesem Thema wird beschrieben, wie Sie die benutzerdefinierte Authentifizierung mit X.509 Client-Zertifikaten verwenden.
Die Verwendung der benutzerdefinierten Authentifizierung mit X.509 Zertifikaten kann hilfreich sein, wenn Sie Ihre Geräte bereits mithilfe von X.509 Zertifikaten authentifiziert haben und eine zusätzliche Validierung und benutzerdefinierte Autorisierung durchführen möchten. Wenn Sie beispielsweise die Daten Ihrer Geräte wie die Seriennummern Ihrer Geräte im X.509 Client-Zertifikat speichern, können Sie nach der AWS IoT Core Authentifizierung des X.509 Client-Zertifikats einen benutzerdefinierten Autorisierer verwenden, um bestimmte Geräte anhand der im Feld des Zertifikats gespeicherten Informationen zu identifizieren. CommonName Die Verwendung einer benutzerdefinierten Authentifizierung mit X.509 Zertifikaten kann das Sicherheitsmanagement Ihres Geräts beim Anschließen von Geräten verbessern AWS IoT Core und bietet mehr Flexibilität bei der Verwaltung der Authentifizierungs- und Autorisierungslogik. AWS IoT Core unterstützt die benutzerdefinierte Authentifizierung mit X.509 Zertifikaten unter Verwendung des Authentifizierungstyps „ X.509Zertifikat“ und „Benutzerdefinierter Authorizer“, der sowohl mit dem https://docs.aws.amazon.com//iot/latest/developerguide/mqtt.html MQTT-Protokoll als auch mit dem https://docs.aws.amazon.com//iot/latest/developerguide/http.html HTTPS-Protokoll funktioniert. Weitere Informationen zu den Authentifizierungstypen und Anwendungsprotokollen, die von AWS IoT Core Geräteendpunkten unterstützt werden, finden Sie unter Kommunikationsprotokolle für Geräte.
Anmerkung
Die benutzerdefinierte Authentifizierung mit X.509 Client-Zertifikaten wird in den AWS GovCloud (US) Regionen nicht unterstützt.
Wichtig
Sie müssen einen Endpunkt verwenden, der mithilfe von Domänenkonfigurationen erstellt wurde. Darüber hinaus müssen Clients die Erweiterung
Das Verfahren zur Authentifizierung von Geräten mithilfe einer benutzerdefinierten Authentifizierung mit X.509 Client-Zertifikaten besteht aus den folgenden Schritten.
Schritt 1: Registrieren Sie Ihre X.509 Client-Zertifikate bei AWS IoT Core
Falls Sie dies noch nicht getan haben, registrieren und aktivieren Sie Ihre X.509 Client-Zertifikate bei AWS IoT Core. Andernfalls überspringen Sie diesen Schritt und gehen Sie direkt zum nächsten.
Gehen Sie wie folgt vor AWS IoT Core, um Ihre Client-Zertifikate bei zu registrieren und zu aktivieren:
-
Wenn Sie Client-Zertifikate direkt mit erstellen AWS IoT. Diese Client-Zertifikate werden automatisch bei registriert AWS IoT Core.
-
Wenn Sie Ihre eigenen Client-Zertifikate erstellen, folgen Sie diesen Anweisungen, um sie bei zu registrieren AWS IoT Core.
-
Folgen Sie diesen Anweisungen, um Ihre Client-Zertifikate zu aktivieren.
Schritt 2: Erstellen einer Lambda-Funktion
AWS IoT Core verwendet benutzerdefinierte Autorisierer, um benutzerdefinierte Authentifizierungs- und Autorisierungsschemata zu implementieren. Ein benutzerdefinierter Autorisierer ist mit einer Lambda-Funktion verknüpft, die bestimmt, ob ein Gerät authentifiziert ist und welche Operationen das Gerät ausführen darf. Ruft ein Gerät die Autorisierungsdetails ab AWS IoT Core, einschließlich des Autorisierungsnamens und der zugehörigen Lambda-Funktion, und AWS IoT Core ruft die Lambda-Funktion auf. Die Lambda-Funktion empfängt ein Ereignis, das ein JSON-Objekt mit den Client-Zertifikatsdaten des Geräts enthält. X.509 Ihre Lambda-Funktion verwendet dieses Event-JSON-Objekt, um die Authentifizierungsanforderung auszuwerten, zu entscheiden, welche Maßnahmen ergriffen werden sollen, und eine Antwort zurückzusenden.
Beispiel für ein Lambda-Funktionsereignis
Das folgende Beispiel-JSON-Objekt enthält alle möglichen Felder, die eingeschlossen werden können. Das eigentliche JSON-Objekt enthält nur Felder, die für die spezifische Verbindungsanforderung relevant sind.
{ "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-
Ein boolescher Wert, der angibt, ob die im Authorizer konfigurierte Token-Signatur verifiziert wurde oder nicht, bevor die Lambda-Funktion des Authorizers aufgerufen wird. Wenn der Autorisierer so konfiguriert ist, dass er die Tokensignierung deaktiviert, ist dieses Feld falsch.
protocols-
Ein Array, das die Protokolle enthält, die für die Anfrage zu erwarten sind.
protocolData-
Ein Objekt, das Informationen zu den in der Verbindung verwendeten Protokollen enthält. Es enthält protokollspezifische Details, die für die Authentifizierung, Autorisierung und mehr nützlich sein können.
tls- Dieses Objekt enthält Informationen zum TLS-Protokoll (Transport Layer Security).-
serverName— Die Zeichenfolge für den Hostnamen vonServer Name Indication (SNI). AWS IoT Core erfordert, dass Geräte die SNI-Erweiterung an das Transport Layer Security (TLS) -Protokoll senden und die vollständige Endpunktadresse im Feld angeben. host_name -
x509CertificatePem- Das X.509 Zertifikat im PEM-Format, das für die Client-Authentifizierung in der TLS-Verbindung verwendet wird. -
principalId- Die Prinzipal-ID, die dem Client in der TLS-Verbindung zugeordnet ist.
mqtt- Dieses Objekt enthält Informationen zum MQTT-Protokoll.-
clientId- Eine Zeichenfolge muss nur für den Fall eingefügt werden, dass das Gerät diesen Wert sendet. -
username- Der im MQTT Connect-Paket angegebene Benutzername. -
password- Das im MQTT Connect-Paket angegebene Passwort.
-
connectionMetadata-
Metadaten der Verbindung.
id- Die Verbindungs-ID, die Sie für die Protokollierung und Problembehandlung verwenden können.
Anmerkung
Bei diesem Ereignis principalId handelt es sich um ein JSON-Objekt x509CertificatePem und zwei neue Felder in der Anfrage. Der Wert von principalId ist der gleiche wie der Wert voncertificateId. Weitere Informationen finden Sie unter Zertifikat.
Beispiel für eine Antwort auf eine Lambda-Funktion
Die Lambda-Funktion sollte Informationen aus dem Event-JSON-Objekt verwenden, um die eingehende Verbindung zu authentifizieren und zu entscheiden, welche Aktionen in der Verbindung zulässig sind.
Das folgende JSON-Objekt enthält eine Beispielantwort, die Ihre Lambda-Funktion senden kann.
{ "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 diesem Beispiel sollte diese Funktion eine Antwort senden, die die folgenden Werte enthält.
isAuthenticated-
Ein boolescher Wert, der angibt, ob die Anfrage authentifiziert ist.
principalId-
Eine alphanumerische Zeichenfolge, die als Kennung für das Token dient, das von der benutzerdefinierten Autorisierungsanforderung gesendet wurde. Der Wert muss eine alphanumerische Zeichenfolge mit mindestens einem und nicht mehr als 128 Zeichen sein. Es identifiziert die Verbindung in Protokollen. Der Wert von
principalIdmuss mit dem Wert vonprincipalIdim JSON-Objekt für das Ereignis übereinstimmen (d. h. die CertificateID des X.509 Zertifikats). policyDocuments-
Eine Liste von JSON-formatted AWS IoT Core Richtliniendokumenten. Der Wert ist optional und unterstützt Objektrichtlinienvariablen und Zertifikatsrichtlinienvariablen. Die maximale Anzahl von Richtliniendokumenten ist 10. Jedes Richtliniendokument darf maximal 2048 Zeichen enthalten. Wenn Sie mehrere Richtlinien an Ihr Client-Zertifikat und die Lambda-Funktion angehängt haben, ist die Berechtigung eine Sammlung aller Richtlinien. Weitere Informationen zum Erstellen von AWS IoT Core Richtlinien finden Sie unter Richtlinien.
disconnectAfterInSeconds-
Eine Ganzzahl, die die maximale Dauer (in Sekunden) der Verbindung zum AWS IoT Core Gateway angibt. Der Mindestwert ist 300 Sekunden und der Höchstwert ist 86.400 Sekunden.
disconnectAfterInSecondsgilt für die Lebensdauer einer Verbindung und wird bei aufeinanderfolgenden Richtlinienaktualisierungen nicht aktualisiert. refreshAfterInSeconds-
Eine Ganzzahl, die das Intervall zwischen den Richtlinienaktualisierungen angibt. Wenn dieses Intervall abgelaufen ist, wird die Lambda-Funktion AWS IoT Core aufgerufen, um Richtlinienaktualisierungen zu ermöglichen. Der Mindestwert ist 300 Sekunden und der Höchstwert 86 400 Sekunden.
Beispiel-Lambda-Funktion
Im Folgenden finden Sie ein Beispiel Node.js für eine Lambda-Funktion. Die Funktion überprüft das X.509 Zertifikat des Kunden und extrahiert relevante Informationen wie die Seriennummer, den Fingerabdruck und den Namen des Antragstellers. Wenn die extrahierten Informationen den erwarteten Werten entsprechen, erhält der Client Zugriff auf die Verbindung. Dieser Mechanismus stellt sicher, dass nur autorisierte Clients mit gültigen Zertifikaten eine Verbindung herstellen können.
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; }
Die vorhergehende Lambda-Funktion gibt den folgenden JSON-Code zurück, wenn sie ein Zertifikat mit der erwarteten Seriennummer, dem erwarteten Fingerabdruck und dem Betreff empfängt. Der Wert von ist das Client-Zertifikat, das im TLS-Handshake bereitgestellt x509CertificatePem wird. Weitere Informationen finden Sie unter Definieren Ihrer Lambda-Funktion.
{ "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 }
Schritt 3: Erstellen Sie einen benutzerdefinierten Autorisierer
Nachdem Sie die Lambda-Funktion definiert haben, erstellen Sie einen benutzerdefinierten Autorisierer, um Ihre eigene Client-Authentifizierungs- und Autorisierungslogik zu verwalten. Sie können den detaillierten Anweisungen in Schritt 3: Erstellen Sie eine Kundenautorisierungsressource und deren Autorisierung folgen. Weitere Informationen finden Sie unter Einen Autorisierer erstellen.
Bei der Erstellung des benutzerdefinierten Autorisierers müssen Sie die AWS IoT Erlaubnis erteilen, die Lambda-Funktion aufzurufen, nachdem sie erstellt wurde. Eine ausführliche Anleitung finden Sie unter Autorisieren des Aufrufs Ihrer AWS IoT Lambda-Funktion.
Schritt 4: Legen Sie den Authentifizierungstyp und das Anwendungsprotokoll in einer Domänenkonfiguration fest
Um Geräte mithilfe der benutzerdefinierten Authentifizierung mit X.509 Client-Zertifikaten zu authentifizieren, müssen Sie den Authentifizierungstyp und das Anwendungsprotokoll in einer Domänenkonfiguration festlegen und die SNI-Erweiterung senden. Der Wert von authenticationType muss seinCUSTOM_AUTH_X509, und der Wert von applicationProtocol kann entweder oder seinSECURE_MQTT. HTTPS
Legen Sie den Authentifizierungstyp und das Anwendungsprotokoll in der Domänenkonfiguration (CLI) fest
Wenn Sie keine Domänenkonfiguration haben, verwenden Sie den create-domain-configuration Befehl, um eine zu erstellen. Der Wert von authenticationType muss seinCUSTOM_AUTH_X509, und der Wert von applicationProtocol kann entweder SECURE_MQTT oder seinHTTPS.
aws iot create-domain-configuration \ --domain-configuration-namedomainConfigurationName\ --authentication-typeCUSTOM_AUTH_X509\ --application-protocolSECURE_MQTT\ --authorizer-config '{ "defaultAuthorizerName":my-custom-authorizer}'
Wenn Sie bereits über eine Domänenkonfiguration verfügen, verwenden Sie bei applicationProtocol Bedarf den update-domain-configuration Befehl update authenticationType and. Beachten Sie, dass Sie den Authentifizierungstyp oder das Protokoll auf dem Standardendpunkt (iot:Data-ATS) nicht ändern können.
aws iot update-domain-configuration \ --domain-configuration-namedomainConfigurationName\ --authentication-typeCUSTOM_AUTH_X509\ --application-protocolSECURE_MQTT\ --authorizer-config '{ "defaultAuthorizerName":my-custom-authorizer}'
domain-configuration-name-
Der Name der Domänenkonfiguration.
authentication-type-
Der Authentifizierungstyp der Domänenkonfiguration. Weitere Informationen finden Sie unter Auswahl eines Authentifizierungstyps.
application-protocol-
Das Anwendungsprotokoll, mit dem Geräte kommunizieren AWS IoT Core. Weitere Informationen finden Sie unter Auswahl eines Anwendungsprotokolls.
--authorizer-config-
Ein Objekt, das die Authorizer-Konfiguration in einer Domänenkonfiguration angibt.
defaultAuthorizerName-
Der Name des Autorisierers für eine Domänenkonfiguration.
Weitere Informationen finden Sie in CreateDomainConfiguration und UpdateDomainConfiguration aus der AWS IoT API-Referenz. Weitere Informationen zur Domänenkonfiguration finden Sie unter Domänenkonfigurationen.