我想禁用Tomcat WebSocket实现的主机名验证,但是我没有找到任何示例。
我已经成功禁用了证书验证:
官方文档表示:
对于安全服务器端点,默认启用主机名验证。要绕过此验证(不建议),需要通过org.apache.tomcat.websocket.SSL_CONTEXT用户属性提供自定义SSLContext。自定义SSLContext必须配置具有扩展javax.net.ssl.X509ExtendedTrustManager的自定义TrustManager。然后,可以通过适当实现各个抽象方法来控制所需的验证(或缺少验证)。
我已经成功禁用了证书验证:
WebSocketContainer container = ContainerProvider.getWebSocketContainer();
ClientEndpointConfig config = ClientEndpointConfig.Builder.create().build();
TrustStrategy acceptingTrustStrategy = (X509Certificate[] chain, String authType) -> true;
SSLContext sslContext = org.apache.http.ssl.SSLContexts.custom()
.loadTrustMaterial(null, acceptingTrustStrategy)
.build();
config.getUserProperties().put("org.apache.tomcat.websocket.SSL_CONTEXT", sslContext);
官方文档表示:
对于安全服务器端点,默认启用主机名验证。要绕过此验证(不建议),需要通过org.apache.tomcat.websocket.SSL_CONTEXT用户属性提供自定义SSLContext。自定义SSLContext必须配置具有扩展javax.net.ssl.X509ExtendedTrustManager的自定义TrustManager。然后,可以通过适当实现各个抽象方法来控制所需的验证(或缺少验证)。
https://tomcat.apache.org/tomcat-8.5-doc/web-socket-howto.html
但只要我了解,X509ExtendedTrustManager 用于证书验证,而不是主机名验证。有人能帮助我吗?
setEndpointIdentificationAlgorithm("HTTPS");
将启用主机名验证:https://github.com/apache/tomcat/blob/7ce16dd575d34657b3f8b23c816bac9a871a0162/java/org/apache/tomcat/websocket/WsWebSocketContainer.java#L942 - Remo