[英]SSL Websocket using StompClient — SSL Certificate exception
我有简单的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进行了验证
可以请一些建议。 非常感谢您的帮助。
抱歉,如果这个问题已经回答,我已经搜索了一段时间,但没有结果。 因此发布。
谢谢,
证书中的使用者备用名称是否与服务器主机名匹配?
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:找不到与ssl.someUrl.de匹配的名称
更新:
如果您试图实现相互身份验证,则意味着服务器和客户端都应具有自己的证书。 基于代码_stompClient.connect(url,handler); 在我看来,由StompClient调用的Websocket服务器在这里充当服务器,而您的调用代码是客户端。 基于此了解,您必须正确配置证书。 我认为您需要为该问题提供更多详细信息,以阐明如何进行设置。 SSL是一个复杂的主题,即使配置中的轻微错误也可能会导致错误。(从WS工作但没有WSS的事实可以看出)
更新:
根据您更新的注释,这意味着客户端证书不在图中,因此没有相互身份验证,而是客户端仅使用服务器证书,并且它将检查是否信任服务器证书,这意味着对服务器进行签名的CA证书应存在于客户的信任库中。 如果您的服务器可以作为Web服务器访问,则可以尝试通过浏览器将其打开,并检查是否使用https访问任何资源/ UI时是否显示有效的证书。 这至少应有助于确定证书是否正确配置。
问题已解决.....请检查评论
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.