8.4. 传出 HTTP 请求


Red Hat Single Sign-On 服务器通常需要向它安全的应用程序和服务发出非浏览器 HTTP 请求。auth 服务器通过维护 HTTP 客户端连接池来管理这些传出连接。您需要在 standalone.xmlstandalone-ha.xmldomain.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="[&quot;.*\\.(google|googleapis)\\.com;http://www-proxy.acme.com:8080&quot;,&quot;.*\\.acme\\.com;NO_PROXY&quot;,&quot;.*;http://fallback:8080&quot;]"/>
        </properties>
    </provider>
</spi>

8.4.2. 使用标准环境变量

另外,也可以使用标准环境变量来配置代理映射,即 HTTP_PROXYHTTPS_PROXYNO_PROXY 变量。

HTTP_PROXYHTTPS_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_PROXYhttp_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.xmlstandalone-ha.xmldomain.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,您必须为信任存储 配置文件、和 密码
Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.