如何以编程方式为 Tyrus WebSocket @ServerEndpoint 启用 WSS

Posted

技术标签:

【中文标题】如何以编程方式为 Tyrus WebSocket @ServerEndpoint 启用 WSS【英文标题】:How can I programmatically enable WSS for a Tyrus WebSocket @ServerEndpoint 【发布时间】:2018-12-19 10:46:42 【问题描述】:

我有一个具有 REST 端点和 WebSocket 端点的微服务。

它使用 Spring-wires Grizzly 和 Tyrus,并使用 JAX-RS 过滤器和 ServerEndpointConfig.Configurator 通过 SSO 添加身份验证。我已使用 SSLContextConfigurator 和 SSLEngineConfigurator 以及(当前)自签名证书将 SSL 添加到 REST 端点。

我没有看到在 Tyrus 1.14 中对 org.glassfish.tyrus.server.Server 执行相同操作的方法。

事实上,代码硬连线了协议名称,这让我怀疑这是否可能:

LOGGER.info("WebSocket Registered apps: URLs all start with ws://" + this.hostName + ":" + this.getPort());

有一个类似的问题here,但它需要将 WAR 文件部署到完整的 Glassfish 实例。我想以编程方式执行此操作。

【问题讨论】:

【参考方案1】:

使用https://***.com/a/27239122/17641 的建议解决了

listener = new NetworkListener("grizzly", "0.0.0.0", port); listener.setSecure(true); listener.setSSLEngineConfig(new SSLEngineConfigurator(getSslContextConfigurator()).setClientMode(false).setNeedClientAuth(false));

其中getSslContextConfigurator 使用密钥库字节[] 和密码构造org.glassfish.grizzly.ssl.SSLContextConfigurator

【讨论】:

如何将它与org.glassfish.tyrus.server.Server 一起使用?我正在尝试将我的 websocket 服务器端点从 ws:// 更改为 wss://,但我不确定如何将您的解决方案与我的 Server 实例一起使用。 目前也在与此作斗争。非常感谢您提供一些详细说明和上下文如何设置它!【参考方案2】:

我设法使用上述的变体来完成这项工作。但是,我强烈建议不要这样做,因为性能很糟糕。这与 Tyrus 或 Grizzly 无关,而与 Java 无关。 Java 中的 SSL 库非常慢,而且由于 Grizzly 使用 Java,任何 WSS 都会受到影响。

显然 Jetty 和 Tomcat 提供了一种使用 OpenSSL 而不是标准 Java SSL 的方法。或者,使用处理 SSL 并将标准 WS 连接传递到您的服务器的 SSL 终结器(例如 Apache Web 服务器或 HAProxy)

【讨论】:

以上是关于如何以编程方式为 Tyrus WebSocket @ServerEndpoint 启用 WSS的主要内容,如果未能解决你的问题,请参考以下文章

Tyrus 使用的每个 websocket 连接有多少个线程?

如何使Websocket同步

Tyrus websocket:IllegalStateException 无法为非异步请求设置 WriteListener

如何使用 Tyrus java 客户端在初始 WebSocket 客户端请求中包含 cookie?

tyrus websocket connectToServer - 如何清理守护线程

tyrus websocket ssl 握手失败