次の方法で共有


Node.js Web アプリでの認証にクライアント証明書を使用する

適用対象: 灰色の X 記号が付いた白い円。 従業員テナント緑 の円と白いチェック マーク記号。 外部テナント (詳細)

Microsoft Entra External ID は、 機密クライアント アプリケーションの 2 種類の認証をサポートしています。パスワードベースの認証 (クライアント シークレットなど) と証明書ベースの認証。 より高いレベルのセキュリティを実現するには、機密クライアント アプリケーションで (クライアント シークレットではなく) 証明書を資格情報として使用することをお勧めします。

運用環境では、既知の証明機関によって署名された証明書を購入し、 Azure Key Vault を使用して証明書のアクセスと有効期間を管理する必要があります。 ただし、テストの目的で自己署名証明書を作成し、これを使って認証するようにアプリを構成できます。

この記事では、Azure portal、OpenSSL、または PowerShell で Azure Key Vault を使用して自己署名証明書を生成する方法について説明します。 クライアント シークレットが既にある場合は、それを安全に削除する方法について説明します。

必要に応じて、 .NETNode.jsGoPython 、または Java クライアント ライブラリを使用して、プログラムによって自己署名証明書を作成することもできます。

[前提条件]

自己署名証明書を作成する

ローカル コンピューターに既存の自己署名証明書がある場合は、この手順をスキップして、 アプリの登録に証明書をアップロードするに進むことができます。

Azure Key Vault を使用して、アプリの自己署名証明書を生成できます。 Azure Key Vault を使用すると、パートナー証明機関 (CA) の割り当てや証明書ローテーションの自動化などの利点があります。

Azure Key Vault に既存の自己署名証明書があり、それをダウンロードせずに使用する場合は、この手順をスキップして、「 Azure Key Vault から自己署名証明書を直接使用する」に進みます。 それ以外の場合は、次の手順に従って証明書を生成します

  1. Azure portal を使用して Azure Key Vault から証明書を設定して取得 する」の手順に従って、証明書を作成してダウンロードします。

  2. 証明書を作成したら、 .cer ファイルと .pfx ファイル ( ciam-client-app-cert.cerciam-client-app-cert.pfx など) の両方をダウンロードします。 .cer ファイルには公開キーが含まれており、Microsoft Entra 管理センターにアップロードするファイルです。

  3. ターミナルで次のコマンドを実行して、 .pfx ファイルから秘密キーを抽出します。 パスフレーズを入力するように求められたら、設定しない場合はただ Enter キーを押してください。 それ以外の場合は、任意のパス フレーズを入力します。

    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. Entra ID>App 登録に移動します

  4. アプリ登録の一覧から、証明書に関連付けるアプリ ( ciam-client-app など) を選択します。

  5. [ 管理] で、[ 証明書とシークレット] を選択します。

  6. [ 証明書] を選択し、[ 証明書のアップロード] を選択します。

  7. [ファイル ファイルの 選択 ] アイコンを選択し、アップロードする証明書 ( ciam-client-app-cert.pemciam-client-app-cert.cerciam-client-app-cert.crt など) を選択します。

  8. [ 説明] に、 CIAM クライアント アプリ証明書などの説明を入力し、[ 追加] を選択して証明書をアップロードします。 証明書がアップロードされると、 拇印開始日、有効期限 値が表示されます。

  9. 後でクライアント アプリを構成するときに使用する 拇印 の値を記録します。

アプリケーション用のクライアント シークレットが既に用意されている場合は、アプリケーションを偽装する悪意のあるアプリケーションを回避するために、それを削除する必要があります。

  1. [クライアント シークレット] タブに移動し、[削除] アイコンを選択します。
  2. 表示されるポップアップ ウィンドウで、[ はい] を選択します。

証明書を使用するように Node.js アプリを構成する

アプリの登録を証明書に関連付けたら、証明書の使用を開始するようにアプリ コードを更新する必要があります。

  1. msalConfig など、MSAL 構成オブジェクトが含まれるファイルを見つけて、次のコードのように更新します。 クライアント シークレットが存在する場合は、必ずそれを削除します。

    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 を、前に登録したアプリのアプリケーション (クライアント) ID に置き換えます。

    • 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. 「Web アプリを実行してテストする」の手順を使用してアプリをテストします。

Azure Key Vault から自己署名証明書を直接使用する

次のように、既存の証明書を Azure Key Vault から直接使用できます。

  1. msalConfig など、MSAL 構成オブジェクトが含まれるファイルを見つけて、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 を、、前にコピーしたディレクトリ (テナント) ID に置き換えます。

  3. コンソールで次のコマンドを入力して、必要なパッケージをインストールします。

    npm install --save @azure/identity @azure/keyvault-certificates @azure/keyvault-secrets
    
  4. クライアント アプリで、次のコードを使用して thumbprintprivateKey を生成します。

    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 を実際の Azure Key Vault の URL に置き換えます。

    • ENTER_THE_NAME_OF_YOUR_CERTIFICATE_ON_KEY_VAULT を、Azure Key Vault 内の証明書の名前に置き換えます。

  5. thumbprintprivateKey の値を使用して構成を更新します。

    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. 「Web アプリを実行してテストする」の手順を使用してアプリをテストします。

具体的には、次の方法を学習します。