8.4. 传出 HTTP 请求
Red Hat Single Sign-On 服务器通常需要向它安全的应用程序和服务发出非浏览器 HTTP 请求。auth 服务器通过维护 HTTP 客户端连接池来管理这些传出连接。您需要在 standalone.xml
、standalone-ha.xml
或 domain.xml
中进行配置。此文件的位置取决于您的 操作模式。
HTTP 客户端配置示例
<spi name="connectionsHttpClient"> <provider name="default" enabled="true"> <properties> <property name="connection-pool-size" value="256"/> </properties> </provider> </spi>
可能的配置选项有:
- establish-connection-timeout-millis
- 建立套接字连接的超时时间。
- socket-timeout-millis
- 如果传出请求没有收到数据时,请超时连接。
- connection-pool-size
- 池中可以有多少个连接(默认为128)。
- max-pooled-per-route
- 每个主机可池连接数量(默认为 64)。
- connection-ttl-millis
- 以毫秒为单位进行的最大连接时间。默认情况下不设置。
- max-connection-idle-time-millis
-
连接在连接池中可能保持闲置的最大时间(默认为900 秒)。将启动 Apache HTTP 客户端的后台清理线程。设置为
-1
可禁用此检查和后台线程。 - disable-cookies
-
默认情况下为
true
。当设置为 true 时,这将禁用任何 Cookie 缓存。 - client-keystore
- 这是 Java 密钥存储文件的文件路径。此密钥存储包含双向 SSL 的客户端证书。
- client-keystore-password
-
客户端密钥存储的密码。如果设置了
client-keystore
,则这是 REQUIRED。 - client-key-password
-
客户端密钥的密码。如果设置了
client-keystore
,则这是 REQUIRED。 - proxy-mappings
- 表示传出 HTTP 请求的代理配置。如需了解更多详细信息,请参阅有关 Proxy Mappings for Outgoing HTTP Requests 部分。
- disable-trust-manager
-
如果传出请求需要 HTTPS,且这个配置选项被设置为
true
,则不必指定信任存储。此设置仅应在开发期间使用,且不应 在生产环境中使用,因为它将禁用 SSL 证书的验证。这是 选项。默认值为false
。
8.4.1. 传出 HTTP 请求的代理映射
Red Hat Single Sign-On 发送的传出 HTTP 请求可以选择使用基于以逗号分隔的代理映射列表的代理服务器。proxy-mapping 表示基于 regex 的 hostname 模式和 proxy-uri 的结合,格式为 hostnamePattern;proxyUri
,例如:
.*\.(google|googleapis)\.com;http://www-proxy.acme.com:8080
要确定目标主机名与配置的主机名匹配的传出 HTTP 请求的代理。第一个匹配模式决定了要使用的 proxy-uri。如果没有为给定主机名匹配的配置模式,则不会使用代理。
如果代理服务器需要身份验证,请包含代理用户的凭据,格式为 username:password@
。例如:
.*\.(google|googleapis)\.com;http://user01:pas2w0rd@www-proxy.acme.com:8080
proxy-uri 的特殊值 NO_PROXY
来表示不应用于匹配关联主机名模式的主机。可以在 proxy-mappings 的末尾指定一个概括性模式,为所有传出请求定义默认代理。
以下示例演示了 proxy-mapping 配置。
# All requests to Google APIs should use http://www-proxy.acme.com:8080 as proxy .*\.(google|googleapis)\.com;http://www-proxy.acme.com:8080 # All requests to internal systems should use no proxy .*\.acme\.com;NO_PROXY # All other requests should use http://fallback:8080 as proxy .*;http://fallback:8080
这可以通过以下 jboss-cli
命令进行配置。请注意,您需要正确转义 regex-pattern,如下所示。
echo SETUP: Configure proxy routes for HttpClient SPI # In case there is no connectionsHttpClient definition yet /subsystem=keycloak-server/spi=connectionsHttpClient/provider=default:add(enabled=true) # Configure the proxy-mappings /subsystem=keycloak-server/spi=connectionsHttpClient/provider=default:write-attribute(name=properties.proxy-mappings,value=[".*\\.(google|googleapis)\\.com;http://www-proxy.acme.com:8080",".*\\.acme\\.com;NO_PROXY",".*;http://fallback:8080"])
jboss-cli
命令产生以下子系统配置:请注意,一个需要用 "
字符编码为" 字符
。
<spi name="connectionsHttpClient"> <provider name="default" enabled="true"> <properties> <property name="proxy-mappings" value="[".*\\.(google|googleapis)\\.com;http://www-proxy.acme.com:8080",".*\\.acme\\.com;NO_PROXY",".*;http://fallback:8080"]"/> </properties> </provider> </spi>
8.4.2. 使用标准环境变量
另外,也可以使用标准环境变量来配置代理映射,即 HTTP_PROXY
、HTTPS_PROXY
和 NO_PROXY
变量。
HTTP_PROXY
和 HTTPS_PROXY
变量代表所有传出 HTTP 请求的代理服务器。红帽单点登录在两者之间没有不同。如果同时指定了这两者,则 HTTPS_PROXY
会优先考虑代理服务器使用的实际方案。
NO_PROXY
变量用于定义不应使用代理的主机名的逗号分隔列表。如果指定了主机名,则所有前缀(子域)也会在使用代理中排除。
获取以下示例:
HTTPS_PROXY=https://www-proxy.acme.com:8080 NO_PROXY=google.com,login.facebook.com
在本例中,所有传出的 HTTP 请求都将使用 https://www-proxy.acme.com:8080
代理服务器,但请求发送到示例 login.google.com
,google.com
,auth.login.facebook.com
。但是,例如 groups.facebook.com
将通过代理进行路由。
环境变量可以是小写或大写。小写优先级.例如,如果同时定义了 HTTP_PROXY
和 http_proxy
,则将使用 http_proxy
。
如果使用子系统配置(如上所述)定义代理映射,则 Red Hat Sign-On 不会考虑环境变量。在这种情况下,应该不使用代理服务器,尽管定义了 HTTP_PROXY
环境变量。要做到这一点,您可以指定一个通用没有代理路由,如下所示:
<spi name="connectionsHttpClient"> <provider name="default" enabled="true"> <properties> <property name="proxy-mappings" value=".*;NO_PROXY"/> </properties> </provider> </spi>
8.4.3. 传出 HTTPS 请求信任存储
当 Red Hat Single Sign-On 在远程 HTTPS 端点上调用时,它必须验证远程服务器的证书以确保其连接到可信服务器。这是为了防止中间人攻击所必需的。这些远程服务器或者签名的 CA 的证书必须放在信任存储中。此信任存储由 Red Hat Single Sign-On 服务器管理。
当安全地连接到身份代理、LDAP 身份提供程序、发送电子邮件时以及与客户端应用程序后端通信时,会使用 truststore。
默认情况下,不会配置信任存储提供程序,任何 https 连接都回退到标准的 java 信任存储配置,如 Java 的 JSSE 参考指南 中所述。如果没有建立信任,则这些传出 HTTPS 请求将失败。
您可以使用 keytool 创建新的信任存储文件,或将现有可信主机证书中添加可信主机证书:
$ keytool -import -alias HOSTDOMAIN -keystore truststore.jks -file host-certificate.cer
信任存储在分发的 standalone.xml
、standalone-ha.xml
或 domain.xml
文件中进行配置。此文件的位置取决于您的 操作模式。您可以使用以下模板添加信任存储配置:
<spi name="truststore"> <provider name="file" enabled="true"> <properties> <property name="file" value="path to your .jks file containing public certificates"/> <property name="password" value="password"/> <property name="hostname-verification-policy" value="WILDCARD"/> <property name="enabled" value="true"/> </properties> </provider> </spi>
此设置的可能配置选项有:
- file
-
Java 密钥存储文件的路径。HTTPS 请求需要一种方式来验证所讨论的服务器主机。这是信任者的作用。密钥存储包含一个或多个可信主机证书或证书颁发机构。此信任存储文件应该只包含安全主机的公共证书。
如果启用
,这是 REQUIRED。 - password
-
truststore 的密码。
如果启用
,这是 REQUIRED。 - hostname-verification-policy
-
默认
WILDCARD
。对于 HTTPS 请求,这会验证服务器证书的主机名。ANY
表示主机名不会被验证。WILDCARD
允许子域名(如 *.foo.com)中的通配符。STRICT
CN 必须完全匹配主机名。 - enabled
-
如果为 false (默认值),则信任存储配置将被忽略,证书检查将回退到 JSSE 配置,如所述。如果设置为 true,您必须为信任存储
配置文件
、和密码
。