メインコンテンツへスキップ
トランザクションのセキュリティを高めるために、 プロトコルでは、リクエストとレスポンスの双方に対して署名や暗号化を行うことができます。この記事では、次の 2 つのユースケースごとに、特定のシナリオ向けの構成を紹介します。
  • SAML サービス プロバイダーとしての Auth0(例: SAML 接続)
  • SAML としての Auth0(例: SAML Web App アドオンで構成されたアプリケーション)

SAML サービス プロバイダーとしての Auth0

これらのシナリオは、Auth0 が SAML サービス プロバイダーとして動作する場合に適用されます。つまり、Auth0 は SAML 接続を作成して SAML アイデンティティ プロバイダーと接続します。

SAML 認証リクエストに署名する

Auth0 が SAML のサービスプロバイダーとして動作している場合は、次の手順で Auth0 が IdP(アイデンティティプロバイダー)に送信する認証リクエストに署名できます。
  1. Auth0 Dashboard > Authentication > Enterprise にアクセスし、SAML を選択します。
  2. 表示する接続の名前を選択します。
  3. Sign Request を探し、そのスイッチを有効にします。
  4. Sign Request スイッチの下にある証明書をダウンロードし、署名を検証できるよう IdP に提供します。

deflate エンコーディングの有効化/無効化

デフォルトでは、SAML 認証リクエストは HTTP-Redirect 経由で送信され、deflate エンコーディングが使用されます。これにより、署名はクエリパラメーターとして付加されます。 deflate エンコーディングを無効にするには、Management API の「Update a Connection」エンドポイントへの PATCH リクエストを行い、deflate オプションを false に設定します。 接続の options オブジェクトを更新すると、options オブジェクト全体が上書きされます。既存の接続オプションを保持するには、既存の options オブジェクトを取得し、その中に新しいキーと値を追加してください。 エンドポイント: https://{yourDomain}/api/v2/connections/{yourConnectionId} ペイロード:
{
	{ 
		"options" : {
			[...], // その他すべての接続オプション
		  "deflate": false
	}
}

カスタムキーを使用してリクエストに署名する

デフォルトでは、Sign Request トグルを有効にすると、Auth0 はテナントの秘密鍵を使用して SAML リクエストに署名します。特定の接続から送信されるリクエストに署名するために、独自の秘密鍵/公開鍵ペアを指定することもできます。 次のコマンドを使用して、独自の証明書と秘密鍵を生成できます。
openssl req -x509 -nodes -sha256 -days 3650 -newkey rsa:2048 -keyout private_key.key -out certificate.crt
接続でリクエストの署名に使用するキーの変更は Dashboard の UI からは行えません。そのため、 v2 の Update a Connection エンドポイント を使用し、以下のペイロード例のとおり options オブジェクトに signing_key プロパティを追加する必要があります。 接続の options オブジェクトを更新すると、options オブジェクト全体が上書きされます。既存の接続オプションを保持するには、既存の options オブジェクトを取得し、そのオブジェクトに新しいキーと値を追加してください。 Endpoint: https://{yourDomain}/api/v2/connections/{yourConnectionId} Payload:
{
	{ 
		"options" : {
			[...], // その他すべてのConnection オプション
		  "signing_key": {
				"key":"-----BEGIN PRIVATE KEY-----\n...{秘密鍵をここに記述}...\n-----END PRIVATE KEY-----",
				"cert":"-----BEGIN CERTIFICATE-----\n...{公開鍵証明書をここに記述}...\n-----END CERTIFICATE-----"
			}
    }
	}
}
ペイロードで使用する JSON 形式の文字列として秘密鍵と証明書を取得する方法については、Work with Certificates and Keys and Strings を参照してください。

署名済み SAML 認証レスポンスの受信

Auth0 が SAML サービス プロバイダーとして動作している場合、アイデンティティ プロバイダーからのすべての SAML レスポンスは、不正な第三者によって改ざんされていないことを示すために署名されている必要があります。 Auth0 でレスポンスに付された署名を検証できるようにするには、アイデンティティ プロバイダーから署名証明書を取得し、その証明書を Auth0 の Connection に読み込むよう構成する必要があります。
  1. Auth0 Dashboard > Authentication > Enterprise に移動し、SAML を選択します。
  2. 表示する接続の名前を選択します。
  3. X509 Signing Certificate を見つけ、証明書をアップロードします。
  4. Save Changes を選択します。
Auth0 は、アサーションに対するもの、レスポンスに対するもの、またはその両方に対する署名付きレスポンスを受け入れることができます。

暗号化された SAML 認証アサーションを受信する

Auth0 が SAML サービス プロバイダーである場合、アイデンティティ プロバイダーから暗号化されたアサーションを受信する必要がある場合があります。そのためには、テナントの公開鍵証明書を IdP(アイデンティティ プロバイダー)に提供する必要があります。IdP は公開鍵を使って SAML アサーションを暗号化し、それを Auth0 に送信します。Auth0 はテナントの秘密鍵を使ってそれを復号します。 次のリンクを使用して、異なる形式の公開鍵証明書を取得してください。 IdP が要求する形式で証明書をダウンロードしてください。

キーペアを使用して暗号化されたレスポンスを復号する

前述のとおり、Auth0 はデフォルトでテナントの秘密鍵/公開鍵ペアを使用して暗号化を処理します。高度なシナリオで必要な場合は、独自の公開鍵/秘密鍵ペアを提供することもできます。 接続でリクエストの暗号化および復号に使用されるキーペアを変更することは Dashboard UI からは行えないため、Management API v2 の Update a Connection endpoint を使用し、以下のペイロード例に示すように options オブジェクトに decryptionKey プロパティを追加する必要があります。 接続の options オブジェクトを更新すると、options オブジェクト全体が上書きされます。既存の接続オプションを維持するには、既存の options オブジェクトを取得し、新しいキー/値ペアをそこに追加してください。 Endpoint: https://{yourDomain}/api/v2/connections/{yourConnectionId} Payload:
{
	{ 
		"options" : {
			[...], // その他すべての接続オプション
		  "decryptionKey": {
				"key":"-----BEGIN PRIVATE KEY-----\n...{your private key here}...\n-----END PRIVATE KEY-----",
				"cert":"-----BEGIN CERTIFICATE-----\n...{your public key cert here}...\n-----END CERTIFICATE-----"
			}
	}
}
接続で利用可能なSAMLメタデータは、提供された証明書で更新され、アイデンティティ プロバイダーがそれを使用してSAMLレスポンスに署名できるようになります。

SAML アイデンティティ プロバイダーとしての Auth0

このシナリオは、Auth0 がアプリケーションの SAML アイデンティティ プロバイダーとして動作する場合に該当します。Auth0 ダッシュボード上では、SAML Web App Addon が有効化された Application として表示されます。

SAML応答/アサーションに署名する

Auth0がSAML IDプロバイダーである場合、テナントの秘密鍵を使用してSAMLアサーションに署名し、署名の検証に必要な公開鍵/証明書をサービスプロバイダーに提供します。 SAMLアサーションに署名するには:
  1. Auth0 Dashboard > Applicationsに移動し、表示するアプリケーションの名前を選択します。
  2. [Settings(設定)] ページの下までスクロールし、 [Show Advanced Settings(詳細設定を表示)][Certificates(証明書)] ビューの順に選択します。
  3. [Download Certificate(証明書のダウンロード)] を選択し、署名証明書を受け取る形式を選択します。
  4. 証明書をサービスプロバイダーに送信します。
デフォルトでは、Auth0は応答内でSAML アサーション に署名します。SAML 応答 に署名するには:
  1. Auth0 Dashboard > Applicationsに移動し、表示するアプリケーションの名前を選択します。
  2. [Addons(アドオン)] ビューを選択します。
  3. SAML2 Web アプリを選択して設定を表示し、 [(Settings)設定] コードブロックを見つけます。
  4. "signResponse" キーを見つけます。コメントを解除(または必要に応じて追加)し、値をtrueに設定します(デフォルト値はfalse)。構成はこのようになっているはずです。
    {
      [...], // other settings
      "signResponse": true
    }
    

SAML レスポンスの署名キーを変更する

デフォルトでは、Auth0 はテナントに割り当てられた秘密鍵/公開鍵ペアを使用して、SAML レスポンスまたはアサーションに署名します。ごく特定のシナリオでは、独自のキー ペアを提供したい場合があります。その場合は、次のようなルールを使用して実現できます。
/**
* Handler that will be called during the execution of a PostLogin flow.
*
* @param {Event} event - Details about the user and the context in which they are logging in.
* @param {PostLoginAPI} api - Interface whose methods can be used to change the behavior of the login.
*/
exports.onExecutePostLogin = async (event, api) => {

    // replace with the ID of the application that has the SAML Web App Addon enabled
      // for which you want to change the signing key pair.
      const samlIdpClientId = 'YOUR_SAML_APP_CLIENT_ID';

    // only do this for the specific client ID.  If you have multiple IdPs that require 
    // custom certificates, you will have an "if" statement for each one.  
    if (event.client.client_id === samlIdpClientId) {

    // ここに独自の秘密鍵と証明書を指定します
    // フォーマット手順については https://auth0.com/docs/authenticate/protocols/saml/saml-sso-integrations/work-with-certificates-and-keys-as-strings を参照してください
    // 基本的にはPEM形式の証明書から始めて、
    // 改行を"\n"に置き換えます
    const signingCert = "-----BEGIN CERTIFICATE-----\nnMIIC8jCCAdqgAwIBAgIJObB6jmhG0QIEMA0GCSqGSIb3DQEBBQUAMCAxHjAcBgNV[..all the other lines..]-----END CERTIFICATE-----\n";
    const signingKey = "-----BEGIN PRIVATE KEY-----\nnMIIC8jCCAdqgAwIBAgIJObB6jmhG0QIEMA0GCSqGSIb3DQEBBQUAMCAxHjAcBgNV[..all the other lines..]-----END PRIVATE KEY-----\n";

    api.samlResponse.setCert(signingCert)    
    api.samlResponse.setKey(signingKey);

  }
  };
秘密鍵と証明書ファイルを、ルールで使用できる文字列に変換する方法については、証明書とキーを文字列として扱うを参照してください。

署名付きSAML認証要求を受信する

Auth0がSAML IDプロバイダーの場合、サービスプロバイダーの秘密鍵で署名された要求を受信できます。Auth0は、公開鍵/証明書を使用して署名を検証します。 署名の検証を構成するには:
  1. 公開鍵を使用してサービスプロバイダーの証明書をダウンロードします。
  2. Auth0 Dashboard > Applicationsに移動し、表示するアプリケーションの名前を選択します。
  3. [Addons(アドオン)] ビューを選択します。
  4. SAML2 Web アプリを選択して設定を表示し、[(Settings)設定] コードブロックを見つけます。
  5. "signingCert" キーを見つけます。コメントを解除し(または、必要に応じて追加)、その値をサービスプロバイダーからダウンロードした証明書に設定します。構成はこのようになっているはずです。
    {
      [...], // other settings
      "signingCert": "-----BEGIN CERTIFICATE-----\nMIIC8jCCAdqgAwIBAgIJObB6jmhG0QIEMA0GCSqGSIb3DQEBBQUAMCAxHjAcBgNV\n[..all the other lines..]-----END CERTIFICATE-----\n"
    }
    

暗号化された SAML 認証アサーションを送信する

Auth0 を SAML のアイデンティティ プロバイダーとして使用している場合、Actions を使って、Auth0 が送信する SAML アサーションを暗号化できます。 サービス プロバイダーから証明書と公開鍵を取得する必要があります。証明書しか入手していない場合は、openssl を使用して公開鍵を抽出できます。証明書ファイル名が certificate.pem であると仮定すると、次のコマンドを実行できます。 openssl x509 -in certificate.pem -pubkey -noout > public_key.pem 証明書ファイルと公開鍵ファイルを取得したら、それらを文字列に変換して Action 内で使用する必要があります。この Action は次のようになります。
exports.onExecutePostLogin = async (event, api) => {

// このActionは、Auth0から生成されたSAMLアサーションを暗号化するための特定の公開鍵を設定します
  if (
    event.client.client_id ===
    "THE_CLIENT_ID_OF_THE_APP_WITH_THE_SAML_APP_ADDON"
  ) {
    const encryptionCert =
      "-----BEGIN CERTIFICATE-----\nnMIIC8jCCAdqgAwIBAgIJObB6jmhG0QIEMA0GCSqGSIb3DQEBBQUAMCAxHjAcBgNV[..all the other lines..]-----END CERTIFICATE-----\n";
    const encryptionPublicKey =
      "-----BEGIN PUBLIC KEY-----\nnMIIC8jCCAdqgAwIBAgIJObB6jmhG0QIEMA0GCSqGSIb3DQEBBQUAMCAxHjAcBgNV[..all the other lines..]-----END PUBLIC KEY-----\n";

    api.samlResponse.setEncryptionCert(encryptionCert);
    api.samlResponse.setEncryptionPublicKey(encryptionPublicKey);
  }
};
次のアルゴリズムが使用されます。
  • AES256 はアサーションの暗号化に使用されます
  • RSA-OAEP(MGF1 および SHA1 を含む)は鍵輸送に使用されます

さらに詳しく