ssl - 尝试将 websocket 连接到安全的客户端端点会引发错误:XNIO000100: 'https' URL scheme selected but no SSL provider given
问题描述
我正在尝试在 java 中创建一个 websocket,以侦听端点 f.ex 上的本地应用程序。“wss://localhost.localapp.com:8080/”。
应用程序确实通过该 websocket 发送有关正在发生的事情的信息。
当我运行 web 应用程序并尝试连接到安全 websocket 时,它会抛出此错误:
XNIO000100: 'https' URL scheme chosen but no SSL provider given
这是我连接到客户端端点的代码:
@ClientEndpoint
public class ClientEndpoint {
private Logger logger = Logger.getLogger(getClass().getName());
public ClientEndpoint() {
WebSocketContainer container = ContainerProvider.getWebSocketContainer();
try {
container.connectToServer(this, new URI("wss://localhost.localapp.com:8080/"));
} catch (DeploymentException | URISyntaxException | InterruptedException | IOException e) {
System.out.println("Connection error occured!: " + e);
}
}
@OnOpen
public void onOpen(Session session) {
this.logger.info("New websocket session opened: " + session.getId());
}
@OnClose
public void onClose(Session session) {
this.logger.info("Websoket session closed: " + session.getId());
}
@OnMessage
public void onMessage(Session session, String message) throws IOException, EncodeException {
this.logger.info("Message recieved: " + message);
}
@OnError
public void error(Session session, Throwable t) {
t.printStackTrace();
}
}
所以错误发生在这个代码行上:
container.connectToServer(this, new URI("wss://localhost.localapp.com:8080/"));
堆栈跟踪输出如下:
ERROR localhost jboss7.1 [RunnerReadFacade] Application was stopped due to exception. Transaction is rollbacked.: java.lang.IllegalArgumentException: XNIO000100: 'https' URL scheme chosen but no SSL provider given
at org.xnio.http.HttpUpgrade$HttpUpgradeState.doUpgrade(HttpUpgrade.java:253)
at org.xnio.http.HttpUpgrade$HttpUpgradeState.access$100(HttpUpgrade.java:165)
at org.xnio.http.HttpUpgrade.performUpgrade(HttpUpgrade.java:129)
at io.undertow.websockets.client.WebSocketClient$ConnectionBuilder.connectImpl(WebSocketClient.java:323)
at io.undertow.websockets.client.WebSocketClient$ConnectionBuilder.connect(WebSocketClient.java:211)
at io.undertow.websockets.jsr.ServerWebSocketContainer.connectToServerInternal(ServerWebSocketContainer.java:463)
at io.undertow.websockets.jsr.ServerWebSocketContainer.connectToServerInternal(ServerWebSocketContainer.java:457)
at io.undertow.websockets.jsr.ServerWebSocketContainer.connectToServer(ServerWebSocketContainer.java:211)
我应该如何解决这个问题?
使用 JavaScript,我不需要 SSL 提供程序,只需运行以下命令即可创建与 websocket 的连接:
websocket = new WebSocket("wss://localhost.localapp.com:8080/");
为什么错误只发生在 Java 上?
更新:
这可能无法完成,因为应用程序在您的本地计算机上,而服务器不是本地的。
但是,如果您使用本地服务器,可以这样做吗?
解决方案
您可以切换到 Programmatic Client Endpoint 或定义线程本地 SSL 上下文。请参阅https://issues.jboss.org/browse/THORN-2131的详细信息(wsstest-master.zip 包括演示应用程序)。“实施 io.undertow.websockets.jsr.WebsocketClientSslProvider 并添加 META-INF/services 条目”对我不起作用。