Share via


Utiliser un certificat client pour l’authentification dans votre application web Node.js

ID externe Microsoft Entra prend en charge deux types d’authentification pour les applications client confidentielles : L’authentification basée sur un mot de passe (tel que le secret client) et l’authentification basée sur un certificat. Pour un niveau de sécurité plus élevé, nous vous recommandons d’utiliser un certificat (au lieu d’un secret client) comme informations d’identification dans vos applications clientes confidentielles.

En production, vous devez acheter un certificat signé par une autorité de certification connue, et utiliser Azure Key Vault pour gérer l’accès aux certificats et leur durée de vie. Toutefois, à des fins de test, vous pouvez créer un certificat auto-signé et configurer vos applications pour qu’elles l’utilisent pour l’authentification.

Dans cet article, vous allez apprendre à générer un certificat auto-signé avec Azure Key Vault dans le Portail Azure, OpenSSL ou PowerShell. Si vous avez déjà une clé secrète client, vous allez apprendre à la supprimer en toute sécurité.

Si nécessaire, vous pouvez également créer un certificat auto-signé programmatiquement en utilisant les bibliothèques de client .NET, Node.js, Go, Python ou Java.

Prérequis

Créer un certificat auto-signé

Si vous avez un certificat auto-signé existant sur votre ordinateur local, vous pouvez ignorer cette étape et passer à Charger le certificat dans votre inscription d’application.

Vous pouvez utiliser Azure Key Vault pour générer un certificat auto-signé pour votre application. En utilisant Azure Key Vault, vous bénéficiez d’avantages comme l’attribution d’une autorité de certification partenaire et l’automatisation de la permutation des certificats.

Si vous avez un certificat auto-signé existant dans Azure Key Vault et que vous voulez l’utiliser sans le télécharger, ignorez cette étape et passez à Utiliser un certificat auto-signé directement à partir d’Azure Key Vault. Sinon, utilisez les étapes suivantes pour générer votre certificat

  1. Suivez les étapes décrites dans Définir et récupérer un certificat à partir d’Azure Key Vault dans le portail Azure pour créer et télécharger votre certificat.

  2. Après avoir créé votre certificat, téléchargez le fichier .cer et le fichier .pfx, par exemple, ciam-client-app-cert.cer et ciam-client-app-cert.pfx. Le fichier .cer contient la clé publique que vous chargez dans votre centre d’administration Microsoft Entra.

  3. Dans votre terminal, exécutez la commande suivante pour extraire la clé privée du fichier .pfx. Quand vous êtes invité à taper une phrase secrète, appuyez simplement sur la touche Entrée si vous ne voulez pas en définir une. Sinon, tapez une phrase secrète de votre choix :

    openssl pkcs12 -in ciam-client-app-cert.pfx -nocerts -out ciam-client-app-cert.key
    

    Vous utilisez le fichier ciam-client-app-cert.key dans votre application.

Charger le certificat dans votre inscription d’application

Pour utiliser votre certificat d’application cliente, vous devez associer l’application que vous avez inscrite dans le centre d’administration Microsoft Entra au certificat :

  1. Connectez-vous au centre d'administration Microsoft Entra au minimum en tant qu’Administrateur d'application.

  2. Si vous avez accès à plusieurs tenants, utilisez l’icône Paramètres dans le menu supérieur pour basculer vers votre tenant externe depuis le menu Répertoires + abonnements.

  3. Accédez à Identité>Applications>Inscriptions d’applications.

  4. Dans la liste d’inscriptions d’application, sélectionnez l’application que vous voulez associer au certificat, par exemple, ciam-client-app.

  5. Sous Gérer, sélectionnez Certificats et secrets.

  6. Sélectionnez Certificats, puis Charger le certificat.

  7. Sélectionnez l’icône de fichier Sélectionner un fichier, puis sélectionnez le certificat que vous voulez charger, par exemple, ciam-client-app-cert.pem ou ciam-client-app-cert.cer ou ciam-client-app-cert.crt.

  8. Pour Description, tapez une description de type Certificat d’application cliente CIAM, puis sélectionnez Ajouter pour charger votre certificat. Une fois le certificat chargé, les valeurs des champs Empreinte, Date de début et Expire s’affichent.

  9. Enregistrez la valeur du champ Empreinte afin de l’utiliser par la suite pour configurer votre application cliente.

