我们为运行在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侦听器,类似于这里所描述的。这意味着我们将有两个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-处理机