Freigeben über


Verwenden des Clientzertifikats für die Authentifizierung in Ihrer Node.js Web-App

Gilt für: Grüner Kreis mit einem weißen Häkchensymbol, das angibt, dass der folgende Inhalt für externe Mandanten gilt. Externe Mandanten (weitere Informationen)

Die externe Microsoft Entra-ID unterstützt zwei Authentifizierungstypen für vertrauliche Clientanwendungen; kennwortbasierte Authentifizierung (z. B. geheimer Clientschlüssel) und zertifikatbasierte Authentifizierung. Für eine höhere Sicherheitsstufe empfehlen wir die Verwendung eines Zertifikats (anstelle eines geheimen Clientschlüssels) als Anmeldeinformationen in Ihren vertraulichen Clientanwendungen.

In der Produktion sollten Sie ein Zertifikat erwerben, das von einer bekannten Zertifizierungsstelle signiert ist, und dann Azure Key Vault zum Verwalten des Zertifikatzugriffs und der Lebensdauer verwenden. Zu Testzwecken können Sie jedoch ein selbstsigniertes Zertifikat erstellen und Ihre Apps für die Authentifizierung konfigurieren.

In diesem Artikel erfahren Sie, wie Sie ein selbstsigniertes Zertifikat mithilfe von Azure Key Vault im Azure-Portal, OpenSSL oder PowerShell generieren. Wenn Sie bereits über einen geheimen Clientschlüssel verfügen, erfahren Sie, wie Sie ihn sicher löschen können.

Bei Bedarf können Sie ein selbstsigniertes Zertifikat auch programmgesteuert mithilfe von .NET, Node.js, Go, Python oder Java-Clientbibliotheken erstellen.

Voraussetzungen

Erstellen eines selbstsignierten Zertifikats

Wenn Sie über ein selbstsigniertes Zertifikat auf Ihrem lokalen Computer verfügen, können Sie diesen Schritt überspringen und dann mit dem Hochladen des Zertifikats in Ihre App-Registrierung fortfahren.

Sie können Azure Key Vault verwenden, um ein selbstsigniertes Zertifikat für Ihre App zu generieren. Mithilfe von Azure Key Vault profitieren Sie von Vorteilen, z. B. dem Zuweisen einer Partnerzertifizierungsstelle (Ca) und der Automatisierung der Zertifikatrotation.

Wenn Sie über ein selbstsigniertes Zertifikat in Azure Key Vault verfügen und es verwenden möchten, ohne es herunterzuladen, überspringen Sie diesen Schritt, und fahren Sie mit der Verwendung eines selbstsignierten Zertifikats direkt aus Azure Key Vault fort. Verwenden Sie andernfalls die folgenden Schritte, um Ihr Zertifikat zu generieren.

  1. Führen Sie die Schritte unter Festlegen und Abrufen eines Zertifikats aus Azure Key Vault mithilfe des Azure-Portals aus, um Ihr Zertifikat zu erstellen und herunterzuladen.

  2. Nachdem Sie Ihr Zertifikat erstellt haben, laden Sie sowohl die .cer-Datei als auch die PFX-Datei wie ciam-client-app-cert.cer und ciam-client-app-cert.pfx herunter. Die .cer Datei enthält den öffentlichen Schlüssel und ist das, was Sie in Ihr Microsoft Entra Admin Center hochladen.

  3. Führen Sie in Ihrem Terminal den folgenden Befehl aus, um den privaten Schlüssel aus der PFX-Datei zu extrahieren. Wenn Sie aufgefordert werden, eine Passphrase einzugeben, drücken Sie einfach die EINGABETASTE, falls Sie keine festlegen möchten. Geben Sie andernfalls einen Passwortsatz Ihrer Wahl ein.

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

    Die ciam-client-app-cert.key Datei ist das, was Sie in Ihrer App verwenden.

Hochladen des Zertifikats in Ihre App-Registrierung

Um Ihr Client-App-Zertifikat zu verwenden, müssen Sie die App, die Sie im Microsoft Entra Admin Center registriert haben, dem Zertifikat zuordnen:

  1. Melden Sie sich mindestens als Anwendungsadministrator beim Microsoft Entra Admin Center an.

  2. Wenn Sie Zugriff auf mehrere Mandanten haben, verwenden Sie das Symbol "Einstellungen" im oberen Menü, um über das Menü "Verzeichnisse + Abonnements" zu Ihrem externen Mandanten zu wechseln.

  3. Navigieren Sie zu Entra ID>App-Registrierungen.

  4. Wählen Sie in der App-Registrierungsliste die App aus, die Sie dem Zertifikat zuordnen möchten, z. B. ciam-client-app.

  5. Wählen Sie unter "Verwalten" die Option "Zertifikate und Geheime Schlüssel" aus.

  6. Wählen Sie "Zertifikate" und dann " Zertifikat hochladen" aus.

  7. Wählen Sie das Symbol "Dateidatei auswählen " und dann das Zertifikat aus, das Sie hochladen möchten, z. B. ciam-client-app-cert.pem oder ciam-client-app-cert.cer oder ciam-client-app-cert.crt.

  8. Geben Sie für "Beschreibung" eine Beschreibung ein, z. B. das CIAM-Client-App-Zertifikat, und wählen Sie dann "Hinzufügen" aus, um Ihr Zertifikat hochzuladen. Nachdem das Zertifikat hochgeladen wurde, werden die Werte "Fingerabdruck", " Startdatum" und "Ablaufdatum" angezeigt.

  9. Notieren Sie den Fingerabdruckwert für die spätere Verwendung, wenn Sie Ihre Client-App konfigurieren.

