115

VPNに接続してインベントリAPIをセットアップし、製品リストを取得しましたが、正常に機能します。Webサービスから結果を取得し、UIにバインドしたら。また、PayPalをアプリケーションと統合して、支払いの電話をかけたときにExpressチェックアウトを行うと、このエラーが発生します。バックエンドプロセスにサーブレットを使用しています。この問題を解決する方法を誰かが言うことができますか?

javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: 
PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException:
unable to find valid certification path to requested target
4

6 に答える 6

166

まず、接続しようとしているサーバーから公開証明書を取得する必要があります。これは、サーバー管理者に連絡して要求する、 OpenSSLを使用してダウンロードする、HTTPサーバーのように見えるため、任意のブラウザーで接続してページのセキュリティ情報を表示するなど、さまざまな方法で実行できます。 、および証明書のコピーを保存します。(Googleは、特定のブラウザに対して何をすべきかを正確に教えてくれるはずです。)

証明書がファイルに保存されたので、それをJVMのトラストストアに追加する必要があります。$JAVA_HOME/jre/lib/security/JREまたは$JAVA_HOME/lib/securityJDKの場合、Javaに付属し、有名な認証局の公開証明書を含むという名前のファイルがありますcacerts。新しい証明書をインポートするには、cacertsへの書き込み権限を持つユーザーとしてkeytoolを実行します。

keytool -import -file <the cert file> -alias <some meaningful name> -keystore <path to cacerts file>

ほとんどの場合、パスワードの入力を求められます。Javaに付属しているデフォルトのパスワードはですchangeit。ほとんど誰もそれを変更しません。これらの比較的簡単な手順を完了すると、安全に通信できるようになり、適切なサーバーと適切なサーバーのみと通信していることが保証されます(秘密鍵を紛失しない限り)。

于 2011-07-19T04:08:44.757 に答える
19

今、私はこの方法でこの問題を解決しました、

import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
import java.io.OutputStream; 

// Create a trust manager that does not validate certificate chains like the default 

TrustManager[] trustAllCerts = new TrustManager[]{
        new X509TrustManager() {

            public java.security.cert.X509Certificate[] getAcceptedIssuers()
            {
                return null;
            }
            public void checkClientTrusted(java.security.cert.X509Certificate[] certs, String authType)
            {
                //No need to implement.
            }
            public void checkServerTrusted(java.security.cert.X509Certificate[] certs, String authType)
            {
                //No need to implement.
            }
        }
};

// Install the all-trusting trust manager
try 
{
    SSLContext sc = SSLContext.getInstance("SSL");
    sc.init(null, trustAllCerts, new java.security.SecureRandom());
    HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
} 
catch (Exception e) 
{
    System.out.println(e);
}

keytoolもちろん、このソリューションは、一時的な証明書を使用したローカル テストなどを使用して必要な証明書をインストールできないシナリオでのみ使用する必要があります。

于 2011-07-19T03:52:30.880 に答える
11

URL に接続しようとするたびに、

他のサイトのサーバーが https プロトコルで実行されており、証明書で提供された情報を介して通信する必要がある場合は、次のオプションがあります。

1) 証明書を要求し (証明書をダウンロード)、この証明書を trustore にインポートします。デフォルトの trustore Java の使用は \Java\jdk1.6.0_29\jre\lib\security\cacerts にあります。URL への接続を再試行すると、接続が受け入れられます。

2) 通常のビジネス ケースでは、組織内の内部 URL に接続している可能性があり、それらが正しいことがわかっています。そのような場合、それが正しい URL であると信頼します。上記のような場合、特定の URL に接続するための証明書を保存する必要のないコードを使用できます。

ポイント2については、以下の手順に従う必要があります。

