java - 如何在 Spring WebSocketClient 中使用 SNI?

标签 java tomcat spring-websocket stomp sni

我需要连接到支持 SNI 的 spring websocket 服务器。我正在使用默认情况下不发送 SNI 扩展的 Spring WebSocket 客户端,因为 jdk 1.8.0 默认不发送 SNI 扩展。

Extended server_name (SNI Extension) not sent with jdk1.8.0 but send with jdk1.7.0

java 的官方文档建议在使用 SSLSocket 进行任何 HttpsUrlConnection 之前添加带有 SSLParameters 的 SNI Matcher 并将 SSLParameters 设置为 SSLSocket。

https://docs.oracle.com/javase/8/docs/technotes/guides/security/jsse/JSSERefGuide.html#SNIExtension

有没有办法用 Spring WebSocket Client 设置这个属性?

可以根据给定链接设置一些 ClientEndpointCongfig 属性,但我没有找到任何可用于通过 Spring websocket 客户端设置 SSLSocket 或 SSLSocketfactory 的属性。

https://tomcat.apache.org/tomcat-8.5-doc/web-socket-howto.html

这是 Spring websocket 客户端的示例代码:

List<Transport> transports = new ArrayList<>(1);
        StandardWebSocketClient standardWebSocketClient = new StandardWebSocketClient();
        transports.add(new WebSocketTransport( standardWebSocketClient) );
        WebSocketClient transport = new SockJsClient(transports);
        WebSocketStompClient stompClient = new WebSocketStompClient(transport);
        StompSessionHandler sessionHandler = new MyStompSessionHandler();
        stompClient.connect(URL, sessionHandler);

最佳答案

我也遇到了这个问题。在我的例子中,我从 EKS 集群获得了错误的证书,因为我为单个 IP 配置了多个主机名。

所以我不得不使用这个 link作为强制 SNI 信息与请求的引用。但是没有找到用 spring standadrd wensocket 客户端做到这一点的方法。

我已经使用这个 ( link) websocket 客户端来解决这个问题。基本上我必须从上面的链接提供套接字工厂包装器到 websocket 客户端。

类似的东西: SSLSocketFactory 工厂 = new SSLSocketFactoryWrapper(sslContext, sslParameters); webSocket.setSocketFactory(工厂);

关于java - 如何在 Spring WebSocketClient 中使用 SNI?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55311784/

相关文章:

java - 分离列表适配器上的 onclicklistener

java - 如何在 web.xml 中以秒为单位设置 session 超时?

java - Java EE 网站的默认 session 超时是多少?

websocket - websockets 是如何详细工作的?

spring - Spring @SubscribeMapping 是否真的为客户端订阅了某个主题?

java - 我如何从使用 Hibernate Jpa 的多对多关系创建的关联表中获取结果

java - 无法找到以下类错误(最新版本)

java - 通过 ANT 部署到 Tomcat

jsf - Spring webflow & PrimeFaces 表达式语言-bean 方法被解释为 websphere 中的属性而不是 tomcat

java - 使用Spring的SockJsClient编写一个java websocket客户端