Share via


Use el certificado de cliente para la autenticación en su aplicación web de Node.js

Id. externa de Microsoft Entra admite dos tipos de autenticación para aplicaciones cliente confidenciales; autenticación basada en contraseña (como el secreto de cliente) y la autenticación basada en certificados. Para obtener un mayor nivel de seguridad, se recomienda usar un certificado (en lugar de un secreto de cliente) como credencial en las aplicaciones cliente confidenciales.

En producción, debe comprar un certificado firmado por una entidad de certificación conocida y usar Azure Key Vault para administrar el acceso a certificados y la duración para usted. Sin embargo, con fines de prueba, puede crear un certificado autofirmado y configurar sus aplicaciones para que se autentiquen con él.

En este artículo, aprenderá a generar un certificado auto firmado utilizando Azure Key Vault en el portal de Azure, OpenSSL o PowerShell. Si ya tiene un secreto de cliente, aprenderá a eliminarlo de forma segura.

Cuando sea necesario, también puede crear un certificado autofirmado mediante programación usando bibliotecas cliente de .NET, Node.js, Go, Python o Java.

Prerrequisitos

Crear un certificado autofirmado

Si tiene un certificado autofirmado existente en su equipo local, puede omitir este paso y continuar con Cargar certificado en el registro de la aplicación.

Puede usar Azure Key Vault para generar un certificado autofirmado para la aplicación. Con Azure Key Vault puede disfrutar de ventajas como asignar una entidad de certificación (CA) asociada y automatizar la rotación de certificados.

Si tiene ya un certificado autofirmado en Azure Key Vault y desea usarlo sin descargarlo, omita este paso y vaya a Uso de un certificado autofirmado directamente desde Azure Key Vault. De lo contrario, siga estos pasos para generar su certificado

  1. Siga los pasos descritos en Establecimiento y recuperación de un certificado de Azure Key Vault mediante Azure Portal para crear y descargar su certificado.

  2. Cuando haya creado su certificado, descargue el archivo .cer y el archivo .pfx , como ciam-client-app-cert.cer y ciam-client-app-cert.pfx. El archivo .cer contiene la clave pública y es lo que usted carga en el centro de administración de Microsoft Entra.

  3. En su terminal, ejecute el siguiente comando para extraer la clave privada del archivo .pfx. Cuando se le pida que escriba una frase de contraseña, simplemente presione la tecla Entrar si no desea establecer una. De lo contrario, elija una frase de contraseña y escríbala:

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

    El archivo ciam-client-app-cert.key es lo que usa en la aplicación.

Carga del certificado en su registro de la aplicación

Para usar su certificado de aplicación cliente, debe asociar la aplicación que registró en el centro de administración de Microsoft Entra con el certificado:

  1. Inicie sesión en el centro de administración de Microsoft Entra como Administrador de aplicaciones como mínimo.

  2. Si tiene acceso a varios inquilinos, use el icono Configuración en el menú superior para cambiar al inquilino externo desde el menú Directorios y suscripciones.

  3. Vaya aIdentidad>Aplicaciones>Registros de aplicaciones.

  4. En la lista de registro de aplicaciones, seleccione la aplicación que desee asociar al certificado, como ciam-client-app.

  5. En Administrar, seleccione Certificados y secretos.

  6. Seleccione Certificados y, después, Cargar certificado.

  7. Seleccione el icono Seleccionar un archivo y luego seleccione el certificado que desea cargar, como ciam-client-app-cert.pem o ciam-client-app-cert.cer o ciam-client-app-cert.crt.

  8. En Descripción, escriba una descripción, como certificado aplicación cliente CIAM y, a continuación, seleccione Agregar para cargar el certificado. Una vez que se carga el certificado, se muestran los valores Huella digital, Fecha de inicio y Expira.

  9. Registre el valor Huella digital para usarlo más adelante al configurar su aplicación cliente.

Si ya tiene un secreto de cliente implementado para la aplicación, debe eliminarlo para evitar que una aplicación malintencionada suplante la aplicación:

  1. Vaya a la pestaña Secretos de cliente y seleccione el icono Eliminar.
  2. En la ventana emergente que aparece, seleccione .

Configure su aplicación Node.js para usar el certificado

Una vez que asocie su registro de la aplicación con el certificado, debe actualizar el código de la aplicación para empezar a usar el certificado:

  1. Busque el archivo que contiene el objeto de configuración de MSAL, como msalConfig en authConfig.js y actualícelo para que tenga un aspecto similar al código siguiente. Si tiene un secreto de cliente presente, asegúrese de quitarlo:

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

    En el código, reemplace los marcadores de posición:

    • Add_Passphrase_Here por la frase de contraseña que usó para cifrar su clave privada.

    • YOUR_CERT_THUMBPRINT por el valor de huella digital que registró anteriormente.

    • PATH_TO_YOUR_PRIVATE_KEY_FILE por la ruta de acceso al archivo de su clave privada.

    • Enter_the_Application_Id_Here por el Id. de aplicación (cliente) de la aplicación que registró anteriormente.

    • Enter_the_Tenant_Subdomain_Here y reemplácelo por el subdominio del directorio (inquilino). Por ejemplo, si el dominio principal del inquilino es contoso.onmicrosoft.com, use contoso. Si no tiene el nombre del inquilino, aprenda cómo leer los detalles del inquilino.

    Hemos cifrado la clave (le recomendamos hacerlo), por lo que tenemos que descifrarla antes de pasarla al objeto de configuración MSAL.

    //...
    const privateKeyObject = crypto.createPrivateKey({
        key: privateKeySource,
        passphrase: 'Add_Passphrase_Here',
        format: 'pem'
    });
    
    const privateKey = privateKeyObject.export({
        format: 'pem',
        type: 'pkcs8'
    });
    //...
    
  2. Siga los pasos descritos en Ejecución y prueba de la aplicación web para probar su aplicación.

Use un certificado autofirmado directamente desde Azure Key Vault

Puede usar el certificado que tenga ya directamente desde Azure Key Vault:

  1. Busque el archivo que contiene el objeto de configuración de MSAL, como msalConfig en authConfig.jsy, a continuación, quite la propiedad 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. Instale CLI de Azure y luego escriba en la consola el siguiente comando para iniciar sesión:

    az login --tenant YOUR_TENANT_ID
    

    Reemplace el marcador de posición YOUR_TENANT_ID por el identificador de directorio (inquilino) que copió anteriormente.

  3. En su consola, escriba el siguiente comando para instalar los paquetes necesarios:

    npm install --save @azure/identity @azure/keyvault-certificates @azure/keyvault-secrets
    
  4. En la aplicación cliente, use el código siguiente para generar thumbprint y 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();        
    

    En el código, reemplace los marcadores de posición:

    • ENTER_YOUR_KEY_VAULT_URL por su URL de Azure Key Vault.

    • ENTER_THE_NAME_OF_YOUR_CERTIFICATE_ON_KEY_VAULT por el nombre de su certificado en Azure Key Vault.

  5. Use los valores thumbprint y privateKey para actualizar la configuración:

    let clientCert = {
        thumbprint: thumbprint, 
        privateKey: privateKey,
    };
    
    msalConfig.auth.clientCertificate = clientCert; //For this to work, you can't declares your msalConfig using const modifier 
    
  6. A continuación, pase a crear una instancia de cliente confidencial, como se muestra en el método getMsalInstance:

    class AuthProvider {
        //...
        getMsalInstance(msalConfig) {
            return new msal.ConfidentialClientApplication(msalConfig);
        }
        //...
    }
    
  7. Siga los pasos descritos en Ejecución y prueba de la aplicación web para probar su aplicación.

Pasos siguientes

Obtenga información sobre cómo: