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
相关产品推荐
相关产品推荐

