将 Wildfly 14 双向 SSL 限制为特定客户端

Limiting Wildfly 14 Two-Way SSL to specific clients

我们在 WildFly 14 应用程序服务器上为外部系统 运行 维护一个带有 JAX-WS SOAP API 的 Java 应用程序。外部系统目前使用通用的单向 SSL 进行连接。我们的目标是将通信切换为相互身份验证,即双向 SSL。 不过,并非所有外部系统都可以同时进行切换,因此简单地强制执行双向 SSL 不是一种选择。我们需要在过渡阶段逐步迁移它们。这就是为什么我一直想知道:是否有可能在 WildFly HTTPS 接口上仅针对特定调用方 IP 启用双向 SSL?

我的测试基于 official documentation on setting up regular two-way SSL。按照这些步骤,每个调用者都需要提供一个客户端证书。修改该示例配置以使用 want-client-auth 而不是 need-client-auth 软化检查以支持双向 SSL 但不需要它。不幸的是,在我们的案例中这还不够,因为它并不意味着保证特定外部系统是否始终使用双向 SSL。系统可以发送一些提供客户端证书的请求,一些则不提供。换句话说,业务需要一种方式来表达 "From this day on, external system Foo may only use the API with a client certificate. All the other external systems are unaffected, for now."

要实现这一点 - 最好不要更改应用程序代码 - 我一直在阅读 new WildFly security module Elytron 的文档。它看起来很容易扩展,但是自定义组件的细节很少,而且我还没有找到听起来对我的情况有帮助的扩展点。

我现在唯一的解决方法是为 Wildfly 配置一组单独的套接字绑定和 https 侦听器,类似于 here 中描述的内容。这意味着我们将有两个 HTTPS 端口:一个使用单向 SSL,另一个使用强制性双向 SSL。当外部系统完成迁移步骤时,它们会切换用于调用我们的 API 的端口。从那时起强制他们只使用双向 SSL 端口将需要特定的防火墙规则,但应该是可能的。

因此,该解决方案在技术实现上相当简单,但会导致重新配置外部系统和调整防火墙规则的开销。这就是为什么我对任何关于更优雅的解决方案的建议或提示如何使用 Elytron 的原因感到高兴。 提前致谢!

我认为你得出了最好的结论。 Elytron 无法根据客户端参数选择 SSL 上下文(那是什么?客户端 IP 地址?在负载均衡器后面可以更改。)

所以我认为唯一的办法是在不同的端口(或主机名)上配置不同的 SSLContext。

关于扩展服务器。我猜 SSL 握手是非常早的一步,之后不同的定制点参与。我想到了一些 Undertow 自定义处理程序,类似于 [1],但正如我所说,为时已晚。

[1] http://undertow.io/undertow-docs/undertow-docs-2.0.0/index.html#redirect-handler