我们正在为在 WildFly 14 应用服务器上运行的外部系统维护一个带有 JAX-WS SOAP API 的 Java 应用程序。外部系统当前使用通用单向 SSL 进行连接。我们的目标是将通信切换为相互身份验证,即双向 SSL。但是,并非所有外部系统都可以同时进行切换,因此简单地强制执行双向 SSL 不是一种选择。我们需要在过渡阶段逐步迁移它们。这就是我一直想知道的原因:是否有可能在 WildFly HTTPS 接口上仅为特定调用方 IP 启用双向 SSL?
我的测试基于关于设置常规双向 SSL 的官方文档。按照这些步骤,每个调用者都需要提供客户端证书。修改该示例配置以使用want-client-auth
而不是need-client-auth
软化检查以支持双向 SSL,但不需要它。不幸的是,在我们的案例中这还不够,因为它并不意味着特定外部系统是否始终使用双向 SSL 的保证。系统可以发送一些提供客户端证书的请求,而另一些则不发送。换句话说,业务需要一种方式来说明“从今天开始,外部系统Foo只能使用带有客户端证书的 API。所有其他外部系统暂时不受影响。”
为了实现这一点——最好不要更改应用程序代码——我一直在阅读新的 WildFly 安全模块 Elytron的文档。它看起来很可扩展,但是关于自定义组件的细节很少,而且我还没有找到一个听起来对我有帮助的扩展点。
我现在唯一的解决方案是为 Wildfly 配置一组单独的套接字绑定和 https-listener,类似于此处描述的内容。这意味着我们将有两个 HTTPS 端口:一个带有单向 SSL,另一个带有强制性双向 SSL。随着外部系统完成迁移步骤,它们会切换用于调用我们 API 的端口。从那时起强制他们只使用双向 SSL 端口将需要特定的防火墙规则,但应该是可能的。
因此,该解决方案在技术实现上相当简单,但会导致重新配置外部系统和调整防火墙规则的开销。这就是为什么我会对任何关于更优雅的解决方案的建议或提示如何使用 Elytron 的建议感到高兴。提前致谢!