簡體   English   中英

使用StompClient的SSL Websocket — SSL證書異常

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM