我有同样的问题。我还没有找到任何解决方案,但我能够使用自签名证书。
我描述了所有步骤:
- 下载你要连接的服务器证书,你可以从你的浏览器中下载(在谷歌浏览器中点击页面url附近的锁)
- 使用以下命令创建密钥库(记住您输入的密码)
keytool -import -alias localhost -file certificate_path -keystore your_new_keystore
我建议您使用 ClientManager 而不是 WebSocketContainer。这允许您覆盖主机名验证。
我的代码
System.getProperties().put("javax.net.debug", "all"); //usefull to understand problems
System.getProperties().put(SSLContextConfigurator.KEY_STORE_FILE, your_new_keystore_path);
System.getProperties().put(SSLContextConfigurator.TRUST_STORE_FILE, your_new_keystore_path);
System.getProperties().put(SSLContextConfigurator.KEY_STORE_PASSWORD, the_password_you_entered);
System.getProperties().put(SSLContextConfigurator.TRUST_STORE_PASSWORD, the_password_you_enterede);
ClientManager client = ClientManager.createClient();
SslEngineConfigurator sslEngineConfigurator = new SslEngineConfigurator(new SslContextConfigurator());
sslEngineConfigurator.setHostVerificationEnabled(false); //skip host verification
client.getProperties().put(ClientProperties.SSL_ENGINE_CONFIGURATOR, sslEngineConfigurator);
client.connectToServer(you_class_with_ws_methods, your_ws_uri);
you_class_with_ws_methods可以和你使用的 WebSocketContainer 一样有用的资源:
https://tyrus.java.net/documentation/1.10/user-guide.html#d0e1128 https://blogs.oracle.com/PavelBucek/entry/securing_websocket_applications_on_glassfish