> ## Documentation Index
> Fetch the complete documentation index at: https://auth0.generaltranslation.app/llms.txt
> Use this file to discover all available pages before exploring further.

> SAML リクエストに署名および暗号化を行うための特別な構成シナリオについて説明します

# SAML リクエストの署名と暗号化

トランザクションのセキュリティを高めるために、<Tooltip tip="Security Assertion Markup Language（SAML）: 2 者間でパスワードを使用せずに認証情報を交換できるようにする標準化されたプロトコル。" cta="用語集を表示" href="/docs/ja-JP/glossary?term=SAML">SAML</Tooltip> プロトコルでは、リクエストとレスポンスの双方に対して署名や暗号化を行うことができます。この記事では、次の 2 つのユースケースごとに、特定のシナリオ向けの構成を紹介します。

* SAML サービス プロバイダーとしての Auth0（例: SAML 接続）
* SAML <Tooltip tip="Identity Provider（IdP）: デジタル アイデンティティを保存および管理するサービス。" cta="用語集を表示" href="/docs/ja-JP/glossary?term=identity+provider">アイデンティティ プロバイダー</Tooltip> としての Auth0（例: SAML Web App アドオンで構成されたアプリケーション）

<div id="auth0-as-the-saml-service-provider">
  ## SAML サービス プロバイダーとしての Auth0
</div>

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

<div id="sign-the-saml-authentication-request">
  ### SAML 認証リクエストに署名する
</div>

Auth0 が SAML の**サービスプロバイダー**として動作している場合は、次の手順で Auth0 が IdP（アイデンティティプロバイダー）に送信する認証リクエストに署名できます。

1. [Auth0 Dashboard > Authentication > Enterprise](https://manage.auth0.com/#/connections/enterprise) にアクセスし、**SAML** を選択します。
2. 表示する接続の名前を選択します。
3. **Sign Request** を探し、そのスイッチを有効にします。
4. **Sign Request** スイッチの下にある証明書をダウンロードし、署名を検証できるよう IdP に提供します。

<div id="enabledisable-deflate-encoding">
  #### deflate エンコーディングの有効化／無効化
</div>

デフォルトでは、SAML 認証リクエストは HTTP-Redirect 経由で送信され、deflate エンコーディングが使用されます。これにより、署名はクエリパラメーターとして付加されます。

deflate エンコーディングを無効にするには、[Management API の「Update a Connection」エンドポイントへの PATCH リクエスト](https://auth0.com/docs/api/management/v2#!/Connections/patch_connections_by_id)を行い、`deflate` オプションを `false` に設定します。

接続の `options` オブジェクトを更新すると、`options` オブジェクト全体が上書きされます。既存の接続オプションを保持するには、既存の `options` オブジェクトを取得し、その中に新しいキーと値を追加してください。

エンドポイント: `https://{yourDomain}/api/v2/connections/{yourConnectionId}`

ペイロード:

```json lines theme={null}
{
	{ 
		"options" : {
			[...], // その他すべての接続オプション
		  "deflate": false
	}
}
```

<div id="use-a-custom-key-to-sign-requests">
  ### カスタムキーを使用してリクエストに署名する
</div>

デフォルトでは、**Sign Request** トグルを有効にすると、Auth0 はテナントの秘密鍵を使用して SAML リクエストに署名します。特定の接続から送信されるリクエストに署名するために、独自の秘密鍵／公開鍵ペアを指定することもできます。

次のコマンドを使用して、独自の証明書と秘密鍵を生成できます。

```bash wrap lines theme={null}
openssl req -x509 -nodes -sha256 -days 3650 -newkey rsa:2048 -keyout private_key.key -out certificate.crt
```

接続でリクエストの署名に使用するキーの変更は Dashboard の UI からは行えません。そのため、<Tooltip tip="Management API: A product to allow customers to perform administrative tasks." cta="View Glossary" href="/docs/ja-JP/glossary?term=Management+API">Management API</Tooltip> v2 の [Update a Connection エンドポイント](https://auth0.com/docs/api/management/v2#!/Connections/patch_connections_by_id) を使用し、以下のペイロード例のとおり `options` オブジェクトに `signing_key` プロパティを追加する必要があります。

接続の `options` オブジェクトを更新すると、`options` オブジェクト全体が上書きされます。既存の接続オプションを保持するには、既存の `options` オブジェクトを取得し、そのオブジェクトに新しいキーと値を追加してください。

Endpoint: `https://{yourDomain}/api/v2/connections/{yourConnectionId}`

Payload:

```json lines theme={null}
{
	{ 
		"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](/docs/ja-JP/authenticate/protocols/saml/saml-sso-integrations/work-with-certificates-and-keys-as-strings) を参照してください。

<div id="receive-signed-saml-authentication-responses">
  ### 署名済み SAML 認証レスポンスの受信
</div>

Auth0 が SAML **サービス プロバイダー**として動作している場合、アイデンティティ プロバイダーからのすべての SAML レスポンスは、不正な第三者によって改ざんされていないことを示すために署名されている必要があります。

Auth0 でレスポンスに付された署名を検証できるようにするには、アイデンティティ プロバイダーから署名証明書を取得し、その証明書を Auth0 の Connection に読み込むよう構成する必要があります。

1. [Auth0 Dashboard > Authentication > Enterprise](https://manage.auth0.com/#/connections/enterprise) に移動し、**SAML** を選択します。
2. 表示する接続の名前を選択します。
3. **X509 Signing Certificate** を見つけ、証明書をアップロードします。
4. **Save Changes** を選択します。

Auth0 は、アサーションに対するもの、レスポンスに対するもの、またはその両方に対する署名付きレスポンスを受け入れることができます。

<div id="receive-encrypted-saml-authentication-assertions">
  ### 暗号化された SAML 認証アサーションを受信する
</div>

Auth0 が SAML サービス プロバイダーである場合、アイデンティティ プロバイダーから暗号化されたアサーションを受信する必要がある場合があります。そのためには、テナントの公開鍵証明書を IdP（アイデンティティ プロバイダー）に提供する必要があります。IdP は公開鍵を使って SAML アサーションを暗号化し、それを Auth0 に送信します。Auth0 はテナントの秘密鍵を使ってそれを復号します。

次のリンクを使用して、異なる形式の公開鍵証明書を取得してください。

* [CER](https://\{yourDomain}/cer?cert=connection)
* [PEM](https://\{yourDomain}/pem?cert=connection)
* [raw PEM](https://\{yourDomain}/rawpem?cert=connection)
* [PKCS#7](https://\{yourDomain}/pb7?cert=connection)
* [Fingerprint](https://\{yourDomain}/fingerprint?cert=connection)

IdP が要求する形式で証明書をダウンロードしてください。

<div id="use-your-key-pair-to-decrypt-encrypted-responses">
  ### キーペアを使用して暗号化されたレスポンスを復号する
</div>

前述のとおり、Auth0 はデフォルトでテナントの秘密鍵/公開鍵ペアを使用して暗号化を処理します。高度なシナリオで必要な場合は、独自の公開鍵/秘密鍵ペアを提供することもできます。

接続でリクエストの暗号化および復号に使用されるキーペアを変更することは Dashboard UI からは行えないため、Management API v2 の [Update a Connection endpoint](https://auth0.com/docs/api/management/v2#!/Connections/patch_connections_by_id) を使用し、以下のペイロード例に示すように `options` オブジェクトに `decryptionKey` プロパティを追加する必要があります。

接続の `options` オブジェクトを更新すると、`options` オブジェクト全体が上書きされます。既存の接続オプションを維持するには、既存の `options` オブジェクトを取得し、新しいキー/値ペアをそこに追加してください。

Endpoint: `https://{yourDomain}/api/v2/connections/{yourConnectionId}`

Payload:

```json lines theme={null}
{
	{ 
		"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レスポンスに署名できるようになります。

<div id="auth0-as-the-saml-identity-provider">
  ## SAML アイデンティティ プロバイダーとしての Auth0
</div>

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

<div id="sign-the-saml-responsesassertions">
  ### SAML応答/アサーションに署名する
</div>

Auth0がSAML IDプロバイダーである場合、テナントの秘密鍵を使用してSAMLアサーションに署名し、署名の検証に必要な公開鍵/証明書をサービスプロバイダーに提供します。

SAMLアサーションに署名するには：

1. [Auth0 Dashboard > Applications](https://manage.auth0.com/#/applications)に移動し、表示するアプリケーションの名前を選択します。
2. **［Settings（設定）］** ページの下までスクロールし、 **［Show Advanced Settings（詳細設定を表示）］** 、 **［Certificates（証明書）］** ビューの順に選択します。
3. **［Download Certificate（証明書のダウンロード）］** を選択し、署名証明書を受け取る形式を選択します。
4. 証明書をサービスプロバイダーに送信します。

デフォルトでは、Auth0は応答内でSAML **アサーション** に署名します。SAML **応答** に署名するには：

1. [Auth0 Dashboard > Applications](https://manage.auth0.com/#/applications)に移動し、表示するアプリケーションの名前を選択します。
2. **［Addons（アドオン）］** ビューを選択します。
3. **SAML2 Web** アプリを選択して設定を表示し、 **［（Settings）設定］** コードブロックを見つけます。
4. **`"signResponse"`** キーを見つけます。コメントを解除（または必要に応じて追加）し、値を`true`に設定します（デフォルト値は`false`）。構成はこのようになっているはずです。

   ```json lines theme={null}
   {
     [...], // other settings
     "signResponse": true
   }
   ```

<div id="change-the-signing-key-for-saml-responses">
  #### SAML レスポンスの署名キーを変更する
</div>

デフォルトでは、Auth0 はテナントに割り当てられた秘密鍵/公開鍵ペアを使用して、SAML レスポンスまたはアサーションに署名します。ごく特定のシナリオでは、独自のキー ペアを提供したい場合があります。その場合は、次のようなルールを使用して実現できます。

```javascript lines expandable theme={null}
/**
* 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);

  }
  };
```

秘密鍵と証明書ファイルを、ルールで使用できる文字列に変換する方法については、[証明書とキーを文字列として扱う](/docs/ja-JP/authenticate/protocols/saml/saml-sso-integrations/work-with-certificates-and-keys-as-strings)を参照してください。

<div id="receive-signed-saml-authentication-requests">
  ### 署名付きSAML認証要求を受信する
</div>

Auth0がSAML IDプロバイダーの場合、サービスプロバイダーの秘密鍵で署名された要求を受信できます。Auth0は、公開鍵/証明書を使用して署名を検証します。

署名の検証を構成するには：

1. 公開鍵を使用してサービスプロバイダーの証明書をダウンロードします。
2. [Auth0 Dashboard > Applications](https://manage.auth0.com/#/applications)に移動し、表示するアプリケーションの名前を選択します。
3. **［Addons（アドオン）］** ビューを選択します。
4. **SAML2 Web** アプリを選択して設定を表示し、**［（Settings）設定］** コードブロックを見つけます。
5. **`"signingCert"`** キーを見つけます。コメントを解除し（または、必要に応じて追加）、その値をサービスプロバイダーからダウンロードした証明書に設定します。構成はこのようになっているはずです。

   ```json lines theme={null}
   {
     [...], // other settings
     "signingCert": "-----BEGIN CERTIFICATE-----\nMIIC8jCCAdqgAwIBAgIJObB6jmhG0QIEMA0GCSqGSIb3DQEBBQUAMCAxHjAcBgNV\n[..all the other lines..]-----END CERTIFICATE-----\n"
   }
   ```

<div id="send-encrypted-saml-authentication-assertions">
  ### 暗号化された SAML 認証アサーションを送信する
</div>

Auth0 を SAML のアイデンティティ プロバイダーとして使用している場合、[Actions](/docs/ja-JP/customize/actions) を使って、Auth0 が送信する SAML アサーションを暗号化できます。

サービス プロバイダーから証明書と公開鍵を取得する必要があります。証明書しか入手していない場合は、`openssl` を使用して公開鍵を抽出できます。証明書ファイル名が `certificate.pem` であると仮定すると、次のコマンドを実行できます。

`openssl x509 -in certificate.pem -pubkey -noout > public_key.pem`

証明書ファイルと公開鍵ファイルを取得したら、[それらを文字列に変換して](/docs/ja-JP/authenticate/protocols/saml/saml-sso-integrations/work-with-certificates-and-keys-as-strings) Action 内で使用する必要があります。この Action は次のようになります。

```js lines theme={null}
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](http://www.w3.org/2001/04/xmlenc#aes256-cbc) はアサーションの暗号化に使用されます
* [RSA-OAEP](http://www.w3.org/2001/04/xmlenc#rsa-oaep-mgf1p)（MGF1 および SHA1 を含む）は鍵輸送に使用されます

<div id="learn-more">
  ## さらに詳しく
</div>

* [証明書とキーを文字列として扱う](/docs/ja-JP/authenticate/protocols/saml/saml-sso-integrations/work-with-certificates-and-keys-as-strings)
