首页 > 解决方案 > 尝试将 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 上?

更新:

这可能无法完成,因为应用程序在您的本地计算机上,而服务器不是本地的。

但是,如果您使用本地服务器,可以这样做吗?

标签: sslhttpsconnectionendpointjava-websocket

解决方案


您可以切换到 Programmatic Client Endpoint 或定义线程本地 SSL 上下文。请参阅https://issues.jboss.org/browse/THORN-2131的详细信息(wsstest-master.zip 包括演示应用程序)。“实施 io.undertow.websockets.jsr.WebsocketClientSslProvider 并添加 META-INF/services 条目”对我不起作用。


推荐阅读