Utiliser un certificat client pour l’authentification dans votre application web Node.js
S’applique à : Locataires de main-d’œuvre Locataires externes (en savoir plus)
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, puis 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
Visual Studio Code ou un autre éditeur de code.
Un locataire externe. Si vous n’en avez pas, inscrivez-vous à un essai gratuit.
OpenSSL, ou vous pouvez facilement installer OpenSSL dans Windows via Chocolatey.
Windows PowerShell ou un abonnement Azure.
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
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.
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.
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 :
Connectez-vous au centre d'administration Microsoft Entra au minimum en tant qu’Administrateur d'application.
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.
Accédez à Identité>Applications>Inscriptions d’applications.
Dans la liste d’inscriptions d’application, sélectionnez l’application que vous voulez associer au certificat, par exemple, ciam-client-app.
Sous Gérer, sélectionnez Certificats et secrets.
Sélectionnez Certificats, puis Charger le certificat.
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.
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.
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 :
- Accédez à l’onglet Clés secrètes client, puis sélectionnez l’icône Supprimer.
- 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 :
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 estcontoso.onmicrosoft.com
, utilisezcontoso
. 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' }); //...
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 :
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/`, }, //... };
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.Dans votre console, tapez la commande suivante pour installer les packages nécessaires :
npm install --save @azure/identity @azure/keyvault-certificates @azure/keyvault-secrets
Dans votre application cliente, utilisez le code suivant pour générer
thumbprint
etprivateKey
.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.
Utilisez les valeurs de
thumbprint
etprivateKey
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
Ensuite, instanciez votre client confidentiel, comme indiqué dans la méthode
getMsalInstance
:class AuthProvider { //... getMsalInstance(msalConfig) { return new msal.ConfidentialClientApplication(msalConfig); } //... }
Suivez les étapes décrites dans Exécuter et tester l’application web pour tester votre application.
Étapes suivantes
Découvrez comment :