【发布时间】:2015-11-17 14:40:03
【问题描述】:
我用我的 websocket 客户端连接到非 SSL 端点没有任何问题。但我找不到任何方法连接到 wss (SSL) 端点。我在哪里可以定义 SSL 工厂等。似乎没有对象有相关的 set 方法。
WebSocketClient transport = new StandardWebSocketClient();
WebSocketStompClient stompClient = new WebSocketStompClient(transport);
stompClient.setMessageConverter(new MappingJackson2MessageConverter());
String url = cfg.getWebsocketEndpoint();
StompSessionHandler handler = new MySessionHandler();
WebSocketHttpHeaders headers = new WebSocketHttpHeaders();
stompClient.connect(url, handler);
我使用的是 wss:// url,而另一方面我有一个带有自签名证书的服务器。但是,这段代码在连接时并没有抛出任何异常,只是没有建立会话。
编辑:启用网络跟踪后。* 我遇到了一个标准错误,其中
sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
在使用自签名证书连接到服务器时发生。但是,对于 RestTemplate,我已经使用此代码更新了 SSLContext,REST 调用现在很好,但我不知道为什么,StandardWebSocketClient 忽略了 SSLContext。为什么?
String keystoreType = "JKS";
InputStream keystoreLocation = new FileInputStream("src/main/resources/aaa.jks");
char [] keystorePassword = "zzz".toCharArray();
char [] keyPassword = "zzz".toCharArray();
KeyStore keystore = KeyStore.getInstance(keystoreType);
keystore.load(keystoreLocation, keystorePassword);
KeyManagerFactory kmfactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
kmfactory.init(keystore, keyPassword);
InputStream truststoreLocation = new FileInputStream("src/main/resources/aaa.jks");
char [] truststorePassword = "zzz".toCharArray();
String truststoreType = "JKS";
KeyStore truststore = KeyStore.getInstance(truststoreType);
truststore.load(truststoreLocation, truststorePassword);
TrustManagerFactory tmfactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
tmfactory.init(truststore);
KeyManager[] keymanagers = kmfactory.getKeyManagers();
TrustManager[] trustmanagers = tmfactory.getTrustManagers();
SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(keymanagers, trustmanagers, new SecureRandom());
SSLContext.setDefault(sslContext);
更新:不幸的是,我没有设法通过自定义信任库做到这一点。我使用 InstallCert.java 安装了证书。
【问题讨论】:
标签: spring websocket spring-boot spring-websocket