有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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) 个答案

  1. # 1 楼答案

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

    所以我不得不用这个link作为引用来强制SNI提供信息。然而,我们并没有找到一种使用SpringStandard wensocket客户端实现这一点的方法

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

    比如: SSLSocketFactory factory = new SSLSocketFactoryWrapper(sslContext, sslParameters); webSocket.setSocketFactory(factory);