配置出站 HTTP 请求

如何配置用于出站 HTTP 请求的客户端。

Keycloak 经常需要向其保护的应用程序和服务发出请求。Keycloak 使用 HTTP 客户端管理这些出站连接。本指南介绍如何配置客户端、连接池、代理环境设置、超时等。

配置 TLS 连接的受信任证书

请参阅 配置受信任证书,了解如何配置 Keycloak Truststore,以便 Keycloak 能够执行使用 TLS 的出站请求。

客户端配置命令

Keycloak 用于出站通信的 HTTP 客户端是高度可配置的。要配置 Keycloak 出站 HTTP 客户端,请输入以下命令

bin/kc.[sh|bat] start --spi-connections-http-client-default-<configurationoption>=<value>

以下是命令选项

establish-connection-timeout-millis

建立连接超时前的最长时间,以毫秒为单位。默认值:未设置。

socket-timeout-millis

两个数据包之间不活动的最长时间,直到套接字连接超时,以毫秒为单位。默认值:5000 毫秒

connection-pool-size

出站连接的连接池大小。默认值:128。

max-pooled-per-route

每个主机可以池化的连接数。默认值:64。

connection-ttl-millis

最大连接生存时间,以毫秒为单位。默认值:未设置。

max-connection-idle-time-millis

空闲连接在连接池中保持的最长时间,以毫秒为单位。空闲连接将由后台清理线程从池中删除。将此选项设置为 -1 以禁用此检查。默认值:900000。

disable-cookies

启用或禁用 cookie 缓存。默认值:true。

client-keystore

Java 密钥库文件的文件路径。此密钥库包含用于 mTLS 的客户端证书。

client-keystore-password

客户端密钥库的密码。当设置 client-keystore 时为必需。

client-key-password

客户端私钥的密码。当设置 client-keystore 时为必需。

proxy-mappings

指定出站 HTTP 请求的代理配置。有关更多详细信息,请参阅 出站 HTTP 请求的代理映射

disable-trust-manager

如果出站请求需要 HTTPS 并且此配置选项设置为 true,则您不必指定信任存储。此设置仅应在开发期间使用,绝不能在生产环境中使用,因为它将禁用 SSL 证书的验证。默认值:false。

出站 HTTP 请求的代理映射

要配置出站请求以使用代理,您可以使用以下标准代理环境变量来配置代理映射:HTTP_PROXYHTTPS_PROXYNO_PROXY

  • HTTP_PROXYHTTPS_PROXY 变量表示用于出站 HTTP 请求的代理服务器。Keycloak 不区分这两个变量。如果您同时定义这两个变量,则 HTTPS_PROXY 优先,而与代理服务器使用的实际方案无关。

  • NO_PROXY 变量定义了一个逗号分隔的主机名列表,这些主机名不应使用代理。对于您指定的每个主机名,其所有子域也被排除在使用代理之外。

环境变量可以是小写或大写。小写优先。例如,如果您同时定义了 HTTP_PROXYhttp_proxy,则使用 http_proxy

代理映射和环境变量示例
HTTPS_PROXY=https://www-proxy.acme.com:8080
NO_PROXY=google.com,login.facebook.com

在此示例中,会发生以下结果

  • 所有出站请求都使用代理 https://www-proxy.acme.com:8080,但对 google.com 或 google.com 的任何子域(如 auth.google.com)的请求除外。

  • login.facebook.com 及其所有子域不使用定义的代理,但 groups.facebook.com 使用代理,因为它不是 login.facebook.com 的子域。

使用正则表达式的代理映射

除了使用环境变量进行代理映射外,另一种方法是为 Keycloak 发送的出站请求配置逗号分隔的代理映射列表。代理映射由基于正则表达式的主机名模式和代理 URI 组成,格式为 hostname-pattern;proxy-uri

例如,考虑以下正则表达式

.*\.(google|googleapis)\.com

您可以通过输入以下命令来应用基于正则表达式的主机名模式

bin/kc.[sh|bat] start --spi-connections-http-client-default-proxy-mappings='.*\\.(google|googleapis)\\.com;http://www-proxy.acme.com:8080'

反斜杠字符 \ 再次被转义,因为 micro-profile 配置用于解析映射数组。

为了确定出站 HTTP 请求的代理,会发生以下情况

  • 目标主机名与所有配置的主机名模式进行匹配。

  • 使用第一个匹配模式的代理 URI。

  • 如果没有配置的模式与主机名匹配,则不使用代理。

当您的代理服务器需要身份验证时,请以 username:password@ 格式包含代理用户的凭据。例如

.*\.(google|googleapis)\.com;http://proxyuser:password@www-proxy.acme.com:8080
代理映射的正则表达式示例
# All requests to Google APIs use http://www-proxy.acme.com:8080 as proxy
.*\.(google|googleapis)\.com;http://www-proxy.acme.com:8080

# All requests to internal systems use no proxy
.*\.acme\.com;NO_PROXY

# All other requests use http://fallback:8080 as proxy
.*;http://fallback:8080

在此示例中,会发生以下情况

  • 代理 URI 的特殊值 NO_PROXY 被使用,这意味着对于匹配关联主机名模式的主机不使用代理。

  • catch-all 模式结束代理映射,为所有出站请求提供默认代理。

相关选项

truststore-paths

pkcs12(p12、pfx 或 pkcs12 文件扩展名)、PEM 文件或包含将用作系统信任存储的这些文件的目录的列表。

CLI: --truststore-paths
Env: KC_TRUSTSTORE_PATHS

在此页上