

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

# Authentification personnalisée avec des certificats clients X.509
<a name="custom-auth-509cert"></a>

Lorsque vous connectez des appareils à AWS IoT Core, plusieurs [types d'authentification](protocols.md#connection-protocol-auth-mode) sont disponibles. Vous pouvez utiliser des [certificats client X.509](https://docs.aws.amazon.com//iot/latest/developerguide/x509-client-certs.html) qui peuvent être utilisés pour authentifier les connexions des clients et des appareils, ou définir des [autorisateurs personnalisés](https://docs.aws.amazon.com//iot/latest/developerguide/custom-authentication.html) pour gérer votre propre logique d'authentification et d'autorisation des clients. Cette rubrique explique comment utiliser l'authentification personnalisée avec les certificats client X.509.

L'utilisation de l'authentification personnalisée avec des certificats X.509 peut être utile si vous avez déjà authentifié vos appareils à l'aide de certificats X.509 et que vous souhaitez effectuer une validation supplémentaire et une autorisation personnalisée. Par exemple, si vous stockez les données de vos appareils, telles que leurs numéros de série, dans le certificat client X.509, après avoir AWS IoT Core authentifié le certificat client X.509, vous pouvez utiliser un autorisateur personnalisé pour identifier des appareils spécifiques en fonction des informations stockées dans le champ du certificat. CommonName L'utilisation de l'authentification personnalisée avec des certificats X.509 peut améliorer la gestion de la sécurité de vos appareils lors de la connexion des appareils AWS IoT Core et offre plus de flexibilité pour gérer la logique d'authentification et d'autorisation. AWS IoT Core [prend en charge l'authentification personnalisée avec des certificats X.509 utilisant le certificat X.509 et le type d'authentification d'autorisation personnalisé, qui fonctionne à la fois avec le protocole [MQTT](https://docs.aws.amazon.com//iot/latest/developerguide/mqtt.html) et le protocole HTTPS.](https://docs.aws.amazon.com//iot/latest/developerguide/http.html) Pour plus d'informations sur les types d'authentification et les protocoles d'application pris en charge par les terminaux des AWS IoT Core appareils, consultez la section [Protocoles de communication des appareils](https://docs.aws.amazon.com//iot/latest/developerguide/protocols.html).

**Note**  
L'authentification personnalisée à l'aide de certificats clients X.509 n'est pas prise en charge dans les AWS GovCloud (US) régions.

**Important**  
Vous devez utiliser un point de terminaison créé à l'aide [de configurations de domaine](iot-custom-endpoints-configurable.md). En outre, les clients doivent fournir l'extension [SNI (Server Name Indication)](https://www.rfc-editor.org/rfc/rfc3546#section-3.1) lorsqu'ils se connectent à AWS IoT Core.

**Topics**
+ [Étape 1 : enregistrez vos certificats clients X.509 auprès de AWS IoT Core](#custom-auth-509cert-client)
+ [Étape 2 : création d’une fonction Lambda](#custom-auth-509cert-lambda)
+ [Étape 3 : créer un autorisateur personnalisé](#custom-auth-509cert-authorizer)
+ [Étape 4 : définir le type d'authentification et le protocole d'application dans une configuration de domaine](#custom-auth-509cert-domainconfig)

## Étape 1 : enregistrez vos certificats clients X.509 auprès de AWS IoT Core
<a name="custom-auth-509cert-client"></a>

Si ce n'est pas déjà fait, enregistrez et activez vos [certificats clients X.509](https://docs.aws.amazon.com//iot/latest/developerguide/x509-client-certs.html) avec AWS IoT Core. Sinon, passez à l’étape suivante.

Pour enregistrer et activer vos certificats clients auprès de AWS IoT Core, procédez comme suit :

1. Si vous [créez des certificats clients directement avec AWS IoT](https://docs.aws.amazon.com//iot/latest/developerguide/device-certs-create.html). Ces certificats clients seront automatiquement enregistrés auprès de AWS IoT Core.

1. Si vous [créez vos propres certificats clients](https://docs.aws.amazon.com//iot/latest/developerguide/device-certs-your-own.html), suivez [ces instructions pour les enregistrer auprès](https://docs.aws.amazon.com//iot/latest/developerguide/register-device-cert.html) de AWS IoT Core.

1. Pour activer vos certificats clients, suivez [ces instructions](https://docs.aws.amazon.com//iot/latest/developerguide/activate-or-deactivate-device-cert.html).

## Étape 2 : création d’une fonction Lambda
<a name="custom-auth-509cert-lambda"></a>

AWS IoT Core utilise des autorisateurs personnalisés pour implémenter des schémas d'authentification et d'autorisation personnalisés. Un autorisateur personnalisé est associé à une fonction Lambda qui détermine si un appareil est authentifié et quelles opérations le périphérique est autorisé à effectuer. Lorsqu'un appareil se connecte à AWS IoT Core, AWS IoT Core récupère les détails de l'autorisateur, y compris le nom de l'autorisateur et la fonction Lambda associée, et invoque la fonction Lambda. La fonction Lambda reçoit un événement contenant un objet JSON contenant les données du certificat client X.509 du périphérique. Votre fonction Lambda utilise cet objet JSON d'événement pour évaluer la demande d'authentification, décider des actions à entreprendre et renvoyer une réponse.

### Exemple d'événement lié à une fonction Lambda
<a name="custom-auth-509cert-event"></a>

L'exemple d'objet JSON suivant contient tous les champs possibles qui peuvent être inclus. L'objet JSON proprement dit ne contiendra que les champs relatifs à la demande de connexion spécifique.

```
{
	"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`  
Valeur booléenne qui indique si la signature du jeton configurée dans l'autorisateur est vérifiée ou non avant d'appeler la fonction Lambda de l'autorisateur. Si l'autorisateur est configuré pour désactiver la signature par jeton, ce champ sera faux. 

`protocols`  
Tableau contenant les protocoles attendus pour la demande.

`protocolData`  
Objet contenant des informations sur les protocoles utilisés dans la connexion. Il fournit des informations spécifiques au protocole qui peuvent être utiles pour l'authentification, l'autorisation, etc.  
`tls`- Cet objet contient des informations relatives au protocole TLS (Transport Layer Security).   
+ `serverName`- La chaîne de [nom d'hôte SNI (Server Name Indication)](https://www.rfc-editor.org/rfc/rfc3546#section-3.1). AWS IoT Core exige que les appareils envoient l'[extension SNI](https://www.rfc-editor.org/rfc/rfc3546#section-3.1) au protocole TLS (Transport Layer Security) et fournissent l'adresse complète du point de terminaison sur le `host_name` terrain.
+ `x509CertificatePem`- Le certificat X.509 au format PEM, qui est utilisé pour l'authentification du client dans la connexion TLS.
+ `principalId`- L'identifiant principal associé au client dans la connexion TLS.
`mqtt`- Cet objet contient des informations relatives au protocole MQTT.  
+ `clientId`- Une chaîne ne doit être incluse que dans le cas où l'appareil envoie cette valeur.
+ `username`- Le nom d'utilisateur fourni dans le paquet MQTT Connect.
+ `password`- Le mot de passe fourni dans le paquet MQTT Connect.

`connectionMetadata`  
Métadonnées de la connexion.  
`id`- L'identifiant de connexion, que vous pouvez utiliser pour la journalisation et le dépannage.

**Note**  
Dans ce cas, il s'agit d'un objet JSON `x509CertificatePem` et `principalId` deux nouveaux champs figurent dans la demande. La valeur de `principalId` est identique à la valeur de`certificateId`. Pour plus d'informations, consultez la section [Certificat](https://docs.aws.amazon.com//iot/latest/apireference/API_Certificate.html).

### Exemple de réponse de la fonction Lambda
<a name="custom-auth-509cert-response"></a>

La fonction Lambda doit utiliser les informations de l'objet JSON d'événement pour authentifier la connexion entrante et décider quelles actions sont autorisées dans la connexion.

L'objet JSON suivant contient un exemple de réponse que votre fonction Lambda peut envoyer.

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

Dans cet exemple, cette fonction doit envoyer une réponse contenant les valeurs suivantes.

`isAuthenticated`  
Valeur booléenne qui indique si la demande est authentifiée.

`principalId`  
Chaîne alphanumérique qui sert d'identifiant pour le jeton envoyé par la demande d'autorisation personnalisée. La valeur doit être une chaîne alphanumérique comportant au moins un caractère, mais pas plus de 128. Il identifie la connexion dans les journaux. La valeur de `principalId` doit être identique à la valeur de l'objet JSON `principalId` de l'événement (c'est-à-dire le certificateID du certificat X.509).

`policyDocuments`  
Liste des documents de politique au format JSON AWS IoT Core . La valeur est facultative et prend en charge les [variables de politique d'objet et les variables](https://docs.aws.amazon.com//iot/latest/developerguide/thing-policy-variables.html) [de politique de certificat](https://docs.aws.amazon.com//iot/latest/developerguide/cert-policy-variables.html). Le nombre maximum de documents de politique est de 10. Chaque document de stratégie peut contenir un maximum de 2048 caractères. Si plusieurs politiques sont associées à votre certificat client et à la fonction Lambda, l'autorisation est un ensemble de toutes les politiques. Pour plus d'informations sur la création de AWS IoT Core politiques, consultez la section [Politiques](https://docs.aws.amazon.com//iot/latest/developerguide/iot-policies.html).

`disconnectAfterInSeconds`  
Nombre entier qui indique la durée maximale (en secondes) de la connexion à la AWS IoT Core passerelle. La valeur minimale est de 300 secondes et la valeur maximale de 86 400 secondes. `disconnectAfterInSeconds`est valable pour la durée de vie d'une connexion et n'est pas actualisé lors de mises à jour consécutives des politiques.

`refreshAfterInSeconds`  
Nombre entier qui indique l'intervalle entre les actualisations des politiques. Lorsque cet intervalle est dépassé, AWS IoT Core invoque la fonction Lambda pour permettre l'actualisation des politiques. La valeur minimale est de 300 secondes et la valeur maximale de 86 400 secondes.

### Exemple de fonction Lambda
<a name="custom-auth-509cert-js-example"></a>

Voici un exemple de fonction Lambda de Node.js. La fonction examine le certificat X.509 du client et extrait les informations pertinentes telles que le numéro de série, l'empreinte digitale et le nom du sujet. Si les informations extraites correspondent aux valeurs attendues, le client est autorisé à se connecter. Ce mécanisme garantit que seuls les clients autorisés possédant des certificats valides peuvent établir une connexion.

```
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 fonction Lambda précédente renvoie le code JSON suivant lorsqu'elle reçoit un certificat avec le numéro de série, l'empreinte digitale et le sujet attendus. La valeur de `x509CertificatePem` sera le certificat client fourni lors de la poignée de contact TLS. Pour plus d'informations, consultez la section [Définition de votre fonction Lambda](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
}
```

## Étape 3 : créer un autorisateur personnalisé
<a name="custom-auth-509cert-authorizer"></a>

Après [avoir défini la fonction Lambda](#custom-auth-509cert-lambda), créez un autorisateur personnalisé pour gérer votre propre logique d'authentification et d'autorisation du client. Vous pouvez suivre les instructions détaillées de l'[étape 3 : créer une ressource d'autorisation client et son autorisation](https://docs.aws.amazon.com//iot/latest/developerguide/custom-auth-tutorial.html#custom-auth-tutorial-authorizer). Pour plus d'informations, consultez la section [Création d'un autorisateur.](https://docs.aws.amazon.com//iot/latest/developerguide/config-custom-auth.html) 

Lors de la création de l'autorisateur personnalisé, vous devez AWS IoT autoriser l'appel de la fonction Lambda après sa création. Pour obtenir des instructions détaillées, consultez [Autoriser l'appel AWS IoT de votre fonction Lambda](custom-auth-authorize.md).

## Étape 4 : définir le type d'authentification et le protocole d'application dans une configuration de domaine
<a name="custom-auth-509cert-domainconfig"></a>

Pour authentifier les appareils à l'aide d'une authentification personnalisée avec des certificats clients X.509, vous devez définir le type d'authentification et le protocole d'application dans une configuration de domaine, et vous devez envoyer l'extension SNI. La valeur de `authenticationType` doit être`CUSTOM_AUTH_X509`, et la valeur de `applicationProtocol` peut être `SECURE_MQTT` ou`HTTPS`.

### Définissez le type d'authentification et le protocole d'application dans la configuration du domaine (CLI)
<a name="custom-auth-509cert-cli"></a>

Si vous n'avez pas de configuration de domaine, utilisez la [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)commande pour en créer une. La valeur de `authenticationType` doit être`CUSTOM_AUTH_X509`, et la valeur de `applicationProtocol` peut être `SECURE_MQTT` ou`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
    }'
```

Si vous avez déjà une configuration de domaine, utilisez la [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)commande update `authenticationType` et `applicationProtocol` si nécessaire. Notez que vous ne pouvez pas modifier le type ou le protocole d'authentification sur le point de terminaison par défaut (`iot:Data-ATS`).

```
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`  
Nom de la configuration de domaine.

`authentication-type`  
Type d'authentification de la configuration du domaine. Pour plus d'informations, consultez la section [Choix d'un type d'authentification](protocols.md#connection-protocol-auth-mode).

`application-protocol`  
Protocole d'application avec lequel les appareils communiquent AWS IoT Core. Pour plus d'informations, consultez la section [Choix d'un protocole d'application](protocols.md#protocol-selection).

`--authorizer-config`  
Objet qui spécifie la configuration de l'autorisateur dans une configuration de domaine.

`defaultAuthorizerName`  
Nom de l'autorisateur pour une configuration de domaine.

Pour plus d'informations, consultez [CreateDomainConfiguration](https://docs.aws.amazon.com//iot/latest/apireference/API_CreateDomainConfiguration.html)et consultez le [UpdateDomainConfiguration](https://docs.aws.amazon.com//iot/latest/apireference/API_UpdateDomainConfiguration.html)Guide de *référence des AWS IoT API*. Pour plus d'informations sur la configuration des domaines, consultez la section [Configurations des domaines](https://docs.aws.amazon.com//iot/latest/developerguide/iot-custom-endpoints-configurable.html).