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

Postman可连接但网站无法建立WebSocket连接的排查求助

问题:前端WebSocket连接Spring后端报SSL握手错误(certificate_unknown)

问题背景

  • 前端:部署在https://belaschinke.com/projects/ticTacToe的React应用,初始化WebSocket连接代码如下:
    export default function TicTacToeAPI({
      nickname,
      roomNumber,
      setMenuState,
    }: TicTacToeAPIProps) {
      //websocket
      const [websocket, setWebsocket] = useState(
        new WebSocket("wss://150.230.148.196:8080/ticTacToe")
      );
      (...)
    }
    
  • 后端:云VM上的Java Spring应用,WebSocket配置代码如下:
    import ...
    
    @Configuration
    @EnableWebSocket
    public class WebSocketConfig implements WebSocketConfigurer, WebSocketMessageBrokerConfigurer {
    
        @Override
        public void registerStompEndpoints(StompEndpointRegistry registry) {
            registry.addEndpoint("/ticTacToe").setAllowedOrigins("*").withSockJS();
        }
        @Override
        public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) {
            registry.addHandler(ticTacToeHandler(), "/ticTacToe")
                    .setAllowedOrigins("*");
        }
    
        @Override
        public void configureMessageBroker(MessageBrokerRegistry config) {
            config.enableSimpleBroker("/topic");
            config.setApplicationDestinationPrefixes( "/app");
        }
    
        @Bean
        public GameMessageHandler<TicTacToeGame> ticTacToeHandler() {
            return new GameMessageHandler();
        }
    
        @Bean
        public Class<TicTacToeGame> ticTacToeGameClass() {
            return TicTacToeGame.class;
        }
    
    }
    
  • 异常现象:Postman可正常建立WS连接,前端连接失败;后端DEBUG日志显示javax.net.ssl.SSLHandshakeException: Received fatal alert: certificate_unknown
  • 已排查:前端网站TLS证书有效、刷新过证书、更换网络无效

调试与定位步骤

1. 验证后端证书与访问IP的匹配性

浏览器对SSL证书的域名/IP校验远严于Postman:

  • 直接在浏览器地址栏访问https://150.230.148.196:8080,查看证书提示(是否显示“域名不匹配”“证书无效”)
  • 如果后端证书绑定的是域名而非IP,浏览器会直接判定证书无效,触发certificate_unknown错误

2. 检查Spring应用的SSL配置完整性

确保Spring Boot已正确加载有效证书,在application.properties/application.yml中确认以下配置:

server.port=8080
server.ssl.enabled=true
server.ssl.key-store=classpath:your-cert-file.jks
server.ssl.key-store-password=your-cert-password
server.ssl.key-alias=your-cert-alias
  • 查看启动日志,确认SSL初始化成功(无证书加载失败的报错)
  • 在VM上执行keytool -list -v -keystore your-cert-file.jks,验证证书的有效期、绑定的域名/IP是否正确

3. 用OpenSSL测试SSL握手状态

通过命令行验证后端SSL服务的有效性:

openssl s_client -connect 150.230.148.196:8080
  • 查看输出中的Verify return code:如果是0 (ok)说明证书信任正常,非0值则对应具体错误(如62表示域名不匹配)
  • 同时检查输出中的证书链是否完整,确保包含根证书和中间证书

4. 排查浏览器端的混合内容与证书错误

打开浏览器开发者工具(F12):

  • Console标签:查看是否有Mixed Content或Certificate Invalid类报错
  • Network标签:找到WebSocket请求,查看请求状态和详细的SSL错误信息(如“证书不受信任”“域名不匹配”)

5. 确认WebSocket端点绑定HTTPS端口

确保Spring的WebSocket端点正确关联到HTTPS端口:

  • 禁用Spring应用的HTTP端口(仅保留HTTPS的8080端口),测试连接是否正常
  • 检查WebSocket配置是否未被其他HTTP相关配置覆盖

6. 补充完整证书链

如果后端证书缺少中间证书,浏览器无法完成信任链验证:

  • 从证书颁发机构获取中间证书,将其导入到后端的密钥库中:
    keytool -import -trustcacerts -alias intermediate -file intermediate.crt -keystore your-cert-file.jks
    
  • 重新启动Spring应用,再次测试连接

内容的提问来源于stack exchange,提问作者Bela

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 06:11:11