SSLHandshakeException quando cerco di inviare un get o post https richiesta dalla mia webapp in server tomcat

Seguenti eccezione generata quando invia richiesta https dalla mia webapp in server tomcat

javax.net.ssl.SSLHandshakeException: sole.di sicurezza.validatore.ValidatorException: PKIX percorso di costruzione non è riuscito: il sole.di sicurezza.fornitore di servizi.certpath.SunCertPathBuilderException: impossibile trovare il percorso di certificazione valido per la destinazione richiesta

qui è il mio servelet

/*
 * 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];
        }
 }    

Ti prego, aiutami a trovare il problema con SSL Certificato di gestione in questo codice
thnks in anticipo

Hai provato questo Non piu ‘in grado di trovare il percorso di certificazione valido per la destinazione richiesta’ ?
Comunque NO, non ho, vado a provarlo. grazie @Nishant . potrebbe anche qualsiasi prego dimmi di sbagliato con il codice di cui sopra, quando è in esecuzione. È perfettamente in un normale programma java in esecuzione nella JVM, ma non nel server tomcat come una webapp
hmm… che strano. Idealmente, se si collega lo stesso (https), URL, si dovrebbe vedere questa eccezione sia — standalone app e webapp. Ho aggiunto la parte relativa a come una risposta a spiegare “in che modo questo accade”. Ma io sono sicuro perché esso dipenderà il contenitore che esegue questo codice.

OriginaleL’autore Ruwan Dissanayaka | 2012-08-30

5 Replies
  1. 1

    Qui questo potrebbe aiutare: (estratti dal http://code.naishe.in/2011/07/looks-like-article-no-more-unable-to.html )

    Alcuni di voi potrebbero avere familiarità con il (non molto user friendly) messaggio di eccezione

      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

    quando si tenta di aprire una connessione SSL per un host che utilizza JSSE. Che cosa questo di solito significa che il server utilizza un certificato di prova (possibilmente generati utilizzando keytool) piuttosto che di un certificato da un noto commerciali Autorità di Certificazione, ad esempio Verisign o GoDaddy. Web browser di visualizzazione di finestre di dialogo di avviso in questo caso, ma dal momento che JSSE non può assumere un utente interattivo è presente solo genera un’eccezione per impostazione predefinita.

    PS: a lungo per un commento così aggiunto come risposta.

    grazie per la risposta, proverò questo
    questo ha funzionato, grazie @Nishant. questo potrebbe utile per chi affronta lo stesso problema. configurazione di tomcat per SSL. thats it.

    OriginaleL’autore Nishant

  2. 1

    Vostro deposito sicuro non si fida del certificato del server. Avete bisogno di esportare dal server e installazione presso il cliente. Il link che gli altri hanno postato mostra un modo per farlo. Il vero problema è probabilmente che il server utilizza un certificato autofirmato invece di una CA-certificato firmato, che a causa di questo problema per ogni cliente. È la soluzione migliore per spendere i soldi e correzione.

    grazie per la risposta @EJP

    OriginaleL’autore user207421

  3. 0

    Problema : Normale Programma Java ha funzionato correttamente
    Ma webapp in tomcat server non ha funzionato correttamente anche se ho usato lo stesso metodo/codice

    Soluzione:
    Così ho configurato il tomcat per il Certificato SSL.
    Se uno ha lo stesso problema.
    Basta configurare tomcat per il Certificato SSL.

    Questo sarà utile per configurare tomcat per il Certificato SSL

    Grazie per tutte le risposte e i commenti. 🙂

    Il deposito sicuro si configura al livello del connettore non ha nulla a che fare con il deposito sicuro utilizzato dal vostro webapps quando sono in esecuzione (a meno che tu non configurare nulla e utilizzando il valore predefinito).

    OriginaleL’autore Ruwan Dissanayaka

  4. 0

    Ho avuto lo stesso problema con un firmato valido certificato con caratteri jolly da symantec.

    Prima di provare a eseguire le applicazioni java con -Djavax.net.debug=SSL per vedere cosa sta realmente succedendo.

    Ho finito importare il certificato intermedio che è stato la causa del cert catena da spezzare.

    Ho scaricato il mancante intermedio cert da symantec (si può vedere il link per scaricare mancanti cert per l’handshake ssl registro: http://svrintl-g3-aia.verisign.com/SVRIntlG3.cer nel mio caso).

    E ho importato il certificato in java keystore. Dopo aver importato il certificato intermedio mio wildcard ssl cert finalmente iniziato a lavorare:

    keytool -import -keystore ../jre/lib/security/cacerts -trustcacerts -alias "VeriSign Class 3 International Server CA - G3" -file /pathto/SVRIntlG3.cer

    OriginaleL’autore Stephan Oudmaijer

  5. -2

    è necessario restituire null per bypassare la convalida del Certificato

        @Override
            public X509Certificate[] getAcceptedIssuers() {
            return null;
        }
    grazie per la risposta, sempre lo stesso eccezione generata:( javax.net.ssl.SSLHandshakeException: sole.di sicurezza.validatore.ValidatorException: PKIX percorso di costruzione non è riuscito: il sole.di sicurezza.fornitore di servizi.certpath.SunCertPathBuilderException: impossibile trovare il percorso di certificazione valido per la destinazione richiesta
    1. Non è corretto dire che il ritorno null da questo metodo ‘ignorare la convalida del certificato’. 2. Non è corretto ritorno null a tutti da questo metodo: vedere la Javadoc; si tratta di una violazione del contratto. 3. Non è corretto scrivere un TrustManager che si fida di nulla, in quanto viola l’intero scopo del certificato di exchange e rende SSL vulnerabili a man-in-the-middle. -1.

    OriginaleL’autore Ted Shaw

Lascia un commento