使用StompClient的SSL Websocket-SSL证书例外

时间:2018-10-18 11:03:25

标签: java websocket ssl-certificate stomp

我有简单的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

进行了验证

可以请一些建议。非常感谢您的帮助。

很抱歉,如果这个问题已经回答,我搜索了一段时间却没有结果。因此发布。

谢谢

2 个答案:

答案 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)

问题已解决.....请检查评论