You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

配置SSL后Spring WebSocket连接失败(501错误)但HTTPS正常的问题求助

配置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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.08 11:14:30