搜索

8.5. 传出 HTTP 请求

download PDF

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 请求的代理配置。如需了解更多详细信息,请参阅有关 代理映射的部分,以了解 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="[&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.5.2. 使用标准环境变量

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

HTTP_PROXYHTTPS_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.comauth.login.facebook.com。但是,例如 groups.facebook.com 将通过代理路由。

注意

环境变量可以是小写或大写。小写具有优先权。例如,如果同时定义了 HTTP_PROXYhttp_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.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"/>
        </properties>
    </provider>
</spi>

此设置的可能配置选项有:

file
Java 密钥存储文件的路径。HTTPS 请求需要一种方法来验证它们要与之通信的服务器的主机。这就是信任者的作用。该密钥存储包含一个或多个可信主机证书或证书颁发机构。这个信任存储文件应该只包含安全主机的公共证书。如果定义了这些属性,则这是 REQUIRED
password
密钥存储的密码。如果定义了这些属性,则这是 REQUIRED
hostname-verification-policy
WILDCARD 默认.对于 HTTPS 请求,这将验证服务器证书的主机名。ANY 表示无法验证主机名。WILDCARD Allows 子域名称中的通配符,例如:*.foo.com。STRICT CN CN 必须与主机名完全匹配。
Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

© 2024 Red Hat, Inc.