Benutzerdefinierte Authentifizierung mit X.509-Client-Zertifikaten - AWS IoT Core

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 X.509-Client-Zertifikaten

Wenn Sie Geräte mit verbinden AWS IoT Core, stehen Ihnen mehrere Authentifizierungstypen zur Verfügung. Sie können X.509-Clientzertifikate verwenden, mit denen Sie Client- und Geräteverbindungen authentifizieren 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-Clientzertifikaten verwenden.

Die Verwendung einer benutzerdefinierten Authentifizierung mit X.509-Zertifikaten kann hilfreich sein, wenn Sie Ihre Geräte bereits mit X.509-Zertifikaten authentifiziert haben und zusätzliche Validierungen und benutzerdefinierte Autorisierungen durchführen möchten. Wenn Sie beispielsweise die Daten Ihrer Geräte, wie z. B. deren Seriennummern, 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 Ihr Gerätesicherheitsmanagement beim Verbinden 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 X.509-Zertifikats und des benutzerdefinierten Autorisierungstyps, der sowohl mit dem Protokoll als auch mit dem MQTTProtokoll funktioniert. HTTPS Weitere Informationen zu den Authentifizierungstypen und Anwendungsprotokollen, die von AWS IoT Core Geräteendpunkten unterstützt werden, finden Sie unter Gerätekommunikationsprotokolle.

Anmerkung

Die benutzerdefinierte Authentifizierung mit X.509-Clientzertifikaten 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 Server Name Indication (SNI) angeben, wenn sie eine Verbindung herstellen AWS IoT Core.

Schritt 1: Registrieren Sie Ihre X.509-Clientzertifikate bei AWS IoT Core

Falls Sie dies noch nicht getan haben, registrieren und aktivieren Sie Ihre X.509-Client-Zertifikate mit. 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:

  1. Wenn Sie Kundenzertifikate direkt mit erstellen AWS IoT. Diese Client-Zertifikate werden automatisch bei registriert AWS IoT Core.

  2. Wenn Sie Ihre eigenen Client-Zertifikate erstellen, folgen Sie diesen Anweisungen, um sie zu registrieren AWS IoT Core.

  3. 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. Wenn ein Gerät eine Verbindung herstellt AWS IoT Core, AWS IoT Core ruft es die Autorisierungsdetails ab, einschließlich des Autorisierernamens und der zugehörigen Lambda-Funktion, und ruft die Lambda-Funktion auf. Die Lambda-Funktion empfängt ein Ereignis, das ein JSON Objekt mit den X.509-Client-Zertifikatsdaten des Geräts enthält. Ihre Lambda-Funktion verwendet dieses JSON Ereignisobjekt, um die Authentifizierungsanfrage auszuwerten, die zu ergreifenden Aktionen zu entscheiden und eine Antwort zurückzusenden.

Beispiel für ein Lambda-Funktionsereignis

Das folgende JSON Beispielobjekt enthält alle möglichen Felder, die eingeschlossen werden können. Das eigentliche JSON Objekt wird nur Felder enthalten, 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 Autorisierers aufgerufen wird. Wenn der Autorisierer so konfiguriert ist, dass er die Tokensignatur 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 Protokoll TLS (Transport Layer Security).

  • serverName— Die Hostnamenzeichenfolge mit Angabe des Servernamens (SNI). AWS IoT Core erfordert, dass Geräte die SNIErweiterung an das Transport Layer Security (TLS) -Protokoll senden und die vollständige Endpunktadresse im host_name Feld angeben.

  • x509CertificatePem- Das X.509-Zertifikat im PEM Format, das für die Client-Authentifizierung in der TLS Verbindung verwendet wird.

  • principalId- Die dem Client in der Verbindung zugeordnete Prinzipal-ID. TLS

mqtt- Dieses Objekt enthält Informationen zum Protokoll TLS (Transport Layer Security).

  • clientId- Eine Zeichenfolge muss nur für den Fall angegeben 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 Fehlerbehebung 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 derselbe 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 JSON Ereignisobjekt 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 von der benutzerdefinierten Autorisierungsanfrage gesendete Token dient. 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 principalId muss mit dem Wert von principalId im JSON Ereignisobjekt (d. h. certificateId des X.509-Zertifikats) identisch sein.

policyDocuments

Eine Liste von JSON Richtliniendokumenten im -Format. AWS IoT Core Der Wert ist optional und unterstützt Dingrichtlinienvariablen 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 gesamte Lebensdauer einer Verbindung und wird bei aufeinanderfolgenden Richtlinienaktualisierungen nicht aktualisiert.

refreshAfterInSeconds

Eine Ganzzahl, die das Intervall zwischen Richtlinienaktualisierungen angibt. Wenn dieses Intervall abgelaufen ist, AWS IoT Core ruft die Lambda-Funktion auf, 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 für eine Lambda-Funktion von Node.js. Die Funktion untersucht das X.509-Zertifikat des Clients und extrahiert relevante Informationen wie die Seriennummer, den Fingerabdruck und den Namen des Antragstellers. Wenn die extrahierten Informationen den erwarteten Werten entsprechen, wird dem Client der Zugriff auf die Verbindung gewährt. 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 Folgendes zurückJSON, wenn sie ein Zertifikat mit der erwarteten Seriennummer, dem Fingerabdruck und dem Betreff empfängt. Der Wert von x509CertificatePem entspricht dem im TLS Handshake bereitgestellten Client-Zertifikat. 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 Authorizer, um Ihre eigene Client-Authentifizierungs- und Autorisierungslogik zu verwalten. Sie können den detaillierten Anweisungen in Schritt 3: Erstellen einer 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 AWS IoT zum Aufrufen Ihrer Lambda-Funktion.

Schritt 4: Legen Sie den Authentifizierungstyp und das Anwendungsprotokoll in einer Domänenkonfiguration fest

Um Geräte mithilfe einer benutzerdefinierten Authentifizierung mit X.509-Clientzertifikaten 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 fest (CLI)

Wenn Sie keine Domänenkonfiguration haben, verwenden Sie den create-domain-configurationBefehl, 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-name domainConfigurationName \ --authentication-type CUSTOM_AUTH_X509 \ --application-protocol SECURE_MQTT \ --authorizer-config '{ "defaultAuthorizerName": my-custom-authorizer }'

Wenn Sie bereits über eine Domänenkonfiguration verfügen, verwenden Sie bei applicationProtocol Bedarf den update-domain-configurationBefehl update authenticationType und. Beachten Sie, dass Sie den Authentifizierungstyp oder das Authentifizierungsprotokoll auf dem Standardendpunkt (iot:Data-ATS) nicht ändern können.

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

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 Autorisierungskonfiguration in einer Domänenkonfiguration spezifiziert.

defaultAuthorizerName

Der Name des Autorisierers für eine Domänenkonfiguration.

Weitere Informationen finden Sie in CreateDomainConfigurationund UpdateDomainConfigurationaus der AWS IoT APIReferenz. Weitere Informationen zur Domänenkonfiguration finden Sie unter Domänenkonfigurationen.