8.5. 传出 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 请求的代理配置。如需了解更多详细信息,请参阅有关 代理映射的部分,以了解 HTTP 请求。
- disable-trust-manager
-
如果传出请求需要 HTTPS,且该配置选项被设置为
true
,则不需要指定信任存储。此设置应只在开发期间使用,永远不会 在生产环境中使用,因为它将禁用 SSL 证书的验证。这是 选项。默认值为false
。
8.5.1. 传出 HTTP 请求的代理映射
Red Hat Single Sign-On 发送的传出 HTTP 请求可以选择性地根据以逗号分隔的代理映射列表使用代理服务器。proxy-mapping 以 hostnamePattern;proxyUri
的形式表示基于 regex 的主机名和 proxy-uri 的组合,例如:
.*\.(google|googleapis)\.com;http://www-proxy.acme.com:8080
要确定传出 HTTP 请求的代理,目标主机名与配置的主机名解析模式匹配。第一个匹配模式决定要使用的代理部分。如果给定主机名没有配置的模式都不匹配,则无法使用代理。
如果代理服务器需要身份验证,请使用以下格式包括代理用户的凭据,即 username:password@
。例如:
.*\.(google|googleapis)\.com;http://user01:pas2w0rd@www-proxy.acme.com:8080
proxy-uri 的特殊值 NO_PROXY
用于表示不应将任何代理用于与相关主机名模式匹配的主机。可以在 proxy-mappings 的末尾指定一个 catch-all 模式,为所有传出请求定义默认代理。
以下示例演示了 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.5.2. 使用标准环境变量
或者,也可以使用标准环境变量来配置代理映射,即 HTTP_PROXY
、HTTPS_PROXY
和 NO_PROXY
变量。
HTTP_PROXY
和 HTTPS_PROXY
变量代表应用于所有传出 HTTP 请求的代理服务器。Red Hat Single Sign-On 在两者之间没有不同。如果同时指定了,HTTPS_PROXY
会优先考虑代理服务器使用的实际方案。
NO_PROXY
变量用于定义不应使用代理的主机名的逗号分隔列表。如果指定了主机名,则使用代理将其所有前缀(子域)都排除在内。
使用以下示例:
HTTPS_PROXY=https://www-proxy.acme.com:8080 NO_PROXY=google.com,login.facebook.com
在这个示例中,除 login.google.com
的请求外,所有传出的 HTTP 请求都将使用 https://www-proxy.acme.com:8080
代理服务器,google.com
、auth.login.facebook.com
。但是,例如 groups.facebook.com
将通过代理路由。
环境变量可以是小写或大写。小写具有优先权。例如,如果同时定义了 HTTP_PROXY
和 http_proxy
,则将使用 http_proxy
。
如果使用子系统配置来定义代理映射(如上所述),红帽单点登录不会考虑环境变量。在这种情况下,不应使用代理服务器,尽管定义了 HTTP_PROXY
环境变量。要做到这一点,您可以指定一个通用没有代理路由,如下所示:
<spi name="connectionsHttpClient"> <provider name="default" enabled="true"> <properties> <property name="proxy-mappings" value=".*;NO_PROXY"/> </properties> </provider> </spi>
8.5.3. 传出的 HTTPS 请求信任存储
当 Red Hat Single Sign-On 在远程 HTTPS 端点上调用时,必须验证远程服务器的证书,以确保它连接到可信服务器。这是防止中间人攻击的必要性。这些远程服务器或者签署这些证书的 CA 的证书必须放在信任存储中。这个信任存储由红帽单点登录服务器管理。
信任器的配置始终由 Red Hat Single Sign-On truststore SPI 进行。如果密钥存储是由 JBoss 安全传统或 Elytron TLS 配置的,则本节中的说明适用。
在安全地连接到身份代理、LDAP 身份提供程序、发送电子邮件以及与客户端应用程序后端通信时使用信任存储。
默认情况下,没有配置信任存储提供程序,任何 https 连接都回退到标准的 java 信任存储配置,如 Java 的 JSSE 参考指南 中所述。如果没有建立信任,则这些传出 HTTPS 请求将失败。
您可以使用 keytool 创建新信任存储文件,或将可信主机证书添加到现有主机证书中:
$ keytool -import -alias HOSTDOMAIN -keystore truststore.jks -file host-certificate.cer
truststore 在分发的 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"/> </properties> </provider> </spi>
此设置的可能配置选项有:
- file
- Java 密钥存储文件的路径。HTTPS 请求需要一种方法来验证它们要与之通信的服务器的主机。这就是信任者的作用。该密钥存储包含一个或多个可信主机证书或证书颁发机构。这个信任存储文件应该只包含安全主机的公共证书。如果定义了这些属性,则这是 REQUIRED。
- password
- 密钥存储的密码。如果定义了这些属性,则这是 REQUIRED。
- hostname-verification-policy
-
WILDCARD
默认.对于 HTTPS 请求,这将验证服务器证书的主机名。ANY
表示无法验证主机名。WILDCARD
Allows 子域名称中的通配符,例如:*.foo.com。STRICT
CN CN 必须与主机名完全匹配。