Wenn Sie einen geheimen Clientschlüssel bereits für Ihre Anwendung eingerichtet haben, müssen Sie ihn löschen, um eine schädliche Anwendung für den Identitätswechsel Ihrer Anwendung zu vermeiden:

  1. Wechseln Sie zur Registerkarte "Geheime Clientschlüssel ", und wählen Sie das Symbol "Löschen " aus.
  2. Wählen Sie im daraufhin angezeigten Popupfenster "Ja" aus.

Konfigurieren Ihrer Node.js-App für die Verwendung des Zertifikats

Nachdem Sie die App-Registrierung mit dem Zertifikat verknüpft haben, müssen Sie den App-Code aktualisieren, um mit der Verwendung des Zertifikats zu beginnen:

  1. Suchen Sie die Datei, die Ihr MSAL-Konfigurationsobjekt enthält, z msalConfig . B. in authConfig.js, und aktualisieren Sie sie dann so, dass sie ähnlich wie der folgende Code aussieht. Wenn Sie über einen geheimen Clientschlüssel verfügen, stellen Sie sicher, dass Sie ihn entfernen:

    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
    };
    

    Ersetzen Sie in Ihrem Code die Platzhalter:

    • Add_Passphrase_Here mit der Passphrase, die Sie zum Verschlüsseln Ihres privaten Schlüssels verwendet haben.

    • YOUR_CERT_THUMBPRINT mit dem zuvor erfassten Fingerabdruckwert.

    • PATH_TO_YOUR_PRIVATE_KEY_FILE mit dem Pfad zu Ihrer Datei mit dem privaten Schlüssel.

    • Enter_the_Application_Id_Here mit der Anwendungs-ID (Client) der App, die Sie zuvor registriert haben.

    • Enter_the_Tenant_Subdomain_Here und ersetzen Sie es durch die Verzeichnis-(Mandanten-)Unterdomäne. Wenn Ihre primäre Mandantendomäne z. B. contoso.onmicrosoft.comist, verwenden Sie contoso. Wenn Sie nicht über Ihren Mandantennamen verfügen, erfahren Sie, wie Sie Ihre Mandantendetails lesen.

    Wir haben den Schlüssel verschlüsselt (wir empfehlen, dies zu tun), daher müssen wir ihn entschlüsseln, bevor wir ihn an das MSAL-Konfigurationsobjekt übergeben.

    //...
    const privateKeyObject = crypto.createPrivateKey({
        key: privateKeySource,
        passphrase: 'Add_Passphrase_Here',
        format: 'pem'
    });
    
    const privateKey = privateKeyObject.export({
        format: 'pem',
        type: 'pkcs8'
    });
    //...
    
  2. Führen Sie die Schritte in "Ausführen" aus, und testen Sie die Web-App , um Ihre App zu testen.

Verwenden eines selbstsignierten Zertifikats direkt aus Azure Key Vault

Sie können Ihr vorhandenes Zertifikat direkt aus Azure Key Vault verwenden:

  1. Suchen Sie die Datei, die Ihr MSAL-Konfigurationsobjekt enthält, z msalConfig . B. in authConfig.js, und entfernen Sie dann die clientSecret Eigenschaft:

    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. Installieren Sie Azure CLI, und geben Sie dann auf der Konsole den folgenden Befehl ein, um sich anzumelden:

    az login --tenant YOUR_TENANT_ID
    

    Ersetzen Sie den Platzhalter YOUR_TENANT_ID durch die zuvor kopierte Verzeichnis-ID (Mandanten-ID).

  3. Geben Sie auf der Konsole den folgenden Befehl ein, um die erforderlichen Pakete zu installieren:

    npm install --save @azure/identity @azure/keyvault-certificates @azure/keyvault-secrets
    
  4. Verwenden Sie in Ihrer Client-App den folgenden Code, um thumbprint und privateKeyzu generieren;

    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();        
    

    Ersetzen Sie in Ihrem Code die Platzhalter:

    • ENTER_YOUR_KEY_VAULT_URL mit Ihrer Azure Key Vault-URL.

    • ENTER_THE_NAME_OF_YOUR_CERTIFICATE_ON_KEY_VAULT mit dem Namen Ihres Zertifikats im Azure Key Vault.

  5. Verwenden Sie die werte thumbprint und privateKey, um Ihre Konfiguration zu aktualisieren:

    let clientCert = {
        thumbprint: thumbprint, 
        privateKey: privateKey,
    };
    
    msalConfig.auth.clientCertificate = clientCert; //For this to work, you can't declares your msalConfig using const modifier 
    
  6. Fahren Sie dann mit dem Instanziieren Ihres vertraulichen Clients fort, wie in der getMsalInstance-Methode gezeigt:

    class AuthProvider {
        //...
        getMsalInstance(msalConfig) {
            return new msal.ConfidentialClientApplication(msalConfig);
        }
        //...
    }
    
  7. Führen Sie die Schritte in "Ausführen" aus, und testen Sie die Web-App , um Ihre App zu testen.

Erfahren Sie, wie Sie: