Share via


Använda klientcertifikat för autentisering i din Node.js webbapp

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 använda Azure Key Vault för att hantera certifikatåtkomst och livslängd åt dig. 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-portalen, 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

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

  1. Följ stegen i Ange och hämta ett certifikat från Azure Key Vault med hjälp av Azure-portalen för att skapa och ladda ned ditt certifikat.

  2. 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.

  3. 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:

  1. Logga in på administrationscentret för Microsoft Entra som minst programadministratör.

  2. Om du har åtkomst till flera klienter använder du ikonenInställningar på den översta menyn för att växla till din externa klientorganisation från menyn Kataloger + prenumerationer.

  3. Bläddra till Identitetsprogram>> Appregistreringar.

  4. I listan över appregistreringar väljer du den app som du vill associera med certifikatet, till exempel ciam-client-app.

  5. Under Hantera väljer du Certifikat och hemligheter.

  6. Välj Certifikat och sedan Ladda upp certifikat.

  7. 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.

  8. 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 .

  9. 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:

  1. Gå till fliken Klienthemligheter och välj ikonen Ta bort .
  2. 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:

  1. 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_THUMBPRINTmed 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 är contoso.onmicrosoft.comanvänder du contoso. 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'
    });
    //...
    
  2. 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:

  1. Leta upp filen som innehåller msal-konfigurationsobjektet, till exempel msalConfig i authConfig.js och ta sedan bort egenskapen 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. 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.

  3. 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
    
  4. I klientappen använder du följande kod för att generera thumbprint och 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();        
    

    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.

  5. thumbprint Använd värdena och privateKey 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 
    
  6. Fortsätt sedan med att instansiera din konfidentiella klient enligt metoden getMsalInstance :

    class AuthProvider {
        //...
        getMsalInstance(msalConfig) {
            return new msal.ConfidentialClientApplication(msalConfig);
        }
        //...
    }
    
  7. Använd stegen i Kör och testa webbappen för att testa din app.

Nästa steg

Lär dig att: