我需要连接到支持 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/