我需要连接到支持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);
答案 0 :(得分:0)
我也遇到了这个问题。就我而言,我从EKS群集中获取了错误的证书,因为我为单个IP配置了多个主机名。
因此,我不得不使用此link作为对请求强制SNI信息的参考。但是,找不到使用Spring Standadrd Wensocket客户端执行此操作的方法。
我已使用此(link)网络套接字客户端来解决此问题。基本上,我必须从上面的链接提供websocket客户端的套接字工厂包装。
类似的东西:
SSLSocketFactory factory = new SSLSocketFactoryWrapper(sslContext, sslParameters);
webSocket.setSocketFactory(factory);