2015-12-04 145 views
1

我收到了非常流行的「SSLHandShakeException」。Javax.new.ssl.SSLHandShakeException分辨率

我正在運行一個使用IntelliJ的java客戶端,該客戶端用於處理Web服務請求/響應。我們通過一組憑據和一個url連接到服務器,並傳入一個請求文件。

我所做的

  1. 驗證網址正在構建在瀏覽器中的作品。

  2. 添加使用這些 指令的證書信任存儲區,Keytool Instructions

  3. 驗證正確的JRE是正在使用的信任。

  4. 我正在使用一個httpClient對象。我實例化對象如下,

    private void initConnection() 
    { 
        CredentialsProvider credsProvider = new BasicCredentialsProvider(); 
        credsProvider.setCredentials(new AuthScope(this.target.getHostName(), this.target.getPort()), new UsernamePasswordCredentials(this.userid, this.password)); 
    
        this.httpClient = HttpClients.custom().setDefaultCredentialsProvider(credsProvider).build(); 
    
        // Be able to deal with basic auth. Generate BASIC scheme object and 
        // add it to the local auth cache 
    
        BasicScheme basicScheme = new BasicScheme(); // we throw an error here 
        this.authCache.put(this.target, basicScheme); 
        localContext = HttpClientContext.create(); 
        localContext.setAuthCache(this.authCache); 
    } 
    
  5. 的執行用於此目的是如下這也是引發錯誤的代碼,

    responseNode = this.httpClient.execute(getTarget(), httpRequest, responseHandler); 
    
  6. 我已嘗試強制信任存儲過程如下,

    System.setProperty(「javax.net.ssl.trustStore」,「.... Common \ JRE \ lib \ security \ cacerts」); System.setProperty(「javax.net.ssl.trustStorePassword」,「changeit」);

  7. 當SSL沒有涉及時,對http很有效。

其他然後,我沒有使用SSL的專家。我已經進行了相當多的挖掘,我希望有人有一個想法。我當然願意沒有正確安裝證書(十幾次),或者可能需要添加一些代碼來正確配置我的對象。如果缺少信息,我會很樂意提供!

非常感謝。

+2

您可能需要更新到你的''路徑'通過逃避轉義字符cacerts'''。你設置好後是否嘗試過打印''java.net.ssl.trustStore'''的值? –

+1

的字符轉義,在#1能幫助和刪除它們。我不能說我已經打印了價值。讓我一起去。理想情況下,我不想包括第6點。它的工作。 –

+1

請張貼整個消息和堆棧貿易,並修復意義的稱號。 – EJP

回答

1

通過使用自定義的HttpClient它不是從HttpClientBuilder文檔查看默認情況下,系統信任存儲:

當一個特定組成部分未明確設置這個類將使用它的默認實現。在調用build()之前調用useSystemProperties()方法時,將在配置默認實現時考慮系統屬性。

使用try

HttpClients.custom().setDefaultCredentialsProvider(credsProvider).useSystemProperties().build(); 
+0

請勿對不是代碼的文本使用代碼格式。 – EJP

1

已經不得不處理在Java客戶端的一些SSL問題我自己,我知道,在您所遇到的錯誤信息缺乏有用的細節的無奈。以下是一些您可以嘗試和驗證的內容。

  1. 服務器和客戶端可以同意SSL版本。

像許多協議的SSL/TLS協議有幾個版本在那裏。 TLS實現實際上總是向後兼容,但由於早期版本的協議被認爲是不安全的,因此許多服務器和客戶端將不會接受早期版本。

  • 主機名不匹配。
  • TLS協議指定即使服務器的證書可能被信任,證書本身證書的公用名稱也必須與服務器的主機名匹配。例如,如果www.microsoft.com上的服務器提供了www.google.com證書,則客戶端將不會接受該連接。這個問題往往是,當人們連接到內部服務器的一個大問題,但沒有這麼多連接到公共服務器時出現問題。有一個非常簡單的方法來禁用自定義SSL工廠的主機名驗證。