2016-12-05 49 views
0

首先,我知道這是之前被問過的,但我嘗試了所提出的解決方案並沒有得到任何結果。Ssl握手失敗,無法找到要求的目標的有效證書路徑

我想在java中開發一個簡單的程序,它連接到一個網站,並從這裏託管的文本文件讀取。起初我認爲證書會導致問題,因爲我不能在沒有收到警告的情況下在Firefox上打開網站。 Internet Explorer不會產生任何問題。代碼如下:

import java.io.BufferedReader; 
import java.io.FileInputStream; 
import java.io.FileNotFoundException; 
import java.io.IOException; 
import java.io.InputStreamReader; 
import java.io.UnsupportedEncodingException; 
import java.net.*; 

public class insig 
{ 
    public static void main(String[] args) throws IOException 
    { 
     URL fpath   = new URL("website/test.txt"); 
     BufferedReader br = new BufferedReader(new InputStreamReader(fpath.openStream())); 

     String Reader = null; 

     while((Reader = br.readLine()) != null) 
     { 
      System.out.println(Reader); 
     } 
    } 
} 

我想的第一件事就是解決方案呈現在Java: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target,沒有sucess。試圖調試,雖然我不明白這一點,但在這個http://docs.oracle.com/javase/1.5.0/docs/guide/security/jsse/ReadDebug.html的幫助下,我明白了,相應地,直到尋找可信證書的部分。已經檢查過,如果我將證書添加到jre的正確版本並仍然存在相同問題。

問題是否可以通過網站所有者解決?只是因爲這不會只在我的電腦上運行,所以在運行的每臺電腦上再次配置一切都不方便。

回答

0

同樣,有三種方法:在JRE店

  1. 附加證書鏈(與keytool命令是)。

  2. 創建自己的商店(再次使用keytool)將其與您的程序一起發貨並將其設置爲-D屬性。

  3. 創建您自己的驗證。

如鏈接我給你看我的意見:

// Create a trust manager that does not validate certificate chains 
    TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() { 
     public java.security.cert.X509Certificate[] getAcceptedIssuers() { 
      return null; 
     } 
     public void checkClientTrusted(X509Certificate[] certs, String authType) { 
     //Vadim: here is the place to check client certs and throw an exception if certs are wrong. When there is nothing all certs accepted. 
     } 
     public void checkServerTrusted(X509Certificate[] certs, String authType) { 
     //Vadim: here is the place to check server certs and throw an exception if certs are wrong. When there is nothing all certs accepted. 
     } 
    } }; 
    // Install the all-trusting trust manager 
    final SSLContext sc = SSLContext.getInstance("SSL"); 
    sc.init(null, trustAllCerts, new java.security.SecureRandom()); 
    HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory()); 
    // Create all-trusting host name verifier 
    HostnameVerifier allHostsValid = new HostnameVerifier() { 
     public boolean verify(String hostname, SSLSession session) { 
      // Here is the palce to check host name against to certificate owner 
      return true; 
     } 
    }; 

    // Install the all-trusting host verifier 
    HttpsURLConnection.setDefaultHostnameVerifier(allHostsValid); 

    URL url = new URL("https://www.google.com"); 

如果你會用它作爲是不會有任何證書驗證 - 所有的證書,並接受所有主機。

1

問題可以通過網站所有者解決嗎?只是因爲這不會只在我的電腦上運行,所以在運行的每臺電腦上再次配置一切都不方便。

沒有關於網站所有者,您必須在每臺PC上配置Java證書存儲。 當然,它不應該是必要的JRE信任商店。它可以是與您的應用程序一起打包的另一個。 在頂部也可以通過Java來配置-Djavax.net.ssl.trustStore(用於keyStore)參數 請看這裏:java-ssl-and-cert-keystore

BTW:還有其他選項,設置信託/密鑰存儲在運行時爲您的特定網址,以及。

新增: 請仔細閱讀了這一切 java-and-https-url-connection-without-downloading-certificate

,並決定什麼是對你有好處。

+0

在我的代碼開始時,可​​以在運行文件的PC中配置它嗎? –

+0

是的,這是可能的,但它提供所需的信任存儲與您的程序,並將其設置在java命令行更容易。無論如何要運行你的程序,你必須有java命令來執行。所以信任存儲將只是啓動腳本中的兩個參數。只有一個擔心:信任商店的密碼將在該行中爲開放文本。但是,如果您只需從一個網站獲得一個公共證書,則不是這種情況。 – Vadim

+0

我剛剛添加了另一個鏈接供您閱讀。 – Vadim

相關問題