Använda klientcertifikat för autentisering i din Node.js webbapp
Gäller för: Personalklientorganisationer Externa klienter (läs mer)
Microsoft Entras externa ID stöder två typer av autentisering för konfidentiella klientprogram, lösenordsbaserad autentisering (till exempel klienthemlighet) och certifikatbaserad autentisering. För en högre säkerhetsnivå rekommenderar vi att du använder ett certifikat (i stället för en klienthemlighet) som autentiseringsuppgifter i dina konfidentiella klientprogram.
I produktion bör du köpa ett certifikat som signerats av en välkänd certifikatutfärdare och sedan använda Azure Key Vault för att hantera certifikatåtkomst och livslängd. I testsyfte kan du dock skapa ett självsignerat certifikat och konfigurera dina appar för att autentisera med det.
I den här artikeln lär du dig att generera ett självsignerat certifikat med hjälp av Azure Key Vault på Azure Portal, OpenSSL eller PowerShell. Om du redan har en klienthemlighet får du lära dig hur du tar bort den på ett säkert sätt.
När det behövs kan du också skapa ett självsignerat certifikat programmatiskt med hjälp av klientbiblioteken för .NET, Node.js, Go, Python eller Java .
Förutsättningar
Visual Studio Code eller någon annan kodredigerare.
En extern klientorganisation. Om du inte redan har en kan du registrera dig för en kostnadsfri utvärderingsversion.
OpenSSL eller så kan du enkelt installera OpenSSL i Windows via Chocolatey.
Windows PowerShell - eller Azure-prenumeration.
Skapa ett självsignerat certifikat
Om du har ett befintligt självsignerat certifikat på den lokala datorn kan du hoppa över det här steget och sedan gå vidare till Ladda upp certifikat till din appregistrering.
Du kan använda Azure Key Vault för att generera ett självsignerat certifikat för din app. Genom att använda Azure Key Vault får du fördelar, till exempel att tilldela en partnercertifikatutfärdare (CA) och automatisera certifikatrotation.
Om du har ett befintligt självsignerat certifikat i Azure Key Vault och vill använda det utan att ladda ned det hoppar du över det här steget och fortsätter sedan till Använd ett självsignerat certifikat direkt från Azure Key Vault. Annars kan du använda följande steg för att generera ditt certifikat
Följ stegen i Ange och hämta ett certifikat från Azure Key Vault med hjälp av Azure Portal för att skapa och ladda ned ditt certifikat.
När du har skapat certifikatet laddar du ned både .cer-filen och .pfx-filen, till exempel ciam-client-app-cert.cer och ciam-client-app-cert.pfx. Filen .cer innehåller den offentliga nyckeln och är det du laddar upp till administrationscentret för Microsoft Entra.
Kör följande kommando i terminalen för att extrahera den privata nyckeln från .pfx-filen . När du uppmanas att skriva en lösenfras trycker du bara på Retur om du inte vill ange en. Annars skriver du en lösenfras som du väljer:
openssl pkcs12 -in ciam-client-app-cert.pfx -nocerts -out ciam-client-app-cert.key
Den ciam-client-app-cert.key filen är det du använder i din app.
Ladda upp certifikat till din appregistrering
Om du vill använda certifikatet för klientappen måste du associera den app som du registrerade i administrationscentret för Microsoft Entra med certifikatet:
Logga in på administrationscentret för Microsoft Entra som minst programadministratör.
Om du har åtkomst till flera klienter använder du ikonen Inställningar på den översta menyn för att växla till din externa klient från menyn Kataloger + prenumerationer.
Bläddra till Identitetsprogram>> Appregistreringar.
I listan över appregistreringar väljer du den app som du vill associera med certifikatet, till exempel ciam-client-app.
Under Hantera väljer du Certifikat och hemligheter.
Välj Certifikat och sedan Ladda upp certifikat.
Välj ikonen Välj en filfil och välj sedan det certifikat som du vill ladda upp, till exempel ciam-client-app-cert.pem eller ciam-client-app-cert.cer eller ciam-client-app-cert.crt.
För Beskrivning skriver du in en beskrivning, till exempel CIAM-klientappcertifikat, och väljer sedan Lägg till för att ladda upp certifikatet. När certifikatet har laddats upp visas värdena Tumavtryck, Startdatum och Förfallodatum .
Registrera tumavtrycksvärdet för användning senare när du konfigurerar klientappen.
Om du redan har en klienthemlighet för ditt program måste du ta bort den för att undvika ett skadligt program för att personifiera ditt program:
- Gå till fliken Klienthemligheter och välj ikonen Ta bort .
- I popup-fönstret som visas väljer du Ja.
Konfigurera din Node.js app för att använda certifikat
När du har associerat appregistreringen med certifikatet måste du uppdatera appkoden för att börja använda certifikatet:
Leta upp filen som innehåller msal-konfigurationsobjektet, till exempel
msalConfig
i authConfig.js och uppdatera den så att den ser ut ungefär som i följande kod. Om du har en klienthemlighet ser du till att du tar bort den: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 };
Ersätt platshållarna i koden:
Add_Passphrase_Here
med den passfras som du använde för att kryptera din privata nyckel.YOUR_CERT_THUMBPRINT
med tumavtrycksvärdet som du registrerade tidigare.PATH_TO_YOUR_PRIVATE_KEY_FILE
med filsökvägen till din privata nyckelfil.Enter_the_Application_Id_Here
med program-ID:t (klient) för den app som du registrerade tidigare.Enter_the_Tenant_Subdomain_Here
och ersätt den med underdomänen Katalog (klientorganisation). Om din primära klientdomän till exempel ärcontoso.onmicrosoft.com
använder ducontoso
. Om du inte har ditt klientnamn kan du läsa klientinformationen.
Vi krypterade nyckeln (vi rekommenderar att du gör det), så vi måste dekryptera den innan vi skickar den till MSAL-konfigurationsobjektet.
//... const privateKeyObject = crypto.createPrivateKey({ key: privateKeySource, passphrase: 'Add_Passphrase_Here', format: 'pem' }); const privateKey = privateKeyObject.export({ format: 'pem', type: 'pkcs8' }); //...
Använd stegen i Kör och testa webbappen för att testa din app.
Använda ett självsignerat certifikat direkt från Azure Key Vault
Du kan använda ditt befintliga certifikat direkt från Azure Key Vault:
Leta upp filen som innehåller msal-konfigurationsobjektet, till exempel
msalConfig
i authConfig.js och ta sedan bort egenskapenclientSecret
: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/`, }, //... };
Installera Azure CLI och skriv sedan följande kommando i konsolen för att logga in:
az login --tenant YOUR_TENANT_ID
Ersätt platshållaren
YOUR_TENANT_ID
med det katalog-ID (klient)-ID som du kopierade tidigare.I konsolen skriver du följande kommando för att installera de paket som krävs:
npm install --save @azure/identity @azure/keyvault-certificates @azure/keyvault-secrets
I klientappen använder du följande kod för att generera
thumbprint
ochprivateKey
;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();
Ersätt platshållarna i koden:
ENTER_YOUR_KEY_VAULT_URL
med url:en för Azure Key Vault.ENTER_THE_NAME_OF_YOUR_CERTIFICATE_ON_KEY_VAULT
med namnet på certifikatet i Azure Key Vault.
thumbprint
Använd värdena ochprivateKey
för att uppdatera konfigurationen:let clientCert = { thumbprint: thumbprint, privateKey: privateKey, }; msalConfig.auth.clientCertificate = clientCert; //For this to work, you can't declares your msalConfig using const modifier
Fortsätt sedan med att instansiera din konfidentiella klient enligt metoden
getMsalInstance
:class AuthProvider { //... getMsalInstance(msalConfig) { return new msal.ConfidentialClientApplication(msalConfig); } //... }
Använd stegen i Kör och testa webbappen för att testa din app.
Nästa steg
Lär dig att: