Exercice : Utiliser des certificats clients pour sécuriser l’accès à une API

Effectué

Vous configurez Gestion des API pour accepter les certificats clients à l’aide de stratégies de trafic entrant.

Supposons que votre société météorologique a décidé de sécuriser son API avec une authentification par certificat pour certains clients qui utilisent déjà l’authentification par certificat dans d’autres systèmes. Cette configuration doit leur permettre d’utiliser les certificats existants pour s’authentifier sur la passerelle Gestion des API.

Dans cette unité, vous allez :

  • Créer un certificat auto-signé
  • Configurer la passerelle pour demander des certificats clients
  • Obtenir l’empreinte du certificat
  • Modifier la stratégie de trafic entrant pour autoriser uniquement les clients qui ont le certificat spécifié dans leur demande
  • Appeler la passerelle Gestion des API et passer le certificat à l’aide de curl

Notes

Cet exercice utilise les ressources que vous avez configurées dans l’exercice précédent.

Créer le certificat auto-signé

Tout d’abord, utilisez Cloud Shell pour créer un certificat auto-signé, que vous utilisez ensuite pour l’authentification entre le client et la passerelle Gestion des API.

  1. Pour créer la clé privée et le certificat, exécutez les commandes suivantes dans Cloud Shell.

    pwd='Pa$$w0rd'
    pfxFilePath='selfsigncert.pfx'
    openssl req -x509 -sha256 -nodes -days 365 -newkey rsa:2048 -keyout privateKey.key -out selfsigncert.crt -subj /CN=localhost
    

    Pour que cet exemple soit facile à suivre, les commandes ci-dessus comprennent le mot de passe utilisé pour sécuriser la clé privée. Chaque fois que vous générez une clé privée pour votre usage personnel, veillez à générer un mot de passe sécurisé et à en contrôler l’accès de manière appropriée.

  2. Convertissez maintenant le certificat au format PEM, que l’outil curl peut utiliser, en exécutant ces commandes :

    openssl pkcs12 -export -out $pfxFilePath -inkey privateKey.key -in selfsigncert.crt -password pass:$pwd
    openssl pkcs12 -in selfsigncert.pfx -out selfsigncert.pem -nodes
    

    Quand vous êtes invité à donner un mot de passe, entrez Pa$$w0rd, puis appuyez sur Entrée.

Configurer la passerelle pour demander des certificats clients

Étant donné que vous utilisez le niveau Consommation pour Gestion des API, vous devez configurer la passerelle afin d’accepter des certificats clients. Procédez comme suit.

  1. À partir du portail Azure déjà ouvert, sélectionnez votre service Gestion des API (apim-WeatherDataNNNN).

  2. Dans le volet de menu à gauche, sous Déploiement et infrastructure, sélectionnez Domaines personnalisés. Le volet Domaines personnalisés pour votre service Gestion des API s’affiche.

  3. Pour *Demander un certificat client, sélectionnez Oui et, dans la barre de menus supérieure, sélectionnez Enregistrer.

    Configure the gateway to request certificates.

Obtenir l’empreinte du certificat

Dans cette section, vous configurez Gestion des API pour accepter une demande uniquement si elle a un certificat avec une certaine empreinte (digitale). Obtenons cette empreinte à partir du certificat.

Notes

Une empreinte de certificat SSL est également appelée empreinte digitale de certificat SSL.

  1. Dans Cloud Shell, exécutez le code suivant.

    Fingerprint="$(openssl x509 -in selfsigncert.pem -noout -fingerprint)"
    Fingerprint="${Fingerprint//:}"
    echo ${Fingerprint#*=}
    
  2. Copiez la sortie complète (une chaîne hexadécimale) et collez cette valeur d’empreinte dans un fichier texte.

Modifier la stratégie de trafic entrant pour autoriser uniquement les demandes incluant un certificat valide

Créez maintenant la stratégie d’authentification dans la passerelle Gestion des API.

  1. Dans le portail Azure, sélectionnez votre service Gestion des API. Si nécessaire, dans le menu de ressources Azure ou dans la page d’accueil, sélectionnez Toutes les ressources, puis votre service Gestion des API.

  2. Dans le volet du menu de gauche, sous API, sélectionnez API. Le volet API de votre service Gestion des API s’affiche.

  3. Dans le menu secondaire, sélectionnez Weather Data.

  4. Dans la zone Traitement entrant, sélectionnez l’icône </> pour ouvrir l’Éditeur de code des stratégies. Le code HTML du nœud de stratégies s’affiche.

    Inbound processing policy button.

  5. Remplacez le nœud <inbound> du fichier de stratégie par le code XML suivant, en remplaçant l’empreinte que vous avez copiée précédemment pour l’espace réservé desired-fingerprint :

    <inbound>
        <choose>
            <when condition="@(context.Request.Certificate == null || context.Request.Certificate.Thumbprint != "desired-fingerprint")" >
                <return-response>
                    <set-status code="403" reason="Invalid client certificate" />
                </return-response>
            </when>
        </choose>
        <base />
    </inbound>
    
  6. Sélectionnez Enregistrer.

Appeler la passerelle et passer le certificat client

Vous pouvez maintenant tester la nouvelle stratégie d’authentification avec et sans le certificat.

  1. Pour tester l’API sans le certificat, exécutez la commande suivante dans Cloud Shell, en remplaçant les valeurs d’espace réservé par le nom de votre passerelle API et la clé d’abonnement.

    curl -X -v GET https://[api-gateway-name].azure-api.net/api/Weather/53/-1 \
      -H 'Ocp-Apim-Subscription-Key: [Subscription Key]' 
    

    Cette commande doit retourner une erreur 403 Certificat client et aucune donnée n’est retournée.

  2. Dans Cloud Shell, pour tester l’API avec le certificat, copiez et collez la commande cURL suivante, en utilisant la clé d’abonnement primaire du premier exercice (vous pouvez également obtenir cette clé primaire dans le volet Abonnements de votre service Gestion des API WeatherData). N’oubliez pas d’inclure le nom de votre passerelle API.

    curl -X GET https://[api-gateway-name].azure-api.net/api/Weather/53/-1 \
      -H 'Ocp-Apim-Subscription-Key: [subscription-key]' \
      --cert-type pem \
      --cert selfsigncert.pem
    

    Cette commande doit aboutir à une réponse de réussite qui affiche des données météorologiques similaires à l’exemple suivant.

    {"mainOutlook":{"temperature":32,"humidity":34},"wind":{"speed":11,"direction":239.0},"date":"2019-05-16T00:00:00+00:00","latitude":53.0,"longitude":-1.0}