如何在Spring WebSocketClient中使用SNI?

时间:2019-03-23 07:54:59

标签: java tomcat spring-websocket stomp sni

我需要连接到支持SNI的spring websocket服务器。我正在使用Spring WebSocket Client,默认情况下它不发送SNI扩展,因为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);

1 个答案:

答案 0 :(得分:0)

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

因此,我不得不使用此link作为对请求强制SNI信息的参考。但是,找不到使用Spring Standadrd Wensocket客户端执行此操作的方法。

我已使用此(link)网络套接字客户端来解决此问题。基本上,我必须从上面的链接提供websocket客户端的套接字工厂包装。

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