0

TomcatサーバーのWebアプリからhttpsリクエストを送信すると、次の例外がスローされます

javax.net.ssl.SSLHandshakeException:sun.security.validator.ValidatorException:PKIXパスの構築に失敗しました:sun.security.provider.certpath.SunCertPathBuilderException:要求されたターゲットへの有効な認証パスが見つかりません

これが私のサーブレットです

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package LBS;


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.HttpURLConnection;
import java.net.Proxy;
import java.net.SocketAddress;
import java.net.URL;
import java.net.URLConnection;
import javax.net.ssl.HttpsURLConnection;
//import javax.net.ssl.SSLContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.security.cert.X509Certificate;
import javax.net.*;
import javax.net.ssl.*;
import java.security.cert.*;


/**
 *
 * @author Ruwan
 */
public class LBS2 extends HttpServlet {

/** 
 * Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods.
 * @param request servlet request
 * @param response servlet response
 * @throws ServletException if a servlet-specific error occurs
 * @throws IOException if an I/O error occurs
 */
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    response.setContentType("text/html;charset=UTF-8");
    PrintWriter out = response.getWriter();
    try {
        LBS2 s=new LBS2();
        s.myReq();

    } finally {            
        out.close();
    }
}



public void myReq(){
  System.setProperty("https.proxyHost", "10.48.242.90");
  System.setProperty("https.proxyPort", "3128");
        String uri = "https://somthing.com/abc?username=USERNAME&password=PASWORD";

    try{
        SSLContext sslctx = SSLContext.getInstance("SSL");
        sslctx.init(null, new X509TrustManager[] { new MyTrustManager()}, null);
        HttpsURLConnection.setDefaultSSLSocketFactory(sslctx.getSocketFactory());
        URL url = new URL(uri);
        HttpURLConnection con = (HttpURLConnection) url.openConnection();
        con.setRequestMethod("GET");
        con.setDoOutput(true);
        con.connect();
        if (con.getResponseCode() == HttpsURLConnection.HTTP_OK) {
            BufferedReader br = new BufferedReader(new
            InputStreamReader(con.getInputStream()));
            String line;
            while((line = br.readLine()) != null) {
            System.out.println(line);
            }
            br.close();
        }
        con.disconnect();

        }
        catch(Exception e){
        System.out.println(e.toString());
        }
}


    // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the +     sign on the left to edit the code.">
    /** 
 * Handles the HTTP <code>GET</code> method.
 * @param request servlet request
 * @param response servlet response
 * @throws ServletException if a servlet-specific error occurs
 * @throws IOException if an I/O error occurs
 */
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    processRequest(request, response);
}

/** 
 * Handles the HTTP <code>POST</code> method.
 * @param request servlet request
 * @param response servlet response
 * @throws ServletException if a servlet-specific error occurs
 * @throws IOException if an I/O error occurs
 */
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    processRequest(request, response);
}

/** 
 * Returns a short description of the servlet.
 * @return a String containing servlet description
 */
@Override
public String getServletInfo() {
    return "Short description";
}// </editor-fold>
}


class MyTrustManager implements X509TrustManager {
        @Override
            public void checkClientTrusted(X509Certificate[] chain, String
            authType) {
            }

        @Override
            public void checkServerTrusted(X509Certificate[] chain, String
            authType) {
            }

        @Override
            public X509Certificate[] getAcceptedIssuers() {
            return new X509Certificate[0];
        }
 }    

事前にこのコードthnksでSSL証明書の処理に関する問題を見つけるのを手伝ってください

4

5 に答える 5

1

ここでこれが役立つかもしれません:( http://code.naishe.in/2011/07/looks-like-article-no-more-unable-to.htmlからの抜粋)

(あまりユーザーフレンドリーではない)例外メッセージに精通している方もいらっしゃるかもしれません。

  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

JSSEを使用してホストへのSSL接続を開こうとしたとき。これが通常意味するのは、サーバーが、VerisignやGoDaddyなどの有名な商用認証局からの証明書ではなく、テスト証明書(おそらくkeytoolを使用して生成されたもの)を使用しているということです。この場合、Webブラウザーは警告ダイアログを表示しますが、JSSEは対話型ユーザーが存在すると想定できないため、デフォルトで例外をスローするだけです。

PS:コメントを待ち望んでいたので、回答として追加しました。

于 2012-08-30T05:30:16.623 に答える
1

トラストストアはサーバーの証明書を信頼していません。サーバーからエクスポートして、クライアントにインストールする必要があります。他の人が投稿したリンクは、それを行う方法を示しています。本当の問題は、サーバーがCA署名証明書ではなく自己署名証明書を使用していることです。これにより、すべてのクライアントでこの問題が発生します。最善の解決策は、お金を使ってそれを修正することです。

于 2012-08-30T10:15:54.407 に答える
0

問題:通常のJavaプログラムは正しく機能しましたが、同じメソッド/コードを使用したにもかかわらず、TomcatサーバーのWebアプリケーションが正しく機能しませんでした

解決策: SSL証明書用にTomcatを構成しました。同じ問題を抱えている人がいれば。SSL証明書用にTomcatを設定するだけです。

これは、SSL証明書用にTomcatを構成するのに役立ちます

すべての回答とコメントをありがとうございます。:)

于 2012-08-30T18:29:42.467 に答える
0

symantecからの有効な署名付きワイルドカード証明書でも同じ問題が発生しました。

まず、 -Djavax.net.debug = SSLを使用してJavaアプリケーションを実行し、実際に何が起こっているかを確認してください。

結局、証明書チェーンを壊していた中間証明書をインポートすることになりました。

不足している中間証明書をsymantecからダウンロードしました(不足している証明書へのダウンロードリンクは、sslハンドシェイクログで確認できます:私の場合はhttp://svrintl-g3-aia.verisign.com/SVRIntlG3.cer)。

そして、javaキーストアに証明書をインポートしました。中間証明書をインポートした後、ワイルドカードssl証明書がついに機能し始めました。

keytool -import -keystore ../jre/lib/security/cacerts -trustcacerts -alias "VeriSign Class 3 International Server CA - G3" -file /pathto/SVRIntlG3.cer
于 2014-03-14T13:45:09.387 に答える
-2

証明書の検証をバイパスするにはnullを返す必要があります

    @Override
        public X509Certificate[] getAcceptedIssuers() {
        return null;
    }
于 2012-08-30T05:27:25.863 に答える