> ## Documentation Index
> Fetch the complete documentation index at: https://docs-dev-fix-docs-5528-php-updates.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# SAML要求の署名と暗号化

> SAML要求の署名と暗号化を行うための特別な構成シナリオについて説明します。

トランザクションのセキュリティを強化するために、<Tooltip data-tooltip-id="react-containers-DefinitionTooltip-1" href="/docs/ja-jp/glossary?term=security-assertion-markup-language" tip="Security Assertion Markup Language（SAML）: パスワードなしに二者間で認証情報を交換できる標準化プロトコル。" cta="用語集の表示">SAML</Tooltip>プロトコルで要求と応答の両方に署名または暗号化できます。この記事では、特定のシナリオの構成について、2つのユースケースに分けて説明します。

* Auth0をSAMLサービスプロバイダーとして使用する場合（たとえば、SAML接続）
* Auth0をSAML IDプロバイダーとして使用する場合（たとえば、SAML Web Appアドオンで構成されたアプリケーション）

## Auth0をSAMLサービスプロバイダーとして使用する場合

これらのシナリオは、Auth0がSAMLサービスプロバイダーである場合に適用されます。つまり、Auth0はSAML接続を作成することによってSAML IDプロバイダーに接続します。

### SAML認証要求に署名する

Auth0がSAML **サービスプロバイダー** の場合、Auth0が<Tooltip data-tooltip-id="react-containers-DefinitionTooltip-2" href="/docs/ja-jp/glossary?term=idp" tip="IDプロバイダー（IdP）: デジタルIDを保存および管理するサービス。" cta="用語集の表示">IdP</Tooltip>に送信する認証要求に署名することができます。

1. [［Auth0 Dashboard］>［Authentication（認証）］>［Enterprise（エンタープライズ）］](https://manage.auth0.com/#/connections/enterprise)に移動し、 **［SAML］** を選択します。
2. 表示する接続の名前を選択します。
3. **［Sign Request（要求に署名する）］** を見つけて、そのスイッチを有効にします。
4. **［Sign Request（要求に署名する）］** スイッチの下にある証明書をダウンロードし、署名を検証してもらえるようにIdPに提供します。

#### deflateエンコードの有効化/無効化

デフォルトでは、SAML認証要求はHTTPリダイレクト経由で送信され、deflateエンコードを使用します。これにより、署名がクエリパラメーターに配置されます。

deflateエンコードを無効にするには、[Management APIの接続の更新エンドポイントに対して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" : {
			[...], // all the other connection options
		  "deflate": false
	}
}
```

### カスタムキーを使用して要求に署名します

デフォルトでは、Auth0はテナントの秘密鍵を使用してSAML要求に署名します（ **Sign Request（要求に署名する）** トグルが有効になっている場合）。また、独自の秘密鍵/公開鍵のペアを指定して、特定の接続からの要求に署名することもできます。

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

```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 data-tooltip-id="react-containers-DefinitionTooltip-0" href="/docs/ja-jp/glossary?term=management-api" tip="Management API: 顧客が管理タスクを実行できるようにするための製品。" cta="用語集の表示">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`オブジェクトを取得し、新しいキー/値を追加します。

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

ペイロード：

```json lines theme={null}
{
	{ 
		"options" : {
			[...], // all the other connection options
		  "signing_key": {
				"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-----"
			}
    }
	}
}
```

ペイロードで使用するためにJSON文字列としてフォーマットされた秘密鍵と証明書を取得する方法については、「[証明書とキーと文字列の操作](/docs/ja-jp/authenticate/protocols/saml/saml-sso-integrations/work-with-certificates-and-keys-as-strings)」を参照してください。

### 署名付きSAML認証応答を受信する

Auth0がSAML **サービスプロバイダー** の場合、IDプロバイダーからのすべてのSAML応答に署名して、承認されていないサードパーティによって改ざんされていないことを示す必要があります。

IDプロバイダーから署名証明書を取得し、その証明書をIDプロバイダーからAuth0接続に読み込むことで、応答の署名を検証するようにAuth0を構成する必要があります。

1. [［Auth0 Dashboard］>［Authentication（認証）］>［Enterprise（エンタープライズ）］](https://manage.auth0.com/#/connections/enterprise)に移動し、 **［SAML］** を選択します。
2. 表示する接続の名前を選択します。
3. **X509署名証明書** を見つけ、証明書をアップロードします。
4. **［Save Changes（変更の保存）］** を選択します。

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

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

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

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

* <AuthLink href="https://{yourDomain}/cer?cert=connection">CER</AuthLink>
* <AuthLink href="https://{yourDomain}/pem?cert=connection">PEM</AuthLink>
* <AuthLink href="https://{yourDomain}/rawpem?cert=connection">raw PEM</AuthLink>
* <AuthLink href="https://{yourDomain}/pb7?cert=connection">PKCS#7</AuthLink>
* <AuthLink href="https://{yourDomain}/fingerprint?cert=connection">指紋</AuthLink>

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

### キーペアを使用して暗号化された応答を復号化します

上記のように、Auth0はデフォルトでテナントの秘密鍵/公開鍵のペアを使用して暗号化を処理します。高度なシナリオで必要な場合は、独自の秘密鍵/公開鍵のペアを指定することもできます。

接続で要求の暗号化と復号化に使用されるキーペアをダッシュボードUIで変更することはできません。そのため、次のペイロードの例に示すように、Management API v2の[Update a Connection（接続の更新）エンドポイント](https://auth0.com/docs/api/management/v2#!/Connections/patch_connections_by_id)を使用し、`decryptionKey`プロパティを`options`オブジェクトに追加する必要があります。

接続の`options`オブジェクトを更新すると、`options`オブジェクト全体がオーバーライドされます。以前の接続オプションを保持するには、既存の`options`オブジェクトを取得し、新しいキー/値を追加します。

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

ペイロード：

```json lines theme={null}
{
	{ 
		"options" : {
			[...], // all the other connection 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メタデータは、提供された証明書で更新され、IDプロバイダーがそれを取得してSAML応答に署名できるようになります。

## SAML IDプロバイダーとしてのAuth0

このシナリオは、Auth0がアプリケーションのSAML IDプロバイダーである場合に適用されます。これは、DashboardでSAML Web Appアドオンが有効になっている **アプリケーション** によって表されます。

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

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

#### SAML応答の署名鍵を変更する

デフォルトでは、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) {

    // provide your own private key and certificate here  
    // see https://auth0.com/docs/authenticate/protocols/saml/saml-sso-integrations/work-with-certificates-and-keys-as-strings 
    // for formatting instructions basically you start with a PEM format certificate and
    // replace the line enedings with "\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)」を参照してください。

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

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"
   }
   ```

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

Auth0がSAML IDプロバイダーである場合は、[Actions](/docs/ja-jp/customize/actions)を使用して送信する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) => {

// this Action sets a specific public key to encrypt the SAML assertion generated from Auth0
  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を含む）

## もっと詳しく

* [証明書やキーの文字列表現で作業する](/docs/ja-jp/authenticate/protocols/saml/saml-sso-integrations/work-with-certificates-and-keys-as-strings)