Si vous avez déjà une clé secrète client en place pour votre application, vous devez la supprimer pour éviter qu’une application malveillante emprunte l’identité de votre application :

  1. Accédez à l’onglet Clés secrètes client, puis sélectionnez l’icône Supprimer.
  2. Dans la fenêtre contextuelle qui s’affiche, sélectionnez Oui.

Configurer votre application Node.js pour utiliser un certificat

Une fois que vous avez associé votre inscription d’application au certificat, vous devez mettre à jour le code de votre application pour commencer à utiliser le certificat :

  1. Recherchez le fichier qui contient votre objet de configuration MSAL, par exemple msalConfig dans authConfig.js, puis mettez-le à jour pour qu’il ressemble au code suivant. Si une clé secrète client est présente, veillez à la supprimer :

    require('dotenv').config();
    const fs = require('fs'); //// import the fs module for reading the key file
    const crypto = require('crypto');
    const TENANT_SUBDOMAIN = process.env.TENANT_SUBDOMAIN || 'Enter_the_Tenant_Subdomain_Here';
    const REDIRECT_URI = process.env.REDIRECT_URI || 'http://localhost:3000/auth/redirect';
    const POST_LOGOUT_REDIRECT_URI = process.env.POST_LOGOUT_REDIRECT_URI || 'http://localhost:3000';
    
    const privateKeySource = fs.readFileSync('PATH_TO_YOUR_PRIVATE_KEY_FILE')
    
    const privateKeyObject = crypto.createPrivateKey({
        key: privateKeySource,
        passphrase: 'Add_Passphrase_Here',
        format: 'pem'
    });
    
    const privateKey = privateKeyObject.export({
        format: 'pem',
        type: 'pkcs8'
    });
    
    /**
     * Configuration object to be passed to MSAL instance on creation.
     * For a full list of MSAL Node configuration parameters, visit:
     * https://github.com/AzureAD/microsoft-authentication-library-for-js/blob/dev/lib/msal-node/docs/configuration.md
     */
        const msalConfig = {
            auth: {
                clientId: process.env.CLIENT_ID || 'Enter_the_Application_Id_Here', // 'Application (client) ID' of app registration in Azure portal - this value is a GUID
                authority: process.env.AUTHORITY || `https://${TENANT_SUBDOMAIN}.ciamlogin.com/`, 
                clientCertificate: {
                    thumbprint: "YOUR_CERT_THUMBPRINT", // replace with thumbprint obtained during step 2 above
                    privateKey: privateKey
                }
            },
            //... Rest of code in the msalConfig object
        };
    
    module.exports = {
        msalConfig,
        REDIRECT_URI,
        POST_LOGOUT_REDIRECT_URI,
        TENANT_SUBDOMAIN
    };
    

    Dans votre code, remplacez les espaces réservés :

    • Add_Passphrase_Here par la phrase secrète que vous avez utilisée pour chiffrer votre clé privée.

    • YOUR_CERT_THUMBPRINT par la valeur du champ Empreinte que vous avez enregistrée précédemment.

    • PATH_TO_YOUR_PRIVATE_KEY_FILE par le chemin de votre fichier de clé privée.

    • Enter_the_Application_Id_Here par l’ID d’application (client) de l’application que vous avez inscrite précédemment.

    • Enter_the_Tenant_Subdomain_Here par le sous-domaine de l’annuaire (locataire). Par exemple, si votre domaine principal du locataire est contoso.onmicrosoft.com, utilisez contoso. Si vous n’avez pas le nom de votre locataire, découvrez comment lire les détails de votre locataire.

    Comme nous avons chiffré la clé (nous vous recommandons d’en faire autant), nous devons la déchiffrer avant de la passer à l’objet de configuration MSAL.

    //...
    const privateKeyObject = crypto.createPrivateKey({
        key: privateKeySource,
        passphrase: 'Add_Passphrase_Here',
        format: 'pem'
    });
    
    const privateKey = privateKeyObject.export({
        format: 'pem',
        type: 'pkcs8'
    });
    //...
    
  2. Suivez les étapes décrites dans Exécuter et tester l’application web pour tester votre application.

Utiliser un certificat auto-signé directement à partir d’Azure Key Vault

Vous pouvez utiliser votre certificat existant directement à partir d’Azure Key Vault :

  1. Recherchez le fichier qui contient votre objet de configuration MSAL, par exemple msalConfig dans authConfig.js, puis supprimez la propriété clientSecret :

    const msalConfig = {
        auth: {
            clientId: process.env.CLIENT_ID || 'Enter_the_Application_Id_Here', // 'Application (client) ID' of app registration in Azure portal - this value is a GUID
            authority: process.env.AUTHORITY || `https://${TENANT_SUBDOMAIN}.ciamlogin.com/`, 
        },
        //...
    };
    
  2. Installez Azure CLI et, dans votre console, tapez la commande suivante pour vous connecter :

    az login --tenant YOUR_TENANT_ID
    

    Remplacez l’espace réservé YOUR_TENANT_ID par l’ID d’annuaire (locataire) que vous avez copié précédemment.

  3. Dans votre console, tapez la commande suivante pour installer les packages nécessaires :

    npm install --save @azure/identity @azure/keyvault-certificates @azure/keyvault-secrets
    
  4. Dans votre application cliente, utilisez le code suivant pour générer thumbprint et privateKey.

    const identity = require("@azure/identity");
    const keyvaultCert = require("@azure/keyvault-certificates");
    const keyvaultSecret = require('@azure/keyvault-secrets');
    
    const KV_URL = process.env["KEY_VAULT_URL"] || "ENTER_YOUR_KEY_VAULT_URL"
    const CERTIFICATE_NAME = process.env["CERTIFICATE_NAME"] || "ENTER_THE_NAME_OF_YOUR_CERTIFICATE_ON_KEY_VAULT";
    
    // Initialize Azure SDKs
    const credential = new identity.DefaultAzureCredential();
    const certClient = new keyvaultCert.CertificateClient(KV_URL, credential);
    const secretClient = new keyvaultSecret.SecretClient(KV_URL, credential);
    
    async function getKeyAndThumbprint() {
    
        // Grab the certificate thumbprint
        const certResponse = await certClient.getCertificate(CERTIFICATE_NAME).catch(err => console.log(err));
        const thumbprint = certResponse.properties.x509Thumbprint.toString('hex')
    
        // When you upload a certificate to Key Vault, a secret containing your private key is automatically created
        const secretResponse = await secretClient.getSecret(CERTIFICATE_NAME).catch(err => console.log(err));;
    
        // secretResponse contains both public and private key, but we only need the private key
        const privateKey = secretResponse.value.split('-----BEGIN CERTIFICATE-----\n')[0]
    }
    
    getKeyAndThumbprint();        
    

    Dans votre code, remplacez les espaces réservés :

    • ENTER_YOUR_KEY_VAULT_URL par l’URL de votre coffre de clés Azure.

    • ENTER_THE_NAME_OF_YOUR_CERTIFICATE_ON_KEY_VAULT par le nom de votre certificat dans Azure Key Vault.

  5. Utilisez les valeurs de thumbprint et privateKey pour mettre à jour votre configuration :

    let clientCert = {
        thumbprint: thumbprint, 
        privateKey: privateKey,
    };
    
    msalConfig.auth.clientCertificate = clientCert; //For this to work, you can't declares your msalConfig using const modifier 
    
  6. Ensuite, instanciez votre client confidentiel, comme indiqué dans la méthode getMsalInstance :

    class AuthProvider {
        //...
        getMsalInstance(msalConfig) {
            return new msal.ConfidentialClientApplication(msalConfig);
        }
        //...
    }
    
  7. Suivez les étapes décrites dans Exécuter et tester l’application web pour tester votre application.

Étapes suivantes

Découvrez comment :