java如何在SpringWebSocketClient中使用SNI?
我需要连接到支持SNI的SpringWebSocket服务器。我使用的是SpringWebSocket客户端,它默认不发送SNI扩展,因为JDK1.8.0默认不发送SNI扩展
Extended server_name (SNI Extension) not sent with jdk1.8.0 but send with jdk1.7.0
java的官方文档建议在与SSLSocket建立任何HttpsUrlConnection之前,将SNI Matcher与SSLParameters一起添加,并将SSLParameters设置为SSLSocket
https://docs.oracle.com/javase/8/docs/technotes/guides/security/jsse/JSSERefGuide.html#SNIExtension
有没有办法用SpringWebSocket客户端设置此属性
有一些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 楼答案
我也遇到了这个问题。在我的例子中,我从EKS集群获得了一个错误的证书,因为我为一个IP配置了多个主机名
所以我不得不用这个link作为引用来强制SNI提供信息。然而,我们并没有找到一种使用SpringStandard wensocket客户端实现这一点的方法
我使用了这个(link)websocket客户端来解决这个问题。基本上,我必须提供从上面链接到websocket客户端的套接字工厂包装器
比如:
SSLSocketFactory factory = new SSLSocketFactoryWrapper(sslContext, sslParameters); webSocket.setSocketFactory(factory);