带有客户证书的Websocket

时间:2018-08-09 07:36:50

标签: java websocket

我有一个使用javax.websocket库的Java websocket客户端,该库当前如下所示:

WebSocketContainer container = ContainerProvider.getWebSocketContainer();
container.setDefaultMaxTextMessageBufferSize(BUFFER_SIZE);
container.connectToServer(this, ENDPOINT_URI);

现在我有一个要求,即客户端需要向服务器提供客户端证书。如何做到这一点?

2 个答案:

答案 0 :(得分:0)

我不确定您要使用的证书是什么,但可能是SSL/TLS证书。在这种情况下,您只需要使用 wss 客户端(例如nv-websocket-client),它将处理所有的ssl / tls。

另请参阅答案:minimal java8 nio secure websocket client (wss)

答案 1 :(得分:0)

我找到了解决方案,所以我回答了自己的问题:

可以使用ClientEndpointConfig配置WebsocketContainer。这允许设置自定义SSLContext。然后,客户端证书必须附加到SSLContext。代码:

WebSocketContainer container = ContainerProvider.getWebSocketContainer();
container.setDefaultMaxTextMessageBufferSize(BUFFER_SIZE);
container.connectToServer(new PojoEndpointClient(this, new ArrayList<>()), createClientConfig(), endpointURI);

ClientEndpointConfig可以这样构造:

private ClientEndpointConfig createClientConfig() throws KeyManagementException, UnrecoverableKeyException,
 NoSuchAlgorithmException, KeyStoreException, CertificateException, IOException {
    ClientEndpointConfig.Builder builder = ClientEndpointConfig.Builder.create();
    ClientEndpointConfig config = builder.decoders(new ArrayList<>()).encoders(new ArrayList<>())
            .preferredSubprotocols(new ArrayList<>()).build();
    SSLContext sslContext = SSLContexts.custom().loadKeyMaterial(clientCert.toFile(), clientCertPassword,
            clientCertPassword, (aliases, socket) -> aliases.keySet().iterator().next()).build();
    config.getUserProperties().put(Constants.SSL_CONTEXT_PROPERTY, sslContext);
    return config;
}

这将在建立Websocket连接时向服务器出示客户端证书。