我的 JBoss 应用服务器具有相互 SSL 身份验证设置(我们根据客户端证书进行一些处理)。
我需要在 JBoss 前面有一个 Web 服务器。哪个 Apache 模块可以对 JBoss 进行 SSL 传递?
答案1
除非你追求的是一些非常简单的事情(将所有 SSL 流量直接转发到 JBoss,根本不需要 Apache 进行任何处理,在这种情况下你也可以使用像 rinetd 这样的 TCP 转发器),否则无论你试图做什么都是不可能的。
为了让 Apache任何事物使用 SSL 连接时,它必须与客户端协商对称密钥。Apache 完成此操作后,如果 Apache “仅”将结果流转发给 JBoss,JBoss 将无法解密连接。通常,您会将解密的连接转发给应用程序。您甚至可以让 Apache 建立从 Apache 到 JBoss 的新 SSL 连接,但如果没有客户端的证书,它就不会拥有 JBoss 正在寻找的身份验证信息。
需要考虑的事情:你能让 JBoss 读取非 SSL 连接的连接头来获取此客户端信息吗?那么你可以使用 mod_rewrite 从客户端证书中捕获信息。 (可用变量列表)(结合 mod_rewrite、mod_headers 和 mod_proxy 来实现这一点的实际(如果是旧的)示例)
如果问题是你想通过 Web 服务器而不是 JBoss 提供某些内容,请考虑设置单独的主机,例如https://static.example.com。
答案2
这可能是徒劳无功的,因为我不确定 JBoss 将如何处理这个问题,但听起来使用SSLOptions +ExportCertData
将通过 AJP 连接传递客户端证书,凭借 AJP 传递环境变量的能力。
这取决于您对 Apache 和 JBoss 服务器之间未加密数据的接受程度,以及 JBoss 是否会识别传递的环境变量中的证书。请参阅这里。
答案3
虽然在不破坏客户端证书认证的情况下无法解密 Web 服务器上的流量,但也许可以将其传递下去。
Web 服务器唯一可见的是客户端 hello 消息中的 SNI - 通常包含请求的域名。您可以根据 SNI 区分流量并以不同方式处理。其他任何内容都将被加密(包括 URL)
HA-proxy 的示例取自:https://www.me2digital.com/blog/2019/05/haproxy-sni-routing/
frontend public_ssl
bind :::443 v4v6
option tcplog
tcp-request inspect-delay 5s
tcp-request content capture req.ssl_sni len 25
tcp-request content accept if { req.ssl_hello_type 1 }
# https://www.haproxy.com/blog/introduction-to-haproxy-maps/
use_backend %[req.ssl_sni,lower,map(/usr/local/etc/haproxy/tcp-domain2backend-map.txt)]
default_backend be_sni
我不确定 Apache 是否可以做到这一点 - 但我很想学习。