通过HTTPS的Websockets 403禁止访问。

13

我目前正在尝试在我的Spring Boot 1.2应用程序中设置HTTPS。该应用程序使用大量的Websockets在两个服务器之间进行通信。当它在简单的HTTP上运行时,一切都正常,但是当我将其切换到HTTPS时,在Firefox和Chrome上都会收到403 Forbidden错误(还没有在IE上测试)。我有一个SimpleCORSFilter设置,接受所有连接,所以我不认为那是问题所在。所有发送到同一服务器的HTTPS RESTful请求都可以正常工作,只有Websockets似乎被阻止了。
这是我的WebSocket Spring配置

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig extends        
    AbstractWebSocketMessageBrokerConfigurer {
    @Override
    public void configureMessageBroker(MessageBrokerRegistry config) {
        config.enableSimpleBroker("/topic");
        config.setApplicationDestinationPrefixes("/app");
    }
    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        registry.addEndpoint("/simulation").withSockJS();
    }
}

这里是我的前端 WebSocket 连接

   socket = new SockJS(https://my.url + '/simulation');
   stompClient = Stomp.over(socket);
   stompClient.debug = false;
   stompClient.connect({}, function(frame) {
        stompClient.subscribe('/topic/', function(status){
                  // Do something with result
        });
   });

编辑:这是Chrome控制台中的错误

GET https://localhost:8090/simulation/info 403 (Forbidden)
stomp.js:8 Whoops! Lost connection to undefined

编辑2:这个错误似乎是最近从spring boot 1.1升级到spring boot 1.2的副作用。当我确定是哪个依赖项导致了错误时,我会更新的。


1
有Spring Security吗? - Bozho
该应用程序目前未使用Spring Security。 - Jake C.
1
看这里:https://dev59.com/ieo6XIcBkEYKwwoYJA7p - Lukasz Ciesluk
1个回答

23

试一下这个:

@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
    registry.addEndpoint("/simulation").setAllowedOrigins("*").withSockJS();
}

请注意,允许所有来源的起源可能会导致跨站点请求伪造。有关防范该问题的方法,请参考https://www.owasp.org/index.php/Cross-Site_Request_Forgery_(CSRF)


还��要什么吗?我正在尝试使用Grails 3.0.9和Grails-Spring-Websocket插件2.1.0,但它不起作用。 - Eylen
我终于成功连接了,但我不得不在Java中添加CorsFilter并在resources.groovy中注册它。Grails拦截器对此无效。 - Eylen
1
允许跨站点请求伪造不会影响安全吗? - user2417480
@user2417480,你说得完全正确,但是可以通过使用XSRF令牌或类似的方式来保护它。 - Harry Cho
@user2417480:是的,允许所有来源都不好。如果在您的情况下使用“*”进行测试,那么您应该在此之后将其删除,并手动定义所有您的websocket/STOMP端点允许运行的来源,例如https://example.com。Spring始终允许来自相同源的资源,即使您在此定义了某些内容。您手动允许的来源将覆盖同源策略,因此定义它们没有任何危害。 - TXN
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接