Clientcertificaat gebruiken voor verificatie in uw Node.js-web-app
Van toepassing op: Externe tenants van werknemers (meer informatie)
Microsoft Entra Externe ID ondersteunt twee typen verificatie voor vertrouwelijke clienttoepassingen; verificatie op basis van wachtwoorden (zoals clientgeheim) en verificatie op basis van certificaten. Voor een hoger beveiligingsniveau raden we u aan een certificaat (in plaats van een clientgeheim) te gebruiken als referentie in uw vertrouwelijke clienttoepassingen.
In productie moet u een certificaat aanschaffen dat is ondertekend door een bekende certificeringsinstantie en vervolgens Azure Key Vault gebruiken om certificaattoegang en levensduur te beheren. Voor testdoeleinden kunt u echter een zelfondertekend certificaat maken en uw apps configureren om ermee te verifiëren.
In dit artikel leert u hoe u een zelfondertekend certificaat genereert met behulp van Azure Key Vault in Azure Portal, OpenSSL of PowerShell. Als u al een clientgeheim hebt, leert u hoe u het veilig kunt verwijderen.
Indien nodig kunt u ook programmatisch een zelfondertekend certificaat maken met behulp van .NET-, Node.js-, Go-, Python- of Java-clientbibliotheken.
Vereisten
Visual Studio Code of een andere code-editor.
Een externe tenant. Als u nog geen abonnement hebt, meldt u zich aan voor een gratis proefversie.
OpenSSL of u kunt OpenSSL eenvoudig installeren in Windows via Chocolatey.
Windows PowerShell - of Azure-abonnement.
Een zelfondertekend certificaat maken
Als u een bestaand zelfondertekend certificaat op uw lokale computer hebt, kunt u deze stap overslaan en doorgaan met het uploaden van het certificaat naar uw app-registratie.
U kunt Azure Key Vault gebruiken om een zelfondertekend certificaat voor uw app te genereren. Met behulp van Azure Key Vault profiteert u van voordelen, zoals het toewijzen van een partnercertificeringsinstantie (CA) en het automatiseren van certificaatrotatie.
Als u een bestaand zelfondertekend certificaat in Azure Key Vault hebt en u dit wilt gebruiken zonder het te downloaden, slaat u deze stap over en gaat u verder met het gebruik van een zelfondertekend certificaat rechtstreeks vanuit Azure Key Vault. Gebruik anders de volgende stappen om uw certificaat te genereren
Volg de stappen in Set and retrieve a certificate from Azure Key Vault using the Azure Portal to create and download your certificate.
Nadat u het certificaat hebt gemaakt, downloadt u zowel het .cer-bestand als het PFX-bestand , zoals ciam-client-app-cert.cer en ciam-client-app-cert.pfx. Het bestand .cer bevat de openbare sleutel en is wat u uploadt naar uw Microsoft Entra-beheercentrum.
Voer in de terminal de volgende opdracht uit om de persoonlijke sleutel uit het PFX-bestand te extraheren. Wanneer u wordt gevraagd een wachtwoordzin te typen, drukt u op Enter als u er geen wilt instellen. Anders typt u een wachtwoordzin van uw keuze:
openssl pkcs12 -in ciam-client-app-cert.pfx -nocerts -out ciam-client-app-cert.key
Het ciam-client-app-cert.key-bestand is wat u in uw app gebruikt.
Certificaat uploaden naar uw app-registratie
Als u het certificaat van de client-app wilt gebruiken, moet u de app die u hebt geregistreerd in het Microsoft Entra-beheercentrum koppelen aan het certificaat:
Meld u als toepassingsbeheerder aan bij het Microsoft Entra-beheercentrum.
Als u toegang hebt tot meerdere tenants, gebruikt u het pictogram Instellingen in het bovenste menu om vanuit het menu Mappen en abonnementen over te schakelen naar uw externe tenant.
Blader naar identiteitstoepassingen>> App-registraties.
Selecteer in de lijst met app-registratie de app die u aan het certificaat wilt koppelen, zoals ciam-client-app.
Selecteer onder Beheren de optie Certificaten en geheimen.
Selecteer Certificaten en selecteer vervolgens Certificaat uploaden.
Selecteer het pictogram Bestand selecteren en selecteer vervolgens het certificaat dat u wilt uploaden, zoals ciam-client-app-cert.pem of ciam-client-app-cert.cer of ciam-client-app-cert.crt.
Voor Beschrijving typt u een beschrijving, zoals het CIAM-client-app-certificaat en selecteert u Toevoegen om uw certificaat te uploaden. Zodra het certificaat is geüpload, worden de waarden voor vingerafdruk, begindatum en Verlopen weergegeven.
Noteer de vingerafdrukwaarde voor later gebruik wanneer u uw client-app configureert.
Als u al een clientgeheim voor uw toepassing hebt, moet u het verwijderen om te voorkomen dat een schadelijke toepassing wordt gebruikt voor het imiteren van uw toepassing:
- Ga naar het tabblad Clientgeheimen en selecteer het pictogram Verwijderen .
- Selecteer Ja in het pop-upvenster dat wordt weergegeven.
Uw Node.js-app configureren voor het gebruik van een certificaat
Zodra u uw app-registratie aan het certificaat hebt gekoppeld, moet u de app-code bijwerken om het certificaat te kunnen gebruiken:
Zoek het bestand met uw MSAL-configuratieobject, zoals
msalConfig
in authConfig.js, en werk het bij zodat het er ongeveer uitziet als de volgende code. Als er een clientgeheim aanwezig is, moet u het volgende verwijderen: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 };
Vervang de tijdelijke aanduidingen in uw code:
Add_Passphrase_Here
met de wachtwoordzin die u hebt gebruikt om uw persoonlijke sleutel te versleutelen.YOUR_CERT_THUMBPRINT
met de vingerafdrukwaarde die u eerder hebt genoteerd.PATH_TO_YOUR_PRIVATE_KEY_FILE
met het bestandspad naar uw persoonlijke sleutelbestand.Enter_the_Application_Id_Here
met de toepassings-id (client) van de app die u eerder hebt geregistreerd.Enter_the_Tenant_Subdomain_Here
en vervang het door het subdomein Directory (tenant). Als uw primaire tenantdomein bijvoorbeeld iscontoso.onmicrosoft.com
, gebruikt ucontoso
. Als u uw tenantnaam niet hebt, leest u de details van uw tenant.
We hebben de sleutel versleuteld (we raden u aan dit te doen), dus we moeten deze ontsleutelen voordat we deze doorgeven aan het MSAL-configuratieobject.
//... const privateKeyObject = crypto.createPrivateKey({ key: privateKeySource, passphrase: 'Add_Passphrase_Here', format: 'pem' }); const privateKey = privateKeyObject.export({ format: 'pem', type: 'pkcs8' }); //...
Gebruik de stappen in Uitvoeren en test de web-app om uw app te testen.
Een zelfondertekend certificaat rechtstreeks vanuit Azure Key Vault gebruiken
U kunt uw bestaande certificaat rechtstreeks vanuit Azure Key Vault gebruiken:
Zoek het bestand met uw MSAL-configuratieobject, zoals
msalConfig
in authConfig.js, en verwijder vervolgens declientSecret
eigenschap: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/`, }, //... };
Installeer Azure CLI en typ vervolgens in uw console de volgende opdracht om u aan te melden:
az login --tenant YOUR_TENANT_ID
Vervang de tijdelijke aanduiding
YOUR_TENANT_ID
door de map-id (tenant) die u eerder hebt gekopieerd.Typ op de console de volgende opdracht om de vereiste pakketten te installeren:
npm install --save @azure/identity @azure/keyvault-certificates @azure/keyvault-secrets
Gebruik in uw client-app de volgende code om te genereren
thumbprint
enprivateKey
;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();
Vervang de tijdelijke aanduidingen in uw code:
ENTER_YOUR_KEY_VAULT_URL
met uw Azure Key Vault-URL.ENTER_THE_NAME_OF_YOUR_CERTIFICATE_ON_KEY_VAULT
met de naam van uw certificaat in Azure Key Vault.
Gebruik de
thumbprint
enprivateKey
waarden om uw configuratie bij te werken:let clientCert = { thumbprint: thumbprint, privateKey: privateKey, }; msalConfig.auth.clientCertificate = clientCert; //For this to work, you can't declares your msalConfig using const modifier
Ga vervolgens verder met het instantiëren van uw vertrouwelijke client, zoals wordt weergegeven in de
getMsalInstance
methode:class AuthProvider { //... getMsalInstance(msalConfig) { return new msal.ConfidentialClientApplication(msalConfig); } //... }
Gebruik de stappen in Uitvoeren en test de web-app om uw app te testen.
Volgende stappen
Leer hoe u het volgende doet: