Поделиться через


Использование сертификата клиента для проверки подлинности в веб-приложении Node.js

Область применения: Белый круг с серым символом X. клиенты рабочей силы внешниеЗеленый круг с символом белой галочки.клиенты (дополнительные сведения)

Внешняя идентификация Microsoft Entra поддерживает два типа проверки подлинности для конфиденциальных клиентских приложений; проверку подлинности на основе паролей (например, секрет клиента) и проверку подлинности на основе сертификатов. Для повышения уровня безопасности рекомендуется использовать сертификат (вместо секрета клиента) в качестве учетных данных в конфиденциальных клиентских приложениях.

В рабочей среде необходимо приобрести сертификат, подписанный известным центром сертификации, а затем использовать Azure Key Vault для управления доступом к сертификатам и временем существования. Однако в целях тестирования можно создать самозаверяющий сертификат и настроить приложения для проверки подлинности с его помощью.

В этой статье описано, как создать самозаверяющий сертификат с помощью Azure Key Vault в портал Azure, OpenSSL или PowerShell. Если у вас уже есть секрет клиента, вы узнаете, как безопасно удалить его.

При необходимости вы также можете создать самозаверяющий сертификат программным способом с помощью клиентских библиотек .NET, Node.js, Go, Python или Java.

Необходимые компоненты

Создание самозаверяющего сертификата

Если у вас есть самозаверяющий сертификат на локальном компьютере, этот шаг можно пропустить, а затем перейти к регистрации приложения.

Azure Key Vault можно использовать для создания самозаверяющего сертификата для приложения. Используя Azure Key Vault, вы пользуетесь преимуществами, такими как назначение центра сертификации партнера (ЦС) и автоматизация смены сертификатов.

Если у вас есть самозаверяющий сертификат в Azure Key Vault и вы хотите использовать его, не скачивая его, пропустите этот шаг, а затем перейдите к использованию самозаверяющего сертификата непосредственно из Azure Key Vault. В противном случае выполните следующие действия, чтобы создать сертификат.

  1. Выполните действия, описанные в разделе "Настройка" и получение сертификата из Azure Key Vault с помощью портал Azure для создания и скачивания сертификата.

  2. После создания сертификата скачайте файл .cer и PFX-файл, например ciam-client-app-cert.cer и ciam-client-app-cert.pfx. Файл .cer содержит открытый ключ и является тем, что вы отправляете в Центр администрирования Microsoft Entra.

  3. В терминале выполните следующую команду, чтобы извлечь закрытый ключ из PFX-файла . При появлении запроса на ввод секретной фразы просто нажмите клавишу ВВОД , если вы не хотите задать ее. В противном случае введите парольную фразу:

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

    Файл ciam-client-app-cert.key — это то, что вы используете в приложении.

Отправка сертификата в регистрацию приложения

Чтобы использовать сертификат клиентского приложения, необходимо связать приложение, зарегистрированного в Центре администрирования Microsoft Entra, с сертификатом:

  1. Войдите в Центр администрирования Microsoft Entra как минимум администратор приложений.

  2. Если у вас есть доступ к нескольким клиентам, используйте значок параметров в верхнем меню, чтобы переключиться на внешний клиент из меню каталогов и подписок.

  3. Перейдите к приложениям> удостоверений>Регистрация приложений.

  4. В списке регистрации приложений выберите приложение, которое вы хотите связать с сертификатом, например ciam-client-app.

  5. В разделе Управление выберите Сертификаты и секреты.

  6. Выберите сертификаты, а затем нажмите кнопку "Отправить сертификат".

  7. Щелкните значок "Выбрать файл", а затем выберите сертификат, который требуется отправить, например ciam-client-app-cert.pem или ciam-client-app-cert.cer или ciam-client-app-cert.crt.

  8. В поле "Описание" введите описание, например сертификат клиентского приложения CIAM, а затем нажмите кнопку "Добавить ", чтобы отправить сертификат. После отправки сертификата отображаются значения отпечатка, даты начала и истечения срока действия .

  9. Запишите значение отпечатка для последующего использования при настройке клиентского приложения.

Если у вас уже есть секрет клиента для приложения, необходимо удалить его, чтобы избежать вредоносного приложения для олицетворения приложения:

  1. Перейдите на вкладку секретов клиента и щелкните значок "Удалить ".
  2. В появившемся всплывающем окне нажмите кнопку "Да".

Настройка приложения Node.js для использования сертификата

После связывания регистрации приложения с сертификатом необходимо обновить код приложения, чтобы начать использование сертификата:

  1. Найдите файл, содержащий объект конфигурации MSAL, например msalConfig в authConfig.js, а затем обновите его так, чтобы он выглядел примерно так, как показано в следующем коде. Если у вас есть секрет клиента, удалите его:

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

    В коде замените заполнители:

    • Add_Passphrase_Here с секретной фразой, используемой для шифрования закрытого ключа.

    • YOUR_CERT_THUMBPRINTзначение отпечатка, записанное ранее.

    • PATH_TO_YOUR_PRIVATE_KEY_FILE с путем к файлу закрытого ключа.

    • Enter_the_Application_Id_Here с идентификатором приложения (клиента) зарегистрированного ранее приложения.

    • Enter_the_Tenant_Subdomain_Here и замените его поддоменом каталога (клиента). Например, если основной домен клиента — это contoso.onmicrosoft.com, используйте contoso. Если у вас нет имени клиента, узнайте, как прочитать сведения о клиенте.

    Мы зашифровали ключ (рекомендуется это сделать), поэтому необходимо расшифровать его перед передачей в объект конфигурации MSAL.

    //...
    const privateKeyObject = crypto.createPrivateKey({
        key: privateKeySource,
        passphrase: 'Add_Passphrase_Here',
        format: 'pem'
    });
    
    const privateKey = privateKeyObject.export({
        format: 'pem',
        type: 'pkcs8'
    });
    //...
    
  2. Выполните действия, описанные в разделе "Запуск и тестирование веб-приложения " для тестирования приложения.

Использование самозаверяющего сертификата непосредственно из Azure Key Vault

Существующий сертификат можно использовать непосредственно из Azure Key Vault:

  1. Найдите файл, содержащий объект конфигурации MSAL, например msalConfig в authConfig.js, а затем удалите 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. Установите Azure CLI, а затем в консоли введите следующую команду для входа:

    az login --tenant YOUR_TENANT_ID
    

    Замените заполнитель YOUR_TENANT_ID идентификатором каталога (клиента), скопированным ранее.

  3. В консоли введите следующую команду, чтобы установить необходимые пакеты:

    npm install --save @azure/identity @azure/keyvault-certificates @azure/keyvault-secrets
    
  4. В клиентском приложении используйте следующий код для создания thumbprint и 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();        
    

    В коде замените заполнители:

    • ENTER_YOUR_KEY_VAULT_URL с URL-адресом Azure Key Vault.

    • ENTER_THE_NAME_OF_YOUR_CERTIFICATE_ON_KEY_VAULT с именем сертификата в Azure Key Vault.

  5. thumbprint Используйте значения для privateKey обновления конфигурации:

    let clientCert = {
        thumbprint: thumbprint, 
        privateKey: privateKey,
    };
    
    msalConfig.auth.clientCertificate = clientCert; //For this to work, you can't declares your msalConfig using const modifier 
    
  6. Затем перейдите к созданию экземпляра конфиденциального клиента, как показано в методе getMsalInstance :

    class AuthProvider {
        //...
        getMsalInstance(msalConfig) {
            return new msal.ConfidentialClientApplication(msalConfig);
        }
        //...
    }
    
  7. Выполните действия, описанные в разделе "Запуск и тестирование веб-приложения " для тестирования приложения.

Следующие шаги

Вы узнаете, как выполнять следующие задачи: