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

# tls_client_auth によるクライアント認証

> クライアント認証における tls_client_auth の処理と Authlete の設定手順について紹介します。

<Info>
  For **Authlete 2.x** documentation, see [2.x version](/ja/v2/configuration-reference/endpoints/client-authentication-using-tls-client-auth-method).
</Info>

## はじめに

[RFC 8705 の「2. Mutual TLS for OAuth Client Authentication」](https://www.rfc-editor.org/rfc/rfc8705.html#name-mutual-tls-for-oauth-client)
では、認可サーバーが相互 TLS を用いてクライアントを認証する方法が定義されています。

Authlete は、認可サーバーが TLS のクライアント証明書を用いてクライアントを認証できる機能を提供しています。本記事では、この機能の概要と有効化の手順を説明します。

## Authlete における TLS クライアント認証の仕組み

Authlete の TLS クライアント認証機能では、クライアントの認証に「クライアント ID (client ID)」と「サブジェクト名 (subject name)」（subject distinguished name / subject alternative name）を使用します。

トークンリクエストの処理時、認可サーバーは `client ID` と `subject name` のプロパティを Authlete に渡す責務を負います。クライアント ID はクライアントによるトークンリクエストの内容に含まれるため、認可サーバーが意識する必要はありません。一方「subject name」はリクエストの内容には含まれず、クライアント証明書に含まれており、クライアントと認可サーバーとの間の相互 TLS 接続から取得できます。

Authlete 側では、`TLS_CLIENT_AUTH` クライアント認証メソッドを有効にし、クライアントの subject name を登録する必要があります。<img src="https://mintcdn.com/authlete/EJDZNZMvOu_9CJHJ/configuration-reference/endpoints/mtls-client-authentication.png?fit=max&auto=format&n=EJDZNZMvOu_9CJHJ&q=85&s=3ec17a7338606fba108206cfc7f76efd" alt="mtls によるクライアント認証" width="962" height="439" data-path="configuration-reference/endpoints/mtls-client-authentication.png" />

## サービスの設定

| タブ                        | 項目                  | 値                 |
| ------------------------- | ------------------- | ----------------- |
| 「サービス設定」>「エンドポイント」>「トークン」 | 「サポート可能なクライアント認証方式」 | TLS\_CLIENT\_AUTH |

サービスで Authlete の TLS クライアント認証機能を有効にするには、次の手順を実施します。

1. [Authlete 管理コンソール](https://console.authlete.com/)にログインします。
2. 組織名をクリックし、対象のサービスを選択します。
3. 「サービス設定」>「エンドポイント」>「トークン」>「一般」に移動します。
4. 「クライアント認証方式」で `TLS_CLIENT_AUTH` メソッドを選択します。
5. 「変更を保存」をクリックしてサービス設定を更新します。

<img src="https://mintcdn.com/authlete/TIo7ciy5bMLP5_Rt/ja/configuration-reference/endpoints/tls-client-auth_ja_1.png?fit=max&auto=format&n=TIo7ciy5bMLP5_Rt&q=85&s=a4e22ae05aa042fba2542a0d971fe5ca" alt="tls-client-auth_1" width="1440" height="1300" data-path="ja/configuration-reference/endpoints/tls-client-auth_ja_1.png" />

## クライアントの設定

> この例では subject name の一種として Subject Distinguished Name（Subject DN）を使用していますが、Authlete では Subject DN に加えて、さまざまな種類の Subject Alternative Name（SAN）にも対応しています。
>
> | タブ                          | 項目           | 値                                                                     |
> | --------------------------- | ------------ | --------------------------------------------------------------------- |
> | 「クライアント設定」>「エンドポイント」>「トークン」 | 「クライアント認証方式」 | TLS\_CLIENT\_AUTH                                                     |
> | 「クライアント設定」>「エンドポイント」>「トークン」 | 「サブジェクト識別名」  | (e.g., CN=client.example.org, O=Client, L=Chiyoda-ku, ST=Tokyo, C=JP) |

クライアントで `TLS_CLIENT_AUTH` メソッドを有効にするには、次の手順を実施します。

1. [Authlete 管理コンソール](https://console.authlete.com/)にログインします。
2. 組織名をクリックし、対象のサービスを選択します。
3. 「クライアント設定」>「エンドポイント」>「トークン」>「一般」に移動します。
4. 「クライアント認証方式」でドロップダウンメニューを開き、`TLS_CLIENT_AUTH` メソッドを選択します。
5. 「変更を保存」をクリックして更新内容を適用します。

<img src="https://mintcdn.com/authlete/TIo7ciy5bMLP5_Rt/ja/configuration-reference/endpoints/tls-client-auth_ja_2.png?fit=max&auto=format&n=TIo7ciy5bMLP5_Rt&q=85&s=254b0f5aa75acff2d948a6f0e4de4d68" alt="tls-client-auth_2" width="1440" height="1500" data-path="ja/configuration-reference/endpoints/tls-client-auth_ja_2.png" />

クライアントの `subject name` を登録するには、次の手順を実施します。

1. 「クライアント設定」>「エンドポイント」>「トークン」>「MTLS」に移動します。

2. 「サブジェクト識別名」に任意の値を入力します。クライアント認証に使用する、次のようなその他の name 値を指定することもできます。
   * 「サブジェクト代替名DNS」
   * 「サブジェクト代替名IPアドレス」
   * 「サブジェクト代替名URI」
   * 「サブジェクト代替名メール」
   * 「自己署名証明書キーID」

3. 「変更を保存」をクリックして更新内容を適用します。

<img src="https://mintcdn.com/authlete/TIo7ciy5bMLP5_Rt/ja/configuration-reference/endpoints/tls-client-auth_ja_3.png?fit=max&auto=format&n=TIo7ciy5bMLP5_Rt&q=85&s=152e77bf3c047947772c3364618ea2ff" alt="tls-client-auth_3" width="1440" height="1500" data-path="ja/configuration-reference/endpoints/tls-client-auth_ja_3.png" />

以上の設定により、Authlete はクライアント認証メソッドとして相互 TLS 認証に対応し、上記クライアントからのトークンリクエストの処理にそのメソッドを適用します。Subject DN の CN=client.example.org, ... がクライアントの識別子として使用されます。

## 例

以下は、[/auth/token](/api-reference/token-endpoint/process-token-request) へのリクエストの例です（読みやすさのために折り返しています）。認可サーバーはクライアントとの間で相互 TLS 接続を確立し、その接続からクライアントの証明書を取得して、API へリクエストを行います。

クライアント ID（client\_id）を含むトークンリクエストの内容を "parameters" の値として指定し、クライアント証明書を "clientCertificate" の値として指定します。

```
curl -v -X POST https://us.authlete.com/api/21653835348762/auth/token \
-H 'Content-Type: application/json' \
-H "Authorization: Bearer <Service Access Token e.g., Xg6jVpJCvsaXvy2ks8R5WzjdMYlvQqOym3slDX0wNhQ>' \
-d '{
"parameters": "grant_type=authorization_code&redirect_uri=https://client.example.org/cb/example.com&client_id=591205987816490&code=HVIza0dGG9nDKGStAzMObYH9GkXME0aRSaLEcToHEI8",
"clientCertificate":"-----BEGIN CERTIFICATE-----
MIIDPDCCAiQCCQDWNMOIuzwDfzANBgkqhkiG9w0BAQUFADBgMQswCQYDVQQGEwJK
UDEOMAwGA1UECAwFVG9reW8xEzARBgNVBAcMCkNoaXlvZGEta3UxDzANBgNVBAoM
BkNsaWVudDEbMBkGA1UEAwwSY2xpZW50LmV4YW1wbGUub3JnMB4XDTE5MTAyODA3
MjczMFoXDTIwMTAyNzA3MjczMFowYDELMAkGA1UEBhMCSlAxDjAMBgNVBAgMBVRv
a3lvMRMwEQYDVQQHDApDaGl5b2RhLWt1MQ8wDQYDVQQKDAZDbGllbnQxGzAZBgNV
BAMMEmNsaWVudC5leGFtcGxlLm9yZzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC
AQoCggEBAK2Oyc+BV4N5pYcp47opUwsb2NaJq4X+d5Itq8whpFlZ9uCCHzF5TWSF
XrpYscOp95veGPF42eT1grfxYyvjFotE76caHhBLCkIbBh6Vf222IGMwwBbSZfO9
J3eURtEADBvsZ117HkPVdjYqvt3Pr4RxdR12zG1TcBAoTLGchyr8nBqRADFhUTCL
msYaz1ADiQ/xbJN7VUNQpKhzRWHCdYS03HpbGjYCtAbl9dJnH2EepNF0emGiSPFq
df6taToyCr7oZjM7ufmKPjiiEDbeSYTf6kbPNmmjtoPNNLeejHjP9p0IYx7l0Gkj
mx4kSMLp4vSDftrFgGfcxzaMmKBsosMCAwEAATANBgkqhkiG9w0BAQUFAAOCAQEA
qzdDYbntFLPBlbwAQlpwIjvmvwzvkQt6qgZ9Y0oMAf7pxq3i9q7W1bDol0UF4pIM
z3urEJCHO8w18JRlfOnOENkcLLLntrjOUXuNkaCDLrnv8pnp0yeTQHkSpsyMtJi9
R6r6JT9V57EJ/pWQBgKlN6qMiBkIvX7U2hEMmhZ00h/E5xMmiKbySBiJV9fBzDRf
mAy1p9YEgLsEMLnGjKHTok+hd0BLvcmXVejdUsKCg84F0zqtXEDXLCiKcpXCeeWv
lmmXxC5PH/GEMkSPiGSR7+b1i0sSotsq+M3hbdwabpJ6nQLLbKkFSGcsQ87yL+gr
So6zun26vAUJTu1o9CIjxw==
-----END CERTIFICATE-----"}'
```

Authlete はリクエストを処理し、次のような API レスポンスを認可サーバーに返します。`clientAuthMethod` が `TLS_CLIENT_AUTH` となっており、クライアントが相互 TLS を用いて認証されたことがわかります。（可読性のため折り返しています）

```
{
    "resultCode": "A050001",
    "resultMessage": "[A050001] The token request (grant_type=authorization_code) was processed successfully.",
    "accessToken": "CKH2aq4qHzR_CR0xzAnSmeYbfCX8nvanIJ5ZwoK4NY8",
    "clientAuthMethod": "TLS_CLIENT_AUTH",
    "responseContent": {
        "access_token": "CKH2aq4qHzR_CR0xzAnSmeYbfCX8nvanIJ5ZwoK4NY8",
        "refresh_token": "R2y6jhp4fudl8yI4punK3iDh-zhQHtvAhBN2k05usBU",
        "token_type": "Bearer",
        "expires_in": 3600,
        "scope": "timeline.read"
    },
    ...
}
```

認可サーバーは "responseContent" の値を取り出し、トークンレスポンスとしてクライアントに返します（詳細は省略します）。

## 関連情報

* [クライアント認証の設定](/ja/configuration-reference/endpoints/configuring-client-authentication)

> この記事では、Authlete におけるクライアント認証設定の基本を説明しています。

* [相互 TLS による証明書バインドアクセストークンの発行](/ja/configuration-reference/tokens-and-claims/issuing-mutual-tls-certificate-bound-access-tokens)

> この記事では、「RFC 8705 OAuth 2.0 Mutual-TLS Client Authentication and Certificate-Bound Access Tokens」で定義された「相互 TLS による証明書バインドアクセストークン」を Authlete で利用するための設定手順を説明しています。

* [Authlete FAPI Enhancements](https://www.authlete.com/resources/videos/20180724/authlete-fapi-enhancements/)

> このビデオは、2018 年 7 月 24 日に東京で開催された「[Financial APIs Workshop 2018](https://financial-api.net/)
> 」のセッションの一つです。Authlete の Justin Richer が、OAuth インフラを構築するための Authlete 独自のセミホスト型アプローチと従来型アプローチの比較、そして Financial-grade API（FAPI）を実現するために Authlete がどのようにクライアント認証機能を拡張し相互 TLS に対応したかを解説しています。
