Tomcat 安全 Websocket

Cab*_*ath 5 sockets ssl https tomcat websocket

我在 Tomcat 8 上无法通过 TLS 获得 WebSocket 连接。

我已经设置了以下连接器:

<Connector  port="8080" protocol="HTTP/1.1"
            connectionTimeout="20000"
            redirectPort="8443"
/>

<Connector  port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
            maxThreads="150" SSLEnabled="true" scheme="https" secure="true"
            clientAuth="false" sslProtocol="TLS"
            keystorefile="${user.home}/.keystore" keystorePass="password"
/>
Run Code Online (Sandbox Code Playgroud)

在名为“socket”的标准 Tomcat servlet 中,我在类上使用了 @ServerEndpoint 注释来创建 WebSocket 端点。因此,精简版本如下所示:

@ServerEndpoint(value = "/echo")
public class EchoServer {
    @OnOpen
    public void onOpen(Session session) {
        //
    }

    @OnMessage
    public void onMessage(String message, Session session) {
        //
    }

    @OnClose
    public void onClose(Session session) {
        //
    }
}
Run Code Online (Sandbox Code Playgroud)

在我的客户端,我有一个连接 WebSocket 的 html 脚本:

var webSocket = new WebSocket("ws://localhost:8080/socket/echo");
Run Code Online (Sandbox Code Playgroud)

当我连接到http://localhost:8080/socket 时一切正常。我可以打开套接字连接并来回传递消息。

使用https://localhost:8443/socket我可以连接到 servlet,但我无法打开套接字连接,因为这是一个不安全的操作。然后我尝试将连接字符串更改为:

var webSocket = new WebSocket("wss://localhost:8443/socket/echo");
Run Code Online (Sandbox Code Playgroud)

但像这样我无法获得任何联系。

当我查看 Tomcat 文档(https://tomcat.apache.org/tomcat-8.0-doc/web-socket-howto.html)时,我不明白我需要更改什么 - 我看到一些提到 SSL_CONTEXT 和像,但我找不到任何如何使用它的示例(无论如何,我没有 ClientEndpointConfig,因为那是浏览器?)。

有人可以指出我解决方案的方向吗?为什么在 http 端口上工作正常的连接在 https 端口上不起作用?