1) HttpsURLConnection の HostnameVerifier を設定するメソッドを以下に記述します。このメソッドは、すべてのケースで true を返し、trustStore を信頼していることを意味します。

  // trusting all certificate 
 public void doTrustToCertificates() throws Exception {
        Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());
        TrustManager[] trustAllCerts = new TrustManager[]{
                new X509TrustManager() {
                    public X509Certificate[] getAcceptedIssuers() {
                        return null;
                    }

                    public void checkServerTrusted(X509Certificate[] certs, String authType) throws CertificateException {
                        return;
                    }

                    public void checkClientTrusted(X509Certificate[] certs, String authType) throws CertificateException {
                        return;
                    }
                }
        };

        SSLContext sc = SSLContext.getInstance("SSL");
        sc.init(null, trustAllCerts, new SecureRandom());
        HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
        HostnameVerifier hv = new HostnameVerifier() {
            public boolean verify(String urlHostName, SSLSession session) {
                if (!urlHostName.equalsIgnoreCase(session.getPeerHost())) {
                    System.out.println("Warning: URL host '" + urlHostName + "' is different to SSLSession host '" + session.getPeerHost() + "'.");
                }
                return true;
            }
        };
        HttpsURLConnection.setDefaultHostnameVerifier(hv);
    }

2) URL に接続する前に doTrustToCertificates を呼び出すメソッドを以下に記述します。

    // connecting to URL
    public void connectToUrl(){
     doTrustToCertificates();//  
     URL url = new URL("https://www.example.com");
     HttpURLConnection conn = (HttpURLConnection)url.openConnection(); 
     System.out.println("ResponseCode ="+conn.getResponseCode());
   }

この呼び出しは応答コードを返します = 200 は接続が成功したことを意味します。

詳細とサンプルの例については、URLを参照してください。

于 2014-03-20T05:54:55.820 に答える
-1

SSL を使用して何かに接続しようとしていると思いますが、何かが verisign などのルート証明機関によって検証されていない証明書を提供していると思います。取引相手の鍵またはベリサインなどの他のベンダーが介入して、提供されている公開鍵が実際に正しいと言うことができます..

すべてのOSの信頼は、一握りの認証局と小規模な証明書発行者が、認証者のチェーンを形成する大規模な認証者の1つによって認証される必要があることを意味します...

とにかく要点に戻る.. JavaアプレットとJavaサーバーをプログラミングするときに同様の問題がありました(できれば、いつの日か、すべてのセキュリティを機能させる方法について完全なブログ投稿を書きたいと思います:))

本質的に私がしなければならなかったことは、サーバーから公開鍵を抽出し、それをアプレット内のキーストアに保存することでした。サーバーに接続すると、このキーストアを使用して信頼ファクトリーを作成し、その信頼ファクトリーを使用してsslを作成しました繋がり。JVM のトラステッド ホストへのキーの追加や、起動時のデフォルトのトラスト ストアの変更など、別の手順もあります。

私は約2か月前にこれを行いましたが、現在ソースコードを持っていません.. Googleを使用すると、この問題を解決できるはずです. 私にメッセージを返すことができない場合は、プロジェクトの関連するソースコードを提供できます..これらの例外を引き起こすコードを提供していないため、これで問題が解決するかどうかはわかりません. さらに、私はアプレットで作業していましたが、サーバーレットで動作しない理由がわかりません...

PS オフィスで外部 SSH が無効になっているため、週末までにソース コードを取得できません :(

于 2011-07-14T17:53:36.227 に答える
-7

今、私はこの方法でこの問題を解決しました、

import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
import java.io.OutputStream;
// Create a trust manager that does not validate certificate chains like the 
default TrustManager[] trustAllCerts = new TrustManager[] {
    new X509TrustManager() {
        public java.security.cert.X509Certificate[] getAcceptedIssuers() {
            return null;
        }
        public void checkClientTrusted(java.security.cert.X509Certificate[] certs, String authType) {
            //No need to implement. 
        }
        public void checkServerTrusted(java.security.cert.X509Certificate[] certs, String authType) {
            //No need to implement. 
        }
    }
};
// Install the all-trusting trust manager
try {
    SSLContext sc = SSLContext.getInstance("SSL");
    sc.init(null, trustAllCerts, new java.security.SecureRandom());
    HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
} catch (Exception e) {
    System.out.println(e);
}
于 2015-11-30T01:26:28.873 に答える