keycloakのServer Metadataの変遷 revisited

# keycloakのServer Metadataの変遷 revisited

## はじめに

日立製作所の乗松隆志と申します。[2018年](https://qiita.com/tnorimat/items/74100ba1fdd66b313585)に引き続き、keycloakのServer Metadataの変遷について記します。

**Notes: 本投稿の内容は、公開情報を元に独自に解釈したものです。**

## Server Metadata

Server Metadataとして記載されるクレームは、RFCなど標準仕様で規定のあるものと、製品独自のものがあると考えます。

標準仕様で規定のあるものについて、大きくは2つに分けられると考えます。

* OAuth 2.0の認可サーバーとしてのServer Metadata
* OpenID ConnectのOpenID ProviderとしてのServer Metadata

keycloakのServer Metadataは、.well-known url(.well-known/openid-configuration)から取得します。

Server Metadataには、その製品がサポートしている機能などが記載されますが、それが全てではないことにご注意ください。

## 4.8.3.Final

2019/1/15に[リリース](https://www.keycloak.org/2019/01/keycloak-483Final-released.html)されました。

```
{
 "issuer":"http://localhost:8080/auth/realms/master",
 "authorization_endpoint":"http://localhost:8080/auth/realms/master/protocol/openid-connect/auth",
 "token_endpoint":"http://localhost:8080/auth/realms/master/protocol/openid-connect/token",
 "token_introspection_endpoint":"http://localhost:8080/auth/realms/master/protocol/openid-connect/token/introspect",
 "userinfo_endpoint":"http://localhost:8080/auth/realms/master/protocol/openid-connect/userinfo",
 "end_session_endpoint":"http://localhost:8080/auth/realms/master/protocol/openid-connect/logout",
 "jwks_uri":"http://localhost:8080/auth/realms/master/protocol/openid-connect/certs",
 "check_session_iframe":"http://localhost:8080/auth/realms/master/protocol/openid-connect/login-status-iframe.html",
 "grant_types_supported":["authorization_code","implicit","refresh_token","password","client_credentials"],
 "response_types_supported":["code","none","id_token","token","id_token token","code id_token","code token","code id_token token"],
 "subject_types_supported":["public","pairwise"],
 "id_token_signing_alg_values_supported":["ES384","RS384","HS256","HS512","ES256","RS256","HS384","ES512","RS512"],
 "userinfo_signing_alg_values_supported":["ES384","RS384","HS256","HS512","ES256","RS256","HS384","ES512","RS512","none"],
 "request_object_signing_alg_values_supported":["ES384","RS384","ES256","RS256","ES512","RS512","none"],
 "response_modes_supported":["query","fragment","form_post"],
 "registration_endpoint":"http://localhost:8080/auth/realms/master/clients-registrations/openid-connect",
 "token_endpoint_auth_methods_supported":["private_key_jwt","client_secret_basic","client_secret_post","client_secret_jwt"],
 "token_endpoint_auth_signing_alg_values_supported":["RS256"],
 "claims_supported":["sub","iss","auth_time","name","given_name","family_name","preferred_username","email"],
 "claim_types_supported":["normal"],
 "claims_parameter_supported":false,
 "scopes_supported":["openid","address","email","offline_access","phone","profile","roles","web-origins"],
 "request_parameter_supported":true,
 "request_uri_parameter_supported":true,
 "code_challenge_methods_supported":["plain","S256"],
 "tls_client_certificate_bound_access_tokens":true,
 "introspection_endpoint":"http://localhost:8080/auth/realms/master/protocol/openid-connect/token/introspect"
}
```
4.5.0.Finalと変わらず、27クレームあります。

以下2クレームで、値の追加がありました。

|#|クレーム名|参照元|説明|
|:--|:--|:--|:--|
|1|"request_object_signing_alg_values_supported"|参照文献[3]|リクエストオブジェクトに対するJWSによる署名アルゴリズムについて、<br>keycloakがサポートしているもののリストです。<br>これまでは"none"と“RS256”のみのサポートでしたが、新たに"RS384","RS512","ES256","ES384","ES512"<br>がサポートされるようになりました。|
|2|"scopes_supported"|参照文献[2]|サポートしているスコープのリストです（これらが全てであるというわけではありません）。"roles"と"web-origins"が追加されました。|

4.5.0.Finalからの変更点をかいつまんで言うと、以下のようになります。

* [OIDC] リクエストオブジェクトに施される署名の署名アルゴリズムとして、新たに"RS384","RS512","ES256","ES384","ES512"がサポートされました。(もとは"RS256"と"none"のみ)

## 5.0.0

2019/3/5に[リリース](https://www.keycloak.org/2019/03/keycloak-500-released.html)されました。

```
{
 "issuer":"http://localhost:8080/auth/realms/master",
 "authorization_endpoint":"http://localhost:8080/auth/realms/master/protocol/openid-connect/auth",
 "token_endpoint":"http://localhost:8080/auth/realms/master/protocol/openid-connect/token",
 "token_introspection_endpoint":"http://localhost:8080/auth/realms/master/protocol/openid-connect/token/introspect",
 "userinfo_endpoint":"http://localhost:8080/auth/realms/master/protocol/openid-connect/userinfo",
 "end_session_endpoint":"http://localhost:8080/auth/realms/master/protocol/openid-connect/logout",
 "jwks_uri":"http://localhost:8080/auth/realms/master/protocol/openid-connect/certs",
 "check_session_iframe":"http://localhost:8080/auth/realms/master/protocol/openid-connect/login-status-iframe.html",
 "grant_types_supported":["authorization_code","implicit","refresh_token","password","client_credentials"],
 "response_types_supported":["code","none","id_token","token","id_token token","code id_token","code token","code id_token token"],
 "subject_types_supported":["public","pairwise"],
 "id_token_signing_alg_values_supported":["ES384","RS384","HS256","HS512","ES256","RS256","HS384","ES512","RS512"],
 "userinfo_signing_alg_values_supported":["ES384","RS384","HS256","HS512","ES256","RS256","HS384","ES512","RS512","none"],
 "request_object_signing_alg_values_supported":["ES384","RS384","ES256","RS256","ES512","RS512","none"],
 "response_modes_supported":["query","fragment","form_post"],
 "registration_endpoint":"http://localhost:8080/auth/realms/master/clients-registrations/openid-connect",
 "token_endpoint_auth_methods_supported":["private_key_jwt","client_secret_basic","client_secret_post","client_secret_jwt"],
 "token_endpoint_auth_signing_alg_values_supported":["RS256"],
 "claims_supported":["aud","sub","iss","auth_time","name","given_name","family_name","preferred_username","email"],
 "claim_types_supported":["normal"],
 "claims_parameter_supported":false,
 "scopes_supported":["openid","address","email","offline_access","phone","profile","roles","web-origins"],
 "request_parameter_supported":true,
 "request_uri_parameter_supported":true,
 "code_challenge_methods_supported":["plain","S256"],
 "tls_client_certificate_bound_access_tokens":true,
 "introspection_endpoint":"http://localhost:8080/auth/realms/master/protocol/openid-connect/token/introspect"
}
```

4.8.3.Finalと変わらず、27クレームあります。

以下1クレームで、値の追加がありました。

|#|クレーム名|参照元|説明|
|:--|:--|:--|:--|
|1|"claims_supported"|参照文献[3]|keycloakがサポートしているクレームの名前のリストです（これらが全てであるというわけではありません）。"aud"が追加されました。|

## 6.0.1

2019/4/24に[リリース](https://www.keycloak.org/2019/04/keycloak-601-released.html)されました。

```
{
 "issuer":"http://localhost:8080/auth/realms/master",
 "authorization_endpoint":"http://localhost:8080/auth/realms/master/protocol/openid-connect/auth",
 "token_endpoint":"http://localhost:8080/auth/realms/master/protocol/openid-connect/token",
 "token_introspection_endpoint":"http://localhost:8080/auth/realms/master/protocol/openid-connect/token/introspect",
 "userinfo_endpoint":"http://localhost:8080/auth/realms/master/protocol/openid-connect/userinfo",
 "end_session_endpoint":"http://localhost:8080/auth/realms/master/protocol/openid-connect/logout",
 "jwks_uri":"http://localhost:8080/auth/realms/master/protocol/openid-connect/certs",
 "check_session_iframe":"http://localhost:8080/auth/realms/master/protocol/openid-connect/login-status-iframe.html",
 "grant_types_supported":["authorization_code","implicit","refresh_token","password","client_credentials"],
 "response_types_supported":["code","none","id_token","token","id_token token","code id_token","code token","code id_token token"],
 "subject_types_supported":["public","pairwise"],
 "id_token_signing_alg_values_supported":["PS384","ES384","RS384","HS256","HS512","ES256","RS256","HS384","ES512","PS256","PS512","RS512"],
 "userinfo_signing_alg_values_supported":["PS384","ES384","RS384","HS256","HS512","ES256","RS256","HS384","ES512","PS256","PS512","RS512","none"],
 "request_object_signing_alg_values_supported":["PS384","ES384","RS384","ES256","RS256","ES512","PS256","PS512","RS512","none"],
 "response_modes_supported":["query","fragment","form_post"],
 "registration_endpoint":"http://localhost:8080/auth/realms/master/clients-registrations/openid-connect",
 "token_endpoint_auth_methods_supported":["private_key_jwt","client_secret_basic","client_secret_post","client_secret_jwt"],
 "token_endpoint_auth_signing_alg_values_supported":["RS256"],
 "claims_supported":["aud","sub","iss","auth_time","name","given_name","family_name","preferred_username","email"],
 "claim_types_supported":["normal"],
 "claims_parameter_supported":false,
 "scopes_supported":["openid","address","email","microprofile-jwt","offline_access","phone","profile","roles","web-origins"],
 "request_parameter_supported":true,
 "request_uri_parameter_supported":true,
 "code_challenge_methods_supported":["plain","S256"],
 "tls_client_certificate_bound_access_tokens":true,
 "introspection_endpoint":"http://localhost:8080/auth/realms/master/protocol/openid-connect/token/introspect"
}
```

5.0.0と変わらず、27クレームあります。

以下4クレームで、値の追加がありました。

|#|クレーム名|参照元|説明|
|:--|:--|:--|:--|
|1|"id_token_signing_alg_values_supported"|参照文献[3]|keycloakがサポートしている、IDトークンに対するJWSによる署名アルゴリズムのリストです。<br>新たにRSASSA-PSS(Probabilistic Signature Scheme)系のアルゴリズムである”PS256”、”PS384”、”PS512”がサポートされるようになりました。|
|2|"userinfo_signing_alg_values_supported"|参照文献[3]|UserInfoエンドポイントからの応答データに対するJWSによる署名アルゴリズムについて、keycloakがサポートしているもののリストです。<br>新たにRSASSA-PSS系のアルゴリズムである”PS256”、”PS384”、”PS512”がサポートされるようになりました。|
|3|"request_object_signing_alg_values_supported"|参照文献[3]|リクエストオブジェクトに対するJWSによる署名アルゴリズムについて、<br>keycloakがサポートしているもののリストです。<br>新たにRSASSA-PSS系のアルゴリズムである”PS256”、”PS384”、”PS512”がサポートされるようになりました。|
|4|"scopes_supported"|参照文献[2]|サポートしているスコープのリストです（これらが全てであるというわけではありません）。"microprofile-jwt"が追加されました。|

5.0.0.Finalからの変更点をかいつまんで言うと、以下のようになります。

* [OIDC] IDトークンに対するJWSによる署名アルゴリズムとして、新たに"PS256","PS384","PS512"がサポートされました。(もとはRSASSA-PKCS1-v1_5系およびECDSA(Elliptic Curve Digital Signature Algorithm)系の署名アルゴリズムのみ)
* [OIDC] UserInfoエンドポイントからの応答データに対するJWSによる署名アルゴリズムとして、新たに"PS256","PS384","PS512"がサポートされました。(もとはRSASSA-PKCS1-v1_5系およびECDSA系の署名アルゴリズムのみ)
* [OIDC] リクエストオブジェクトに対するJWSによる署名アルゴリズムとして、新たに"PS256","PS384","PS512"がサポートされました。(もとはRSASSA-PKCS1-v1_5系およびECDSA系の署名アルゴリズムのみ)

## 7.0.1

2019/10/16に[リリース](https://www.keycloak.org/2019/10/keycloak-701-released.html)されました。

```
{
 "issuer":"http://localhost:8080/auth/realms/master",
 "authorization_endpoint":"http://localhost:8080/auth/realms/master/protocol/openid-connect/auth",
 "token_endpoint":"http://localhost:8080/auth/realms/master/protocol/openid-connect/token",
 "token_introspection_endpoint":"http://localhost:8080/auth/realms/master/protocol/openid-connect/token/introspect",
 "userinfo_endpoint":"http://localhost:8080/auth/realms/master/protocol/openid-connect/userinfo",
 "end_session_endpoint":"http://localhost:8080/auth/realms/master/protocol/openid-connect/logout",
 "jwks_uri":"http://localhost:8080/auth/realms/master/protocol/openid-connect/certs",
 "check_session_iframe":"http://localhost:8080/auth/realms/master/protocol/openid-connect/login-status-iframe.html",
 "grant_types_supported":["authorization_code","implicit","refresh_token","password","client_credentials"],
 "response_types_supported":["code","none","id_token","token","id_token token","code id_token","code token","code id_token token"],
 "subject_types_supported":["public","pairwise"],
 "id_token_signing_alg_values_supported":["PS384","ES384","RS384","HS256","HS512","ES256","RS256","HS384","ES512","PS256","PS512","RS512"],
 "id_token_encryption_alg_values_supported":["RSA-OAEP","RSA1_5"],
 "id_token_encryption_enc_values_supported":["A128GCM","A128CBC-HS256"],
 "userinfo_signing_alg_values_supported":["PS384","ES384","RS384","HS256","HS512","ES256","RS256","HS384","ES512","PS256","PS512","RS512","none"],
 "request_object_signing_alg_values_supported":["PS384","ES384","RS384","ES256","RS256","ES512","PS256","PS512","RS512","none"],
 "response_modes_supported":["query","fragment","form_post"],
 "registration_endpoint":"http://localhost:8080/auth/realms/master/clients-registrations/openid-connect",
 "token_endpoint_auth_methods_supported":["private_key_jwt","client_secret_basic","client_secret_post","client_secret_jwt"],
 "token_endpoint_auth_signing_alg_values_supported":["RS256"],
 "claims_supported":["aud","sub","iss","auth_time","name","given_name","family_name","preferred_username","email"],
 "claim_types_supported":["normal"],
 "claims_parameter_supported":false,
 "scopes_supported":["openid","address","email","microprofile-jwt","offline_access","phone","profile","roles","web-origins"],
 "request_parameter_supported":true,
 "request_uri_parameter_supported":true,
 "code_challenge_methods_supported":["plain","S256"],
 "tls_client_certificate_bound_access_tokens":true,
 "introspection_endpoint":"http://localhost:8080/auth/realms/master/protocol/openid-connect/token/introspect"
}
```

以下2クレームが追加され、計29クレームとなりました。

|#|クレーム名|参照元|説明|
|:--|:--|:--|:--|
|1|"id_token_encryption_alg_values_supported"|参照文献[3]|keycloakがサポートしている、IDトークンに対するJWEによるContent Encryption Key (CEK) Management用アルゴリズムのリストです。IDトークンを暗号化するための鍵であるCEKを公開鍵で暗号化するKey Encryption方式であるRSAES-PKCS1-v1_5 ("RSA1_5")と、RSAES using Optimal Asymmetric Encryption Padding (OAEP) ("RSA-OAEP")をサポートしています。|
|2|"id_token_encryption_enc_values_supported"|参照文献[3]|keycloakがサポートしている、IDトークンに対するJWEによるContent Encryption用アルゴリズムのリストです。Authenticated Encryption (認証付き暗号)方式である、AES 128bit key Cipher Block Chain mode (CBC) with HMAC SHA-256 Authenticated Encryption ("A128CBC-HS256")と、AES 128bit key Galois/Counter Mode (GCM) ("A128GCM")をサポートしています。|

6.0.1.Finalからの変更点をかいつまんで言うと、以下のようになります。

* [OIDC] IDトークンに対するJWEによる暗号化がサポートされました。(CEK Management用のアルゴリズムとしてとして"RSA1_5"と"RSA-OAEP"、Content Encryption用のアルゴリズムとしてとして"A128CBC-HS256"と"A128GCM"をサポート)


## 8.0.0

2019/11/15に[リリース](https://www.keycloak.org/2019/11/keycloak-800-released.html)されました。

```
{
 "issuer":"http://localhost:8080/auth/realms/master",
 "authorization_endpoint":"http://localhost:8080/auth/realms/master/protocol/openid-connect/auth",
 "token_endpoint":"http://localhost:8080/auth/realms/master/protocol/openid-connect/token",
 "token_introspection_endpoint":"http://localhost:8080/auth/realms/master/protocol/openid-connect/token/introspect",
 "userinfo_endpoint":"http://localhost:8080/auth/realms/master/protocol/openid-connect/userinfo",
 "end_session_endpoint":"http://localhost:8080/auth/realms/master/protocol/openid-connect/logout",
 "jwks_uri":"http://localhost:8080/auth/realms/master/protocol/openid-connect/certs",
 "check_session_iframe":"http://localhost:8080/auth/realms/master/protocol/openid-connect/login-status-iframe.html",
 "grant_types_supported":["authorization_code","implicit","refresh_token","password","client_credentials"],
 "response_types_supported":["code","none","id_token","token","id_token token","code id_token","code token","code id_token token"],
 "subject_types_supported":["public","pairwise"],
 "id_token_signing_alg_values_supported":["PS384","ES384","RS384","HS256","HS512","ES256","RS256","HS384","ES512","PS256","PS512","RS512"],
 "id_token_encryption_alg_values_supported":["RSA-OAEP","RSA1_5"],
 "id_token_encryption_enc_values_supported":["A128GCM","A128CBC-HS256"],
 "userinfo_signing_alg_values_supported":["PS384","ES384","RS384","HS256","HS512","ES256","RS256","HS384","ES512","PS256","PS512","RS512","none"],
 "request_object_signing_alg_values_supported":["PS384","ES384","RS384","ES256","RS256","ES512","PS256","PS512","RS512","none"],
 "response_modes_supported":["query","fragment","form_post"],
 "registration_endpoint":"http://localhost:8080/auth/realms/master/clients-registrations/openid-connect",
 "token_endpoint_auth_methods_supported":["private_key_jwt","client_secret_basic","client_secret_post","tls_client_auth","client_secret_jwt"],
 "token_endpoint_auth_signing_alg_values_supported":["PS384","ES384","RS384","ES256","RS256","ES512","PS256","PS512","RS512"],
 "claims_supported":["aud","sub","iss","auth_time","name","given_name","family_name","preferred_username","email","acr"],
 "claim_types_supported":["normal"],
 "claims_parameter_supported":false,
 "scopes_supported":["openid","address","email","microprofile-jwt","offline_access","phone","profile","roles","web-origins"],
 "request_parameter_supported":true,
 "request_uri_parameter_supported":true,
 "code_challenge_methods_supported":["plain","S256"],
 "tls_client_certificate_bound_access_tokens":true,
 "introspection_endpoint":"http://localhost:8080/auth/realms/master/protocol/openid-connect/token/introspect"
}
```

7.0.1と変わらず、29クレームあります。

以下3クレームで、値の追加がありました。

|#|クレーム名|参照元|説明|
|:--|:--|:--|:--|
|1|"token_endpoint_auth_methods_supported"|参照文献[2][5]|keycloakのトークンエンドポイントがサポートしている、クライアントの認証方式のリストです。<br>新たに参照文献[5]で規定されている、PKIの証明書を用いたクライアント認証方式"tls_client_auth"がサポートされるようになりました。|
|2|"token_endpoint_auth_signing_alg_values_supported"|参照文献[2]|keycloakトークンエンドポイントがサポートするクライアントの認証方式のうち、<br>JWTへのJWSによる署名を使用する方式である"private_key_jwt"について、認可サーバーがサポートする署名アルゴリズムのリストです。<br>新たにRSASSA-PKCS1-v1_5系のアルゴリズムである"RS384"、"RS512"、RSASSA-PSS系のアルゴリズムである”PS256”、”PS384”、”PS512”、ECDSA系のアルゴリズムである”ES256”、”ES384”、”ES512”がサポートされるようになりました。(もとはRSASSA-PKCS1-v1_5系のアルゴリズムである”RS256"のみでした)|
|3|"claims_supported"|参照文献[3]|keycloakがサポートしているクレームの名前のリストです（これらが全てであるというわけではありません）。"acr"が追加されました。|

7.0.1からの変更点をかいつまんで言うと、以下のようになります。

* [OAuth 2.0] keycloakのトークンエンドポイントがサポートしている、クライアントの認証方式として、PKIの証明書を用いたクライアント認証が追加されました。
* [OAuth 2.0] keycloakトークンエンドポイントがサポートするクライアントの認証方式のうち、JWTへのJWSによる署名を使用する方式である"private_key_jwt"について、新たに"RS384","RS512","PS256","PS384","PS512","ES256","ES384","ES512"がサポートされました。(もとはRSASSA-PKCS1-v1_5系の"RS256"のみ)



## 参照文献

\[1\] [OAuth Parameters](https://www.iana.org/assignments/oauth-parameters/oauth-parameters.xhtml)

IANAのRegistryに登録済みの、OAuth 2.0に関する各種パラメータの一覧です。

\[2\] [OAuth 2.0 Authorization Server Metadata](https://tools.ietf.org/html/rfc8414#section-2)

OAuth 2.0の認可サーバーのメタデータの定義です。

\[3\] [OpenID Connect Discovery 1.0 - 3. OpenID Provider Metadata](https://openid.net/specs/openid-connect-discovery-1_0.html#ProviderMetadata)

OpenID Providerのメタデータの定義です。

\[4\] [OpenID Connect Session Management 1.0](https://openid.net/specs/openid-connect-session-1_0.html#OPMetadata)

OIDCのセッションの管理に関する、OpenID Providerのメタデータの定義です。

\[5\] [OAuth 2.0 Mutual TLS Client Authentication and Certificate Bound Access Tokens](https://tools.ietf.org/html/draft-ietf-oauth-mtls-17)

TLSにおける証明書を使用したクライアント認証を利用して、アクセストークンをHolder-of-Keyなトークンにする方法を記したものです。