我有简单的Java StompClient连接到Java websocket事件。服务器配置为ws时,它可以工作。将服务器配置为wss时无法连接。代码摘录如下...
KeyStore truststore = KeyStore.getInstance("JKS");
truststore.load(this.getClass().getResourceAsStream("/truststore.jks"), "<hidden_pwd_for_thispost>".toCharArray());
KeyStore keystore = KeyStore.getInstance("JKS");;
keystore.load(this.getClass().getResourceAsStream("/keystore.jks"), "<hidden_pwd_for_thispost>".toCharArray());
SSLContext sslContext = new
SSLContextBuilder().loadTrustMaterial(truststore, acceptingTrustStrategy);
.loadKeyMaterial(keystore, "<hidden_pwd_forthisPost>".toCharArray()).build();
TrustStrategy acceptingTrustStrategy = (X509Certificate[] chain, String authType) -> true;
StandardWebSocketClient client = new StandardWebSocketClient();
client.getUserProperties().clear();
client.getUserProperties().put("org.apache.tomcat.websocket.SSL_CONTEXT", sslContext);
WebSocketStompClient stompClient = new WebSocketStompClient(client);
ListenableFuture<StompSession> sessionFuture = stompClient.connect(url, handler);
session = sessionFuture.get();
例外
Caused by: java.security.cert.CertificateException: No name matching <myhost> found
at sun.security.util.HostnameChecker.matchDNS(Unknown Source)
at sun.security.util.HostnameChecker.match(Unknown Source)
at sun.security.ssl.X509TrustManagerImpl.checkIdentity(Unknown Source)
at sun.security.ssl.AbstractTrustManagerWrapper.checkAdditionalTrust(Unknown Source)
at sun.security.ssl.AbstractTrustManagerWrapper.checkServerTrusted(Unknown Source)
请注意,我在本地构建了keyStore和selfSigned trustStore。 keyStore和trustStore都将CN作为我的主机名。 上面通过运行keytool -list
进行了验证可以请一些建议。非常感谢您的帮助。
很抱歉,如果这个问题已经回答,我搜索了一段时间却没有结果。因此发布。
谢谢
答案 0 :(得分:0)
您证书中的使用者替代名称是否与服务器主机名匹配?
X509v3 extensions:
X509v3 Subject Alternative Name:
DNS:<**HOST name which matches the server host name**>
您可以通过以下步骤进行检查:
• openssl s_client -connect <serverhostname>:<port on which you connect>
• Copy the string from -----BEGIN CERTIFICATE----- till -----END CERTIFICATE-----
• Paste the string into a .pem file, for example:- “test.pem”
• Run command: openssl x509 -in test.pem -noout -text
如果SAN没有主机名,则会出现DN:参考此:- CertificateException: No name matching ssl.someUrl.de found
更新:
如果您试图实现相互认证,则意味着服务器和客户端都应具有自己的证书。基于代码_stompClient.connect(url,handler);在我看来,由StompClient调用的Websocket服务器在这里充当服务器,而您的调用代码是客户端。基于此了解,您必须正确配置证书。我认为您需要为该问题提供更多详细信息,以阐明如何进行设置。 SSL是一个复杂的话题,即使配置中的一个小错误也可能导致错误。(从WS在工作,而WSS在不工作的事实中可以看出来
更新:
根据更新后的注释,这意味着客户端证书不在图中,因此不会进行相互身份验证,而客户端只会使用服务器证书,并且它将检查它是否信任服务器证书,这意味着CA标志服务器证书应存在于客户端的信任库中。如果您的服务器可以作为Web服务器访问,则可以尝试通过浏览器将其打开,并检查是否使用https访问任何资源/ UI时是否显示有效的证书。至少应该有助于确定证书是否正确配置。
答案 1 :(得分:0)
问题已解决.....请检查评论