

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.

# Benutzerspezifische Authentifizierung und Autorisierung
<a name="custom-authentication"></a>

 AWS IoT Core ermöglicht es Ihnen, benutzerdefinierte Autorisierer zu definieren, sodass Sie Ihre eigene Client-Authentifizierung und -Autorisierung verwalten können. Dies ist nützlich, wenn Sie andere Authentifizierungsmechanismen als die verwenden müssen, die von Haus aus unterstützt werden. AWS IoT Core (Weitere Informationen zu den nativ unterstützten Mechanismen finden Sie unter [Client-Authentifizierung](client-authentication.md).)  

 Wenn Sie beispielsweise vorhandene Geräte vor Ort zu migrieren AWS IoT Core und diese Geräte ein benutzerdefiniertes Bearer-Token oder einen MQTT-Benutzernamen und ein Passwort zur Authentifizierung verwenden, können Sie sie zu migrieren, AWS IoT Core ohne ihnen neue Identitäten bereitstellen zu müssen. Sie können die benutzerdefinierte Authentifizierung mit jedem der unterstützten Kommunikationsprotokolle verwenden. AWS IoT Core Weitere Informationen zu von AWS IoT Core unterstützten Protokollen finden Sie unter [Gerätekommunikationsprotokolle](protocols.md). 

**Topics**
+ [Grundlegendes zum Workflow für die benutzerdefinierte Authentifizierung](custom-authorizer.md)
+ [Benutzerdefinierte Autorisierer (CLI) erstellen und verwalten](config-custom-auth.md)
+ [Benutzerdefinierte Authentifizierung mit X.509-Client-Zertifikaten](custom-auth-509cert.md)
+ [Mithilfe der benutzerdefinierten Authentifizierung AWS IoT Core wird eine Verbindung hergestellt](custom-auth.md)
+ [Fehlerbehebung für Ihre Genehmiger](custom-auth-troubleshooting.md)

# Grundlegendes zum Workflow für die benutzerdefinierte Authentifizierung
<a name="custom-authorizer"></a>

