配置SSL后Spring WebSocket连接失败(501错误)但HTTPS正常的问题求助
我最近碰到个头疼的问题:没配置SSL之前WebSocket连接完全正常,但加上SSL配置后,HTTPS能正常访问,WebSocket却彻底连不上了。下面是我的详细情况,麻烦各位大佬帮忙看看:
应用配置文件
我的application.properties配置如下:
spring.application.name=host # Database connection params (postgresql) spring.datasource.url=jdbc\:postgresql\://127.0.0.1\:5432/cubes_and_mods spring.datasource.username=durak spring.datasource.password=1234 server.ssl.enabled=true server.ssl.key-store-type=PKCS12 server.ssl.key-store=classpath:host.p12 server.ssl.key-store-password=yourpassword server.ssl.key-alias=host server.port: 8083 ignore-source-checking: true logging.level.org.springframework.beans=DEBUG logging.level.org.springframework.context=DEBUG logging.level.org.springframework.web.socket=DEBUG logging.level.org.springframework.web.socket.handler=DEBUG # Отключаем HTTP/2 на уровне Spring Boot: server.http2.enabled=false # (Опционально) Жёстко задаём, что Tomcat — только HTTP/1.1 server.tomcat.protocol-header=HTTP/1.1 logging.level.org.springframework.web.socket.config=TRACE logging.level.org.apache.tomcat=DEBUG logging.level.org.apache.tomcat.util.net=TRACE logging.level.org.apache.coyote=DEBUG
连接测试结果
用Postman连接
ws://127.0.0.1:8083/console,直接返回400错误:Handshake Details
Request Method: GET
Status Code: 400
Request Headers
Sec-WebSocket-Version: 13
Sec-WebSocket-Key: TXRhgNgfslcOqiZFgfAO6g==
Connection: Upgrade
Upgrade: websocket
Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits
Host: 127.0.0.1:8083
Response Headers
Content-Type: text/plain;charset=UTF-8
Connection: close用Postman连接
wss://127.0.0.1:8083/console,返回501错误:Handshake Details
Request Method: GET
Status Code: 501
Request Headers
Sec-WebSocket-Version: 13
Sec-WebSocket-Key: kOgjZzwlP1ptEGKrV74eJw==
Connection: Upgrade
Upgrade: websocket
Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits
Host: 127.0.0.1:8083
Response Headers
Vary 0: Origin
1: Access-Control-Request-Method
2: Access-Control-Request-Headers
Content-Length: 0
Date: Thu, 08 May 2025 04:00:20 GMT
Connection: close换端口到8443也没用,用
wscat测试同样返回501,排除了Postman的问题:wscat -c wss://localhost:8443/console --no-check error: Unexpected server response: 501
Spring相关配置代码
WebSocket配置类
我已经配置了WebSocket注册类,启动时能看到WebsocketConfig.registerWebSocketHandlers的打印,说明这个类确实被加载了:
@Configuration @EnableWebSocket public class WebsocketConfig implements WebSocketConfigurer { @Autowired private WebsocketMinecraftConsole websocketMinecraftConsole; // Внедряем WebsocketMinecraftConsole @Override public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) { System.out.println("WebsocketConfig.registerWebSocketHandlers"); // 启动时能看到这条打印 registry.addHandler(websocketMinecraftConsole, "/console") .setAllowedOrigins("*") .setAllowedOriginPatterns("*"); } @Bean public ServerEndpointExporter serverEndpointExporter() { return new ServerEndpointExporter(); } }
CORS配置类
@Configuration public class WebConfig implements WebMvcConfigurer { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**") .allowedOrigins("*") .allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS") .allowedHeaders("*"); } }
WebSocket处理器
@Component public class WebsocketMinecraftConsole extends TextWebSocketHandler { private boolean firstMessage; // Is it the first message is ID of mineserver private DockerContainerHandler handler; // Handler for CURRENT SOCKET, contains minecraft server object from DB @Autowired private ServiceDockerContainersHandlers ServiceHandlers; // ... 其他业务代码,但目前这些代码根本没机会执行 }
相关日志片段
尝试连接后的日志(最后部分有截断):
2025-05-08T11:05:30.954+07:00 DEBUG 63134 --- [host] [nio-8083-Poller] org.apache.tomcat.util.net.NioEndpoint : timeout completed: keys processed=0; now=1746677130954; nextExpiration=1746677130953; keyCount=0; hasEvents=false; eval=false 2025-05-08T11:05:31.712+07:00 DEBUG 63134 --- [host] [nio-8083-exec-3] o.a.tomcat.util.net.SecureNioChannel : The SNI host name extracted for connection [java.nio.channels.SocketChannel[connected local=/127.0.0.1:8083 remote=/127.0.0.1:36958]] was [null] 2025-05-08T11:05:31.720+07:00 DEBUG 63134 --- [host] [nio-8083-exec-3] org.apache.tomcat.util.net.NioEndpoint : Registered write interest for [org.apache.tomcat.util.net.NioEndpoint$NioSocketWrapper@39737313:org.apache.tomcat.util.net.SecureNioChannel@622c27b8:java.nio.channels.SocketChannel[connected local=/127.0.0.1:8083 remote=/127.0.0.1:36958]] 2025-05-08T11:05:31.720+07:00 DEBUG 63134 --- [host] [nio-8083-exec-4] org.apache.tomcat.util.net.NioEndpoint : Registered write interest for [org.apache.tomcat.util.net.NioEndpoint$NioSocketWrapper@39737313:org.apache.tomcat.util.net.SecureNioChannel@622c27b8:java.nio.channels.SocketChannel[connected local=/127.0.0.1:8083 remote=/127.0.0.1:36958]] 2025-05-08T11:05:31.721+07:00 DEBUG 63134 --- [host] [nio-8083-exec-5] org.apache.tomcat.util.net.NioEndp...
我已经排查了端口、客户端工具的问题,但WebSocket的处理器代码完全没机会运行,请求连握手都失败了。有没有大佬能帮我定位下问题出在哪?
内容来源于stack exchange

