2016-12-05 4 views
0

まず、これは以前に尋ねられたことですが、提案されたソリューションを試してみました。Sslハンドシェイクが失敗し、要求されたターゲットへの有効な証明書パスが見つかりません

私は、Webサイトに接続し、そこでホストされているテキストファイルから読み込む、単純なプログラムを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に発表されました:コードは以下の通りです。デバッグしようとしましたが、私はこれを本当にうまく理解しませんが、http://docs.oracle.com/javase/1.5.0/docs/guide/security/jsse/ReadDebug.htmlの助けを借りて、信頼できる証明書を見つけるまでに何かが行われることを理解できました。 jreの正しいバージョンに証明書を追加したのかどうかは既に確認されていますが、それでも同じ問題があります。

ウェブサイトの所有者は問題を解決できますか?これは私のPCだけでは実行されないからです。そのため、実行中のすべてのPCですべてを再度設定するのは便利ではありません。

答えて

0

は再び、3つの方法があります。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だけでは実行されないからです。そのため、実行中のすべてのPCですべてを再度設定するのは便利ではありません。

ウェブサイトの所有者については何もなく、すべてのPCでJavaの証明書ストアを設定する必要があります。 もちろん、JREの信頼ストアは必要ありません。アプリケーションとともにパッケージ化された別のパッケージにすることもできます。それは、Javaを使用して設定することができます上に は-Djavax.net.ssl.trustStore(キーストアが)こちらをご覧下さい パラメータ:java-ssl-and-cert-keystore

ところで:あなたの特定のURLのためのランタイムで信託を設定するための他のオプション/キーストアがあり、同じように。

を追加しました: その java-and-https-url-connection-without-downloading-certificate

のすべてを読んで、あなたのために良いものを判断してください。

+0

私のコードの始めに、ファイルが実行されているPCでこれを設定できますか? –

+0

はい、可能ですが、プログラムに必要なトラストストアを提供してjavaコマンドラインに設定するほうがずっと簡単です。とにかくあなたのプログラムを実行するには、javaコマンドを実行する必要があります。したがって、トラストストアは開始スクリプトの2つのパラメータにすぎません。懸念事項は1つだけです。パスワードを保存するためのパスワードは、その行に空白文字で表示されます。しかし、1つのWebサイトから公開証明書が1つだけ必要な場合は、そうではありません。 – Vadim

+0

あなたが読むための別のリンクを追加しました。 – Vadim

関連する問題