如何以编程方式为 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 连接有多少个线程?
Tyrus websocket:IllegalStateException 无法为非异步请求设置 WriteListener
如何使用 Tyrus java 客户端在初始 WebSocket 客户端请求中包含 cookie?