Mit der benutzerdefinierten Authentifizierung können Sie festlegen, wie Cliente mithilfe von [Genehmigerressourcen](https://docs.aws.amazon.com/iot/latest/apireference/API_AuthorizerDescription.html) authentifiziert und autorisiert werden.  Jeder Autorisierer enthält einen Verweis auf eine vom Kunden verwaltete Lambda-Funktion, einen optionalen öffentlichen Schlüssel zur Überprüfung der Geräteanmeldedaten und zusätzliche Konfigurationsinformationen. Das folgende Diagramm veranschaulicht den Autorisierungsablauf für die benutzerdefinierte Authentifizierung in. AWS IoT Core

![\[Benutzerdefinierter Autorisierungsworkflow für die benutzerdefinierte Authentifizierung in AWS IoT Core.\]](http://docs.aws.amazon.com/de_de/iot/latest/developerguide/images/custom-authentication.png)


## AWS IoT Core benutzerdefinierter Authentifizierungs- und Autorisierungs-Workflow
<a name="custom-authentication-workflow"></a>

In der folgenden Liste werden die einzelnen Schritte des benutzerdefinierten Authentifizierungs- und Autorisierungsworkflows erläutert.

1. Ein Gerät stellt über einen der unterstützten Geräte eine Verbindung zum AWS IoT Core Datenendpunkt eines Kunden her[Gerätekommunikationsprotokolle](protocols.md). Das Gerät übergibt Anmeldeinformationen entweder in den Header-Feldern oder Abfrageparametern der Anfrage (für die WebSockets Protokolle HTTP Publish oder MQTT over) oder in das Feld für den Benutzernamen und das Passwort der MQTT CONNECT-Nachricht (für die Protokolle MQTT und MQTT over). WebSockets 

1. AWS IoT Core prüft auf eine von zwei Bedingungen:
   + Die eingehende Anforderung gibt einen Genehmiger an.
   + Für den AWS IoT Core Datenendpunkt, der die Anfrage empfängt, ist ein Standardautorisierer dafür konfiguriert.

   Wenn auf AWS IoT Core eine dieser Arten ein Autorisierer gefunden wird, wird die dem Autorisierer zugeordnete Lambda-Funktion AWS IoT Core ausgelöst.

1.  (Optional) Wenn Sie die Tokensignatur aktiviert haben, AWS IoT Core validiert die Anforderungssignatur mithilfe des im Autorisierer gespeicherten öffentlichen Schlüssels, bevor die Lambda-Funktion ausgelöst wird. Wenn die Validierung fehlschlägt, stoppt AWS IoT Core die Anforderung, ohne die Lambda-Funktion aufzurufen.  

1. Die Lambda-Funktion empfängt die Anmeldeinformationen und Verbindungsmetadaten in der Anforderung und trifft eine Authentifizierungsentscheidung.

1. Die Lambda-Funktion gibt die Ergebnisse der Authentifizierungsentscheidung und ein AWS IoT Core Richtliniendokument zurück, das festlegt, welche Aktionen in der Verbindung zulässig sind. Die Lambda-Funktion gibt auch Informationen zurück, die angeben, wie oft die Anmeldeinformationen in der Anfrage AWS IoT Core erneut validiert werden, indem die Lambda-Funktion aufgerufen wird.

1. AWS IoT Core bewertet die Aktivität auf der Verbindung anhand der Richtlinie, die sie von der Lambda-Funktion erhalten hat.

1. Nachdem die Verbindung hergestellt wurde und Ihr benutzerdefinierter Authorizer Lambda zum ersten Mal aufgerufen wurde, kann der nächste Aufruf bei inaktiven Verbindungen ohne MQTT-Operationen um bis zu 5 Minuten verzögert werden. Danach folgen nachfolgende Aufrufe dem Aktualisierungsintervall in Ihrem benutzerdefinierten Authorizer Lambda. Dieser Ansatz kann übermäßige Aufrufe verhindern, die Ihr Lambda-Parallelitätslimit überschreiten könnten. AWS-Konto

## Überlegungen zur Skalierung
<a name="custom-authentication-scaling"></a>

 Da eine Lambda-Funktion die Authentifizierung und Autorisierung für Ihren Genehmiger abwickelt, unterliegt die Funktion den Lambda-Preis- und Servicebeschränkungen, z. B. der Rate der gleichzeitigen Ausführung. Weitere Informationen zu den Preisen für Lambda finden Sie unter [Lambda-Preise](https://aws.amazon.com/lambda/pricing/). Sie können die Belastung Ihrer Lambda-Funktion verwalten, indem Sie die `refreshAfterInSeconds`- und `disconnectAfterInSeconds`-Parameter in Ihrer Lambda-Funktionsantwort anpassen. Weitere Informationen über den Inhalt Ihrer Lambda-Funktionsantwort finden Sie unter [Definieren Ihrer Lambda-Funktion](custom-auth-lambda.md).

**Anmerkung**  
Wenn Sie die Signierung aktiviert lassen, können Sie verhindern, dass Ihr Lambda übermäßig oft durch unbekannte Clients ausgelöst wird. Bedenken Sie dies, bevor Sie die Signierung in Ihrem Genehmiger deaktivieren.

**Anmerkung**  
Das Timeout-Limit der Lambda-Funktion für den benutzerdefinierten Genehmiger beträgt 5 Sekunden.

# Benutzerdefinierte Autorisierer (CLI) erstellen und verwalten
<a name="config-custom-auth"></a>

AWS IoT Core implementiert benutzerdefinierte Authentifizierungs- und Autorisierungsschemata mithilfe benutzerdefinierter Autorisierer. Ein benutzerdefinierter Autorisierer ist eine AWS IoT Core Ressource, die Ihnen die Flexibilität bietet, Regeln und Richtlinien auf der Grundlage Ihrer spezifischen Anforderungen zu definieren und zu implementieren. Informationen zum Erstellen eines benutzerdefinierten Autorisierers mit step-by-step Anweisungen finden Sie unter [Tutorial: Erstellen eines benutzerdefinierten Autorisierers](https://docs.aws.amazon.com//iot/latest/developerguide/custom-auth-tutorial.html) für. AWS IoT Core

Jeder Genehmiger umfasst folgende Komponenten: 
+  *Name*: Eine eindeutige benutzerdefinierte Zeichenfolge, in der der Genehmiger identifiziert wird.
+  *ARN der Lambda-Funktion*: Der Amazon-Ressourcenname (ARN) der Lambda-Funktion, die die Autorisierungs- und Authentifizierungslogik implementiert.  
+  *Token-Schlüsselname*: Der Schlüsselname, der verwendet wird, um das Token aus den HTTP-Headern, Abfrageparametern oder dem MQTT-CONNECT-Benutzernamen zu extrahieren, um die Signaturvalidierung durchzuführen. Dieser Wert ist erforderlich, wenn in Ihrem Genehmiger die Signierung aktiviert ist. 
+  *Markierung „Signieren deaktiviert“ (optional)*: Ein boolescher Wert, der angibt, ob die Signaturanforderung für Anmeldeinformationen deaktiviert werden soll. Dies ist nützlich für Szenarien, in denen das Signieren der Anmeldeinformationen keinen Sinn macht, z. B. bei Authentifizierungsschemata, die MQTT-Benutzernamen und -Passwörter verwenden. Der Standardwert ist `false`, also ist das Signieren standardmäßig aktiviert. 
+  *Öffentlicher Schlüssel zur Tokensignierung*: Der öffentliche Schlüssel, den AWS IoT Core zur Validierung der Tokensignatur verwendet. Die Mindestlänge beträgt 2.048 Bit. Dieser Wert ist erforderlich, wenn in Ihrem Genehmiger die Signierung aktiviert ist.  

Lambda berechnet Ihnen die Anzahl der Ausführungen Ihrer Lambda-Funktion und die Dauer der Ausführung des Codes in Ihrer Funktion. Weitere Informationen zu den Preisen für Lambda finden Sie unter [Lambda-Preise](https://aws.amazon.com/lambda/pricing/). Weitere Informationen zum Erstellen von Lambda-Funktionen finden Sie im [Lambda-Entwicklerhandbuch](https://docs.aws.amazon.com/lambda/latest/dg/).

**Anmerkung**  
Wenn Sie die Signierung aktiviert lassen, können Sie verhindern, dass Ihr Lambda übermäßig oft durch unbekannte Clients ausgelöst wird. Bedenken Sie dies, bevor Sie die Signierung in Ihrem Genehmiger deaktivieren.

**Anmerkung**  
Das Timeout-Limit der Lambda-Funktion für den benutzerdefinierten Genehmiger beträgt 5 Sekunden.

**Topics**
+ [Definieren Ihrer Lambda-Funktion](custom-auth-lambda.md)
+ [Erstellen eines Genehmigers](custom-auth-create-authorizer.md)
+ [Autorisieren AWS IoT zum Aufrufen Ihrer Lambda-Funktion](custom-auth-authorize.md)
+ [Testen Ihrer Genehmiger](custom-auth-testing.md)
+ [Verwalten von benutzerdefinierten Genehmigern](custom-auth-manage.md)

# Definieren Ihrer Lambda-Funktion
<a name="custom-auth-lambda"></a>

 Wenn AWS IoT Core Sie Ihren Autorisierer aufrufen, löst er das dem Autorisierer zugeordnete Lambda mit einem Ereignis aus, das das folgende JSON-Objekt enthält. Das JSON-Beispielobjekt enthält alle möglichen Felder. Felder, die für die Verbindungsanforderung nicht relevant sind, sind nicht enthalten.

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

 Die Lambda-Funktion sollte diese Informationen verwenden, um die eingehende Verbindung zu authentifizieren und zu entscheiden, welche Aktionen in der Verbindung zulässig sind. Die Funktion sollte eine Antwort senden, die die folgenden Werte enthält. 
+  `isAuthenticated`: Ein boolescher Wert, der angibt, ob die Anforderung authentifiziert wurde.
+  `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 und dem folgenden regulären Ausdrucksmuster (Regex) entsprechen: `([a-zA-Z0-9]){1,128}`. Sonderzeichen, die nicht alphanumerisch sind, dürfen nicht zusammen mit dem in verwendet werden. `principalId` AWS IoT Core Informationen darüber, ob nicht-alphanumerische Sonderzeichen für die zulässig sind, finden Sie in der Dokumentation zu anderen AWS Diensten. `principalId`
+  `policyDocuments`: Eine Liste von AWS IoT Core Richtliniendokumenten im JSON-Format Weitere Informationen zum Erstellen von Richtlinien finden Sie unter. AWS IoT Core [AWS IoT Core Richtlinien](iot-policies.md) Die maximale Anzahl von Richtliniendokumenten ist 10. Jedes Richtliniendokument darf maximal 2048 Zeichen enthalten.
+  `disconnectAfterInSeconds`: Eine Ganzzahl, die die maximale Dauer der Verbindung zum AWS IoT Core -Gateway angibt (in Sekunden). Der Mindestwert ist 300 Sekunden und der Höchstwert 86 400 Sekunden. Der Standardwert ist 86.400.
**Anmerkung**  
Der Wert von `disconnectAfterInSeconds` (von der Lambda-Funktion zurückgegeben) wird festgelegt, wenn die Verbindung hergestellt wird. Dieser Wert kann bei nachfolgenden Lambda-Aufrufen zur Richtlinienaktualisierung nicht geändert werden.
+  `refreshAfterInSeconds`: Eine Ganzzahl, die das Intervall zwischen Richtlinienaktualisierungen angibt. Wenn dieses Intervall abläuft, ruft AWS IoT Core die Lambda-Funktion auf, um Richtlinienaktualisierungen zu ermöglichen. Der Mindestwert ist 300 Sekunden und der Höchstwert 86 400 Sekunden. 

  Das folgende JSON-Objekt enthält ein Beispiel für eine Antwort, die Ihre Lambda-Funktion senden kann. 

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

 Der `policyDocument` Wert muss ein AWS IoT Core gültiges Richtliniendokument enthalten. Weitere Informationen zu AWS IoT Core Richtlinien finden Sie unter[AWS IoT Core Richtlinien](iot-policies.md). In MQTT über TLS und MQTT über WebSockets Verbindungen wird diese Richtlinie für das im Feldwert angegebene Intervall AWS IoT Core zwischengespeichert. `refreshAfterInSeconds` Bei HTTP-Verbindungen wird die Lambda-Funktion für jede Autorisierungsanforderung aufgerufen, es sei denn, Ihr Gerät verwendet persistente HTTP-Verbindungen (auch HTTP-Keep-Alive oder HTTP-Verbindungswiederverwendung genannt). Sie können bei der Konfiguration des Genehmigers wählen, ob Sie das Caching aktivieren möchten. AWS IoT Core Autorisiert während dieses Intervalls Aktionen in einer bestehenden Verbindung gegen diese zwischengespeicherte Richtlinie, ohne dass Ihre Lambda-Funktion erneut ausgelöst wird. Wenn bei der benutzerdefinierten Authentifizierung Fehler auftreten, AWS IoT Core wird die Verbindung beendet. AWS IoT Core beendet die Verbindung auch, wenn sie länger als der im Parameter angegebene Wert geöffnet war. `disconnectAfterInSeconds` 

 Im Folgenden finden JavaScript Sie eine Lambda-Beispielfunktion von Node.js, die in der MQTT Connect-Nachricht nach einem Passwort mit dem Wert von sucht `test` und eine Richtlinie zurückgibt, die die Erlaubnis erteilt, eine Verbindung AWS IoT Core mit einem Client herzustellen `myClientName` und zu einem Thema zu veröffentlichen, das denselben Clientnamen enthält. Wenn es das erwartete Passwort nicht findet, gibt es eine Richtlinie zurück, die diese beiden Aktionen verweigert. 

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

 Die vorhergehende Lambda-Funktion gibt das folgende JSON zurück, wenn sie das erwartete Passwort von `test` in der MQTT-Connect-Nachricht empfängt. Die Werte der `password`- und `principalId`-Eigenschaften sind die Werte aus der MQTT-Connect-Nachricht.

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

# Erstellen eines Genehmigers
<a name="custom-auth-create-authorizer"></a>

 [Sie können mithilfe der API einen Autorisierer erstellen. CreateAuthorizer](https://docs.aws.amazon.com/iot/latest/apireference/API_CreateAuthorizer.html) Das folgende Beispiel beschreibt den Befehl. 

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

Sie können den `signing-disabled`-Parameter verwenden, um die Signaturvalidierung für jeden Aufruf Ihres Genehmigers zu deaktivieren. Es wird ausdrücklich empfohlen, dass die Signierung nur wenn unbedingt notwendig zu deaktivieren. Die Signaturvalidierung schützt Sie vor übermäßigen Aufrufen Ihrer Lambda-Funktion von unbekannten Geräten. Sie können den `signing-disabled`-Status eines Genehmigers nicht mehr ändern, nachdem Sie ihn erstellt haben. Zum Ändern dieses Verhaltens müssen Sie einen anderen benutzerdefinierten Genehmiger mit einem anderen Wert für den `signing-disabled`-Parameter erstellen. 

Die Werte für die `tokenKeyName`- und `tokenSigningPublicKeys`-Parameter sind optional, wenn Sie das Signieren deaktiviert haben. Sie sind jedoch erforderlich, wenn das Signieren aktiviert ist. 

Nachdem Sie Ihre Lambda-Funktion und den benutzerdefinierten Autorisierer erstellt haben, müssen Sie dem AWS IoT Core Dienst ausdrücklich die Berechtigung erteilen, die Funktion in Ihrem Namen aufzurufen. Sie können dies mit dem folgenden Befehl tun. 

**Anmerkung**  
Der Standard-IoT-Endpunkt unterstützt möglicherweise nicht die Verwendung von benutzerdefinierten Autorisierern mit Lambda-Funktionen. Stattdessen können Sie Domänenkonfigurationen verwenden, um einen neuen Endpunkt zu definieren und diesen Endpunkt dann für den benutzerdefinierten Autorisierer anzugeben.

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

# Autorisieren AWS IoT zum Aufrufen Ihrer Lambda-Funktion
<a name="custom-auth-authorize"></a>

In diesem Abschnitt erteilen Sie der benutzerdefinierten Autorisierungsressource, die Sie gerade erstellt haben, die Erlaubnis, die Lambda-Funktion auszuführen. Um die Berechtigung zu erteilen, können Sie den CLI-Befehl [add-permission](https://docs.aws.amazon.com//cli/latest/reference/lambda/add-permission.html) verwenden.

**Erteilen Sie Ihrer Lambda-Funktion die Erlaubnis mit dem AWS CLI**

1. Geben Sie nach der Eingabe Ihrer Werte den folgenden Befehl ein. Beachten Sie, dass der Wert `statement-id` eindeutig sein muss. `Id-1234`Ersetzen Sie es durch den exakten Wert, den Sie haben, andernfalls wird möglicherweise eine `ResourceConflictException` Fehlermeldung angezeigt.

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

1. Wenn der Befehl erfolgreich ist, gibt er eine Berechtigungsanweisung zurück, wie in diesem Beispiel. Sie können mit dem nächsten Abschnitt fortfahren, um den benutzerdefinierten Autorisierer zu testen.

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

   Wenn der Befehl nicht erfolgreich ist, wird ein Fehler zurückgegeben, wie in diesem Beispiel. Sie müssen den Fehler überprüfen und korrigieren, bevor Sie fortfahren können.

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

# Testen Ihrer Genehmiger
<a name="custom-auth-testing"></a>

 Sie können die [TestInvokeAuthorizer](https://docs.aws.amazon.com/iot/latest/apireference/API_TestInvokeAuthorizer.html)API verwenden, um den Aufruf und die Rückgabewerte Ihres Autorisierers zu testen. Mit dieser API können Sie Protokollmetadaten angeben und die Signaturvalidierung in Ihrem Authorizer testen.

Die folgenden Tabs zeigen, wie Sie den verwenden können, AWS CLI um Ihren Authorizer zu testen.

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

------

Der Wert des `token-signature`-Parameters ist das signierte Token. Weitere Informationen zum Abrufen dieses Werts finden Sie unter [Signieren des Tokens](custom-auth.md#custom-auth-token-signature).

Wenn Ihr Genehmiger einen Benutzernamen und ein Passwort verwendet, können Sie diese Informationen mithilfe des `--mqtt-context`-Parameters weitergeben. Die folgenden Registerkarten zeigen, wie Sie mithilfe der `TestInvokeAuthorizer`-API ein JSON-Objekt, das einen Benutzernamen, ein Passwort und einen Clientnamen enthält, an Ihren benutzerdefinierten Genehmiger senden.

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

------

Das Passwort muss base64-kodiert sein. Das folgende Beispiel zeigt, wie Sie ein Passwort in einer Unix-ähnlichen Umgebung kodieren.

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

# Verwalten von benutzerdefinierten Genehmigern
<a name="custom-auth-manage"></a>

 Sie können Ihre Autorisierer wie folgt verwalten. APIs 
+ [ListAuthorizers](https://docs.aws.amazon.com/iot/latest/apireference/API_ListAuthorizers.html): Zeigt alle Autorisierer in Ihrem Konto an.
+  [DescribeAuthorizer](https://docs.aws.amazon.com/iot/latest/apireference/API_DescribeAuthorizer.html): Zeigt die Eigenschaften des angegebenen Autorisierers an. Zu diesen Werten gehören das Erstellungsdatum, das Datum der letzten Änderung und andere Attribute.
+ [SetDefaultAuthorizer](https://docs.aws.amazon.com/iot/latest/apireference/API_SetDefaultAuthorizer.html): Gibt den Standardautorisierer für Ihre AWS IoT Core Datenendpunkte an. AWS IoT Core verwendet diesen Autorisierer, wenn ein Gerät keine AWS IoT Core Anmeldeinformationen weitergibt und keinen Autorisierer angibt. Weitere Informationen zur Verwendung von AWS IoT Core Anmeldeinformationen finden Sie unter. [Client-Authentifizierung](client-authentication.md)
+ [UpdateAuthorizer](https://docs.aws.amazon.com/iot/latest/apireference/API_UpdateAuthorizer.html): Ändert den Status, den Namen des Token-Schlüssels oder die öffentlichen Schlüssel für den angegebenen Autorisierer.
+  [DeleteAuthorizer](https://docs.aws.amazon.com/iot/latest/apireference/API_DeleteAuthorizer.html): Löscht den angegebenen Autorisierer. 

**Anmerkung**  
 Sie können die Signaturanforderungen eines Genehmigers nicht aktualisieren. Das bedeutet, dass Sie das Signieren in einem vorhandenen Genehmiger, der dies fordert, nicht deaktivieren können. Sie können auch nicht die Anmeldung bei einem vorhandenen Genehmiger verlangen, der dies nicht fordert. 

# Benutzerdefinierte Authentifizierung mit X.509-Client-Zertifikaten
<a name="custom-auth-509cert"></a>

Wenn Sie Geräte mit verbinden AWS IoT Core, stehen Ihnen mehrere [Authentifizierungstypen](protocols.md#connection-protocol-auth-mode) zur Verfügung. Sie können [X.509-Clientzertifikate](https://docs.aws.amazon.com//iot/latest/developerguide/x509-client-certs.html) verwenden, mit denen Sie Client- und Geräteverbindungen authentifizieren können, oder [benutzerdefinierte Autorisierer definieren, um Ihre eigene Client-Authentifizierungs- und Autorisierungslogik](https://docs.aws.amazon.com//iot/latest/developerguide/custom-authentication.html) 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 [MQTT-Protokoll als auch mit dem HTTPS-Protokoll](https://docs.aws.amazon.com//iot/latest/developerguide/mqtt.html) funktioniert.](https://docs.aws.amazon.com//iot/latest/developerguide/http.html) [Weitere Informationen zu den Authentifizierungstypen und Anwendungsprotokollen, die von AWS IoT Core Geräteendpunkten unterstützt werden, finden Sie unter Gerätekommunikationsprotokolle.](https://docs.aws.amazon.com//iot/latest/developerguide/protocols.html)

**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](iot-custom-endpoints-configurable.md) erstellt wurde. Darüber hinaus müssen Clients die Erweiterung [Server Name Indication (SNI)](https://www.rfc-editor.org/rfc/rfc3546#section-3.1) angeben, wenn sie eine Verbindung herstellen AWS IoT Core.

**Topics**
+ [Schritt 1: Registrieren Sie Ihre X.509-Clientzertifikate bei AWS IoT Core](#custom-auth-509cert-client)
+ [Schritt 2: Erstellen einer Lambda-Funktion](#custom-auth-509cert-lambda)
+ [Schritt 3: Erstellen Sie einen benutzerdefinierten Autorisierer](#custom-auth-509cert-authorizer)
+ [Schritt 4: Legen Sie den Authentifizierungstyp und das Anwendungsprotokoll in einer Domänenkonfiguration fest](#custom-auth-509cert-domainconfig)

## Schritt 1: Registrieren Sie Ihre X.509-Clientzertifikate bei AWS IoT Core
<a name="custom-auth-509cert-client"></a>

Falls Sie dies noch nicht getan haben, registrieren und aktivieren Sie Ihre [X.509-Client-Zertifikate](https://docs.aws.amazon.com//iot/latest/developerguide/x509-client-certs.html) 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](https://docs.aws.amazon.com//iot/latest/developerguide/device-certs-create.html). Diese Client-Zertifikate werden automatisch bei registriert AWS IoT Core.

1. Wenn Sie [Ihre eigenen Client-Zertifikate erstellen](https://docs.aws.amazon.com//iot/latest/developerguide/device-certs-your-own.html), folgen Sie [diesen Anweisungen, um sie zu registrieren AWS IoT Core](https://docs.aws.amazon.com//iot/latest/developerguide/register-device-cert.html).

1. Folgen Sie [diesen Anweisungen](https://docs.aws.amazon.com//iot/latest/developerguide/activate-or-deactivate-device-cert.html), um Ihre Client-Zertifikate zu aktivieren.

## Schritt 2: Erstellen einer Lambda-Funktion
<a name="custom-auth-509cert-lambda"></a>

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 Event-JSON-Objekt, um die Authentifizierungsanfrage auszuwerten, die zu ergreifenden Aktionen zu entscheiden und eine Antwort zurückzusenden.

### Beispiel für ein Lambda-Funktionsereignis
<a name="custom-auth-509cert-event"></a>

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 Authentifizierung, Autorisierung und mehr nützlich sein können.  
`tls`- Dieses Objekt enthält Informationen zum TLS-Protokoll (Transport Layer Security).   
+ `serverName`- Die Hostnamenzeichenfolge [(Server Name Indication, SNI)](https://www.rfc-editor.org/rfc/rfc3546#section-3.1). AWS IoT Core erfordert, dass Geräte die [SNI-Erweiterung](https://www.rfc-editor.org/rfc/rfc3546#section-3.1) an das Transport Layer Security (TLS) -Protokoll senden und die vollständige Endpunktadresse vor Ort 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 dem Client in der TLS-Verbindung zugeordnete Prinzipal-ID.
`mqtt`- Dieses Objekt enthält Informationen zum MQTT-Protokoll.  
+ `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**  
In diesem Fall `principalId` handelt es sich um das JSON-Objekt `x509CertificatePem` und um zwei neue Felder in der Anfrage. Der Wert von `principalId` ist derselbe wie der Wert von`certificateId`. Weitere Informationen finden Sie unter [Zertifikat](https://docs.aws.amazon.com//iot/latest/apireference/API_Certificate.html).

### Beispiel für eine Antwort auf eine Lambda-Funktion
<a name="custom-auth-509cert-response"></a>

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 Event-JSON-Objekt identisch sein (d. h. certificateId des X.509-Zertifikats).

`policyDocuments`  
Eine Liste von Richtliniendokumenten im AWS IoT Core JSON-Format. Der Wert ist optional und unterstützt [Ding-Richtlinienvariablen und [Zertifikatsrichtlinienvariablen](https://docs.aws.amazon.com//iot/latest/developerguide/cert-policy-variables.html)](https://docs.aws.amazon.com//iot/latest/developerguide/thing-policy-variables.html). 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](https://docs.aws.amazon.com//iot/latest/developerguide/iot-policies.html).

`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. `disconnectAfterInSeconds`gilt 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
<a name="custom-auth-509cert-js-example"></a>

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 das folgende JSON zurück, wenn sie ein Zertifikat mit der erwarteten Seriennummer, dem Fingerabdruck und dem Betreff empfängt. Der Wert von ist `x509CertificatePem` das im TLS-Handshake bereitgestellte Client-Zertifikat. Weitere Informationen finden Sie unter [Definieren Ihrer Lambda-Funktion](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
}
```

## Schritt 3: Erstellen Sie einen benutzerdefinierten Autorisierer
<a name="custom-auth-509cert-authorizer"></a>

Nachdem [Sie die Lambda-Funktion definiert haben](#custom-auth-509cert-lambda), 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](https://docs.aws.amazon.com//iot/latest/developerguide/custom-auth-tutorial.html#custom-auth-tutorial-authorizer) folgen. Weitere Informationen finden Sie unter [Einen Autorisierer erstellen](https://docs.aws.amazon.com//iot/latest/developerguide/config-custom-auth.html). 

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](custom-auth-authorize.md).

## Schritt 4: Legen Sie den Authentifizierungstyp und das Anwendungsprotokoll in einer Domänenkonfiguration fest
<a name="custom-auth-509cert-domainconfig"></a>

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 sein`CUSTOM_AUTH_X509`, und der Wert von `applicationProtocol` kann entweder oder sein. `SECURE_MQTT` `HTTPS`

### Legen Sie den Authentifizierungstyp und das Anwendungsprotokoll in der Domänenkonfiguration (CLI) fest
<a name="custom-auth-509cert-cli"></a>

Wenn Sie keine Domänenkonfiguration haben, verwenden Sie den [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)Befehl, um eine zu erstellen. Der Wert von `authenticationType` muss sein`CUSTOM_AUTH_X509`, und der Wert von `applicationProtocol` kann entweder `SECURE_MQTT` oder sein`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
    }'
```

Wenn Sie bereits über eine Domänenkonfiguration verfügen, verwenden Sie bei `applicationProtocol` Bedarf den [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)Befehl 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](protocols.md#connection-protocol-auth-mode).

`application-protocol`  
Das Anwendungsprotokoll, mit dem Geräte kommunizieren AWS IoT Core. Weitere Informationen finden Sie unter [Auswahl eines Anwendungsprotokolls](protocols.md#protocol-selection).

`--authorizer-config`  
Ein Objekt, das die Autorisierungskonfiguration in einer Domänenkonfiguration angibt.

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

Weitere Informationen finden Sie unter [CreateDomainConfiguration](https://docs.aws.amazon.com//iot/latest/apireference/API_CreateDomainConfiguration.html)und in [UpdateDomainConfiguration](https://docs.aws.amazon.com//iot/latest/apireference/API_UpdateDomainConfiguration.html)der *AWS IoT API-Referenz.* Weitere Informationen zur Domänenkonfiguration finden Sie unter [Domänenkonfigurationen](https://docs.aws.amazon.com//iot/latest/developerguide/iot-custom-endpoints-configurable.html).

# Mithilfe der benutzerdefinierten Authentifizierung AWS IoT Core wird eine Verbindung hergestellt
<a name="custom-auth"></a>

 Geräte können AWS IoT Core mithilfe der benutzerdefinierten Authentifizierung mit jedem Protokoll, das Geräte-Messaging AWS IoT Core unterstützt, eine Verbindung herstellen. Weitere Informationen zu unterstützten Kommunikationsprotokollen finden Sie unter [Gerätekommunikationsprotokolle](protocols.md).  Die Verbindungsdaten, die Sie an die Lambda-Funktion Ihres Genehmigers übergeben, hängen vom verwendeten Protokoll ab. Weitere Informationen zum Erstellen der Lambda-Funktion Ihres Genehmigers finden Sie unter [Definieren Ihrer Lambda-Funktion](custom-auth-lambda.md). In den folgenden Abschnitten wird erläutert, wie Sie eine Verbindung zur Authentifizierung mit jedem unterstützten Protokoll herstellen.

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

Geräte, an die Daten AWS IoT Core mithilfe der [HTTP Publish API](https://docs.aws.amazon.com/iot/latest/apireference/API_iotdata_Publish.html) gesendet werden, können Anmeldeinformationen entweder über Anforderungsheader oder Abfrageparameter in ihren HTTP-POST-Anfragen übergeben. Geräte können mithilfe des Header- oder Abfrageparameters `x-amz-customauthorizer-name` einen aufzurufenden Genehmiger angeben. Wenn Sie die Tokensignatur in Ihrem Genehmiger aktiviert haben, müssen Sie den `token-key-name` und die `x-amz-customauthorizer-signature` entweder in den Anforderungsheadern oder Abfrageparametern übergeben. Beachten Sie, dass der `token-signature` Wert URL-codiert sein muss, wenn er vom Browser JavaScript aus verwendet wird.

**Anmerkung**  
Der Kundengenehmiger für das HTTPS-Protokoll unterstützt nur Veröffentlichungsvorgänge. Weitere Informationen über das HTTP-Protokoll finden Sie unter [Gerätekommunikationsprotokolle](protocols.md).

Die folgenden Beispielanforderungen zeigen, wie Sie diese Parameter sowohl in Anforderungsheadern als auch in Abfrageparametern übergeben. 

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

 Geräte, die über eine MQTT-Verbindung eine Verbindung herstellen, können Anmeldeinformationen über die `password` Felder `username` und AWS IoT Core von MQTT-Nachrichten weiterleiten. Der Wert `username` kann optional auch eine Abfragezeichenfolge enthalten, die zusätzliche Werte (einschließlich eines Tokens, einer Signatur und eines Genehmigernamens) an Ihren Genehmiger übergibt. Sie können diese Abfragezeichenfolge verwenden, wenn Sie anstelle der Werte `username` und `password` ein tokenbasiertes Authentifizierungsschema verwenden möchten.  

**Anmerkung**  
 Die Daten im Passwortfeld sind Base64-codiert von. AWS IoT Core Ihre Lambda-Funktion muss sie dekodieren. 

 Das folgende Beispiel enthält eine `username`-Zeichenfolge mit zusätzlichen Parametern, die ein Token und eine Signatur angeben.  

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

Um einen Authorizer aufzurufen, müssen Geräte, die über MQTT und benutzerdefinierte Authentifizierung eine Verbindung herstellen, eine Verbindung über Port 443 herstellen. AWS IoT Core Sie müssen außerdem die TLS-Erweiterung Application Layer Protocol Negotiation (ALPN) mit dem Wert `mqtt` und die Erweiterung Server Name Indication (SNI) mit dem Hostnamen ihres Datenendpunkts übergeben. AWS IoT Core Der Wert `x-amz-customauthorizer-signature` sollte URL-kodiert sein, um Fehler zu vermeiden. Wir empfehlen außerdem dringend, dass die Werte `x-amz-customauthorizer-name` und `token-key-name` URL-kodiert sind. Weitere Informationen zu diesen Werten finden Sie unter [Gerätekommunikationsprotokolle](protocols.md). Die V2 [AWS IoT Geräte SDKs - SDKs, Mobil- und AWS IoT Geräteclient](iot-sdks.md) kann diese beiden Erweiterungen konfigurieren. 

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

 Geräte, die AWS IoT Core über MQTT-Over eine Verbindung herstellen, WebSockets können Anmeldeinformationen auf eine der beiden folgenden Arten weitergeben. 
+ Über Anforderungsheader oder Abfrageparameter in der HTTP-UPGRADE-Anfrage, um die WebSockets Verbindung herzustellen.
+ Über die Felder `username` und `password` in der MQTT-CONNECT-Nachricht.

 Wenn Sie Anmeldeinformationen über die MQTT-Connect-Nachricht weitergeben, sind die TLS-Erweiterungen ALPN und SNI erforderlich. Weitere Informationen zu diesen Erweiterungen finden Sie unter [MQTT](#custom-auth-mqtt). Das folgende Beispiel zeigt, wie Sie Anmeldeinformationen über die HTTP-Upgrade-Anforderung übergeben. 

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

## Signieren des Tokens
<a name="custom-auth-token-signature"></a>

Sie müssen das Token mit dem privaten Schlüssel des Paars aus öffentlichem und privatem Schlüssel signieren, das Sie im `create-authorizer`-Aufruf verwendet haben. Die folgenden Beispiele zeigen, wie die Tokensignatur mithilfe eines UNIX-ähnlichen Befehls und erstellt wird. JavaScript Sie verwenden den SHA-256-Hash-Algorithmus, um die Signatur zu kodieren.

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

------

# Fehlerbehebung für Ihre Genehmiger
<a name="custom-auth-troubleshooting"></a>

 In diesem Thema werden häufig auftretende Probleme, die zu Konflikten bei benutzerdefinierten Authentifizierungsworkflows führen können, sowie Schritte zu deren Behebung beschrieben. **Um Probleme am effektivsten zu beheben, aktivieren Sie CloudWatch Protokolle für AWS IoT Core und setzen Sie die Protokollebene auf DEBUG.** Sie können CloudWatch Protokolle in der AWS IoT Core Konsole aktivieren ([https://console.aws.amazon.com/iot/](https://console.aws.amazon.com/iot/)). Weitere Informationen zum Aktivieren und Konfigurieren von Protokollen für AWS IoT Core finden Sie unter [Konfigurieren Sie die AWS IoT Protokollierung](configure-logging.md). 

**Anmerkung**  
Wenn Sie die Protokollebene für längere Zeit auf **DEBUG** belassen, CloudWatch können große Mengen an Protokolldaten gespeichert werden. Dies kann Ihre CloudWatch Gebühren erhöhen. Erwägen Sie, die ressourcenbasierte Protokollierung zu verwenden, um die Ausführlichkeit nur für Geräte in einer bestimmten Objektgruppe zu erhöhen. Weitere Informationen zur ressourcenbasierten Protokollierung finden Sie unter [Konfigurieren Sie die AWS IoT Protokollierung](configure-logging.md). Wenn Sie mit der Fehlerbehebung fertig sind, reduzieren Sie außerdem die Protokollebene auf eine weniger ausführliche Ebene.

Bevor Sie mit der Problembehandlung beginnen, überprüfen Sie [Grundlegendes zum Workflow für die benutzerdefinierte Authentifizierung](custom-authorizer.md) für eine allgemeine Übersicht über den benutzerdefinierten Authentifizierungsprozess. Dadurch können Sie leichter die mögliche Ursache eines Problems nachvollziehen und danach suchen.

In diesem Thema werden zwei Bereiche behandelt, die Sie untersuchen sollten.
+ Probleme im Zusammenhang mit der Lambda-Funktion Ihres Genehmigers.
+ Probleme im Zusammenhang mit Ihrem Gerät.

## Nach Problemen mit der Lambda-Funktion Ihres Genehmigers suchen
<a name="custom-auth-troubleshooting-lambda"></a>

Gehen Sie wie folgt vor, um sicherzustellen, dass die Verbindungsversuche Ihrer Geräte Ihre Lambda-Funktion aufrufen.

1. Überprüfen Sie, welche Lambda-Funktion Ihrem Genehmiger zugeordnet ist.

   Sie können dies tun, indem Sie die [DescribeAuthorizer](https://docs.aws.amazon.com/iot/latest/apireference/API_DescribeAuthorizer.html)API aufrufen oder im Bereich **Secure** der AWS IoT Core Konsole auf den gewünschten Autorisierer klicken.

1. Überprüfen Sie die Aufrufmetriken der Lambda-Funktion. Führen Sie dazu die folgenden Schritte aus.

   1. Öffnen Sie die AWS Lambda Konsole ([https://console.aws.amazon.com/lambda/](https://console.aws.amazon.com/lambda/)) und wählen Sie die Funktion aus, die Ihrem Autorisierer zugeordnet ist.

   1. Wählen Sie die Registerkarte **Überwachen** und überprüfen Sie die Metriken des für Ihr Problem relevanten Zeitraums.

1. Wenn Sie keine Aufrufe sehen, überprüfen Sie, ob der Benutzer berechtigt AWS IoT Core ist, Ihre Lambda-Funktion aufzurufen. Wenn Sie Aufrufe sehen, fahren Sie mit dem nächsten Schritt fort. Führen Sie die folgenden Schritte aus, um sicherzustellen, dass Ihre Lambda-Funktion über die erforderlichen Berechtigungen verfügt.

   1. Wählen Sie in der Konsole den Tab „**Berechtigungen**“ für Ihre Funktion aus. AWS Lambda 

   1. Suchen Sie den Abschnitt **Ressourcenbasierte Richtlinie** am Seitenende. Wenn Ihre Lambda-Funktion über die erforderlichen Berechtigungen verfügt, sieht die Richtlinie wie im folgenden Beispiel aus.  
****  

      ```
      {
        "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. Diese Richtlinie erteilt dem AWS IoT Core Schulleiter die `InvokeFunction` Erlaubnis für Ihre Funktion. Wenn Sie sie nicht sehen, müssen Sie sie mithilfe der [AddPermission](https://docs.aws.amazon.com/lambda/latest/dg/API_AddPermission.html)API hinzufügen. Im folgenden Beispiel wird gezeigt, wie Sie sie über AWS CLI hinzufügen können.

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

1. Wenn Sie Aufrufe sehen, stellen Sie sicher, dass keine Fehler vorliegen. Ein Fehler könnte darauf hinweisen, dass die Lambda-Funktion das Verbindungsereignis, das an sie AWS IoT Core gesendet wird, nicht richtig verarbeitet.

   Hinweise zur Behandlung des Ereignisses in Ihrer Lambda-Funktion finden Sie unter [Definieren Ihrer Lambda-Funktion](custom-auth-lambda.md). Sie können die Testfunktion in der AWS Lambda Konsole ([https://console.aws.amazon.com/lambda/](https://console.aws.amazon.com/lambda/)) verwenden, um Testwerte in der Funktion fest zu codieren, um sicherzustellen, dass die Funktion Ereignisse korrekt verarbeitet.

1. Wenn Sie Aufrufe ohne Fehler sehen, Ihre Geräte jedoch keine Verbindung herstellen (oder Nachrichten veröffentlichen, abonnieren und empfangen) können, liegt das Problem möglicherweise daran, dass die Richtlinie, die Ihre Lambda-Funktion zurückgibt, keine Berechtigungen für die Aktionen gewährt, die Ihre Geräte ausführen möchten. Führen Sie die folgenden Schritte aus, um festzustellen, ob ein Fehler bei der Richtlinie vorliegt, die die Funktion zurückgibt.

   1. Verwenden Sie eine Amazon CloudWatch Logs Insights-Abfrage, um Protokolle über einen kurzen Zeitraum auf Fehler zu überprüfen. Die folgende Beispielabfrage sortiert Ereignisse nach Zeitstempel und sucht nach Fehlern.

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

   1. Aktualisieren Sie Ihre Lambda-Funktion, um die Daten zu protokollieren, zu denen sie zurückkehrt, AWS IoT Core und das Ereignis, das die Funktion auslöst. Sie können diese Protokolle verwenden, um die Richtlinie zu überprüfen, die die Funktion erstellt.

1. Wenn Sie Aufrufe ohne Fehler sehen, Ihre Geräte jedoch keine Verbindung herstellen (oder Nachrichten veröffentlichen, abonnieren und empfangen) können, könnte eine weitere Ursache sein, dass Ihre Lambda-Funktion das Timeout-Limit überschritten hat. Das Timeout-Limit der Lambda-Funktion für den benutzerdefinierten Genehmiger beträgt 5 Sekunden. Sie können die Funktionsdauer in CloudWatch Protokollen oder Metriken überprüfen. 

## Untersuchen von Geräteproblemen
<a name="custom-auth-troubleshooting-investigate"></a>

Wenn Sie keine Probleme mit dem Aufrufen Ihrer Lambda-Funktion oder mit der Richtlinie, die die Funktion zurückgibt, feststellen, suchen Sie nach Problemen bei den Verbindungsversuchen Ihrer Geräte. Fehlerhaft formatierte Verbindungsanfragen können dazu führen, dass Ihr Autorisierer AWS IoT Core nicht ausgelöst wird. Verbindungsprobleme können sowohl auf TLS- als auch auf Anwendungsebene auftreten.

**Mögliche Probleme mit der TLS-Ebene:**
+ Kunden müssen bei allen benutzerdefinierten Authentifizierungsanfragen entweder einen Hostnamen-Header (HTTP, MQTT over WebSockets) oder die Server Name Indication TLS-Erweiterung (HTTP, MQTT over WebSockets, MQTT) übergeben. In beiden Fällen muss der übergebene Wert mit einem der Datenendpunkte Ihres Kontos übereinstimmen. AWS IoT Core Dies sind die Endpunkte, die zurückgegeben werden, wenn Sie die folgenden CLI-Befehle ausführen.
  + `aws iot describe-endpoint --endpoint-type iot:Data-ATS`
  + `aws iot describe-endpoint --endpoint-type iot:Data`(für ältere VeriSign Endpunkte)
+ Geräte, die eine benutzerdefinierte Authentifizierung in MQTT-Verbindungen verwenden, müssen auch die TLS-Erweiterung „Application Layer Protocol Negotiation“ (ALPN) mit dem Wert `mqtt` übergeben.
+ Die benutzerdefinierte Authentifizierung ist derzeit nur auf Port 443 verfügbar.

**Mögliche Probleme auf Anwendungsebene:**
+ Wenn das Signieren aktiviert ist (das Feld `signingDisabled` in Ihrem Genehmiger lautet „false“), suchen Sie nach den folgenden Signaturproblemen.
  + Stellen Sie sicher, dass Sie die Tokensignatur entweder im `x-amz-customauthorizer-signature`-Header oder in einem Abfragezeichenfolgenparameter übergeben.
  + Stellen Sie sicher, dass der Service keinen anderen Wert als das Token signiert.
  + Stellen Sie sicher, dass Sie das Token im Header- oder Abfrageparameter übergeben, den Sie im Feld `token-key-name` in Ihrem Genehmiger angegeben haben.
+ Stellen Sie sicher, dass der Genehmigername, den Sie im `x-amz-customauthorizer-name`-Header- oder Abfragezeichenfolgenparameter übergeben, gültig ist oder dass Sie einen Standardgenehmiger für Ihr Konto angegeben haben.