SSLHandshakeException wenn ich versuche zu senden, einen get-oder post-https-Anforderung von meiner webapp in tomcat-server
Folgende Ausnahme wird ausgelöst, wenn senden von https-Anfrage von meiner webapp in tomcat-server
javax.net.ssl.SSLHandshakeException: Sonne.Sicherheit.validator.ValidatorException: PKIX path building failed: sun.Sicherheit.Anbieter.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
hier ist mein 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];
}
}
Bitte helfen Sie mir zu finden, das problem mit SSL-Zertifikat-handling in diesem code
thnks im Voraus
- Haben Sie versucht, diese Nicht mehr "unable to find valid certification path to requested target' ?
- NEIN, ich wollte nicht, ich werde es ausprobieren. danke @Nishant . auch könnte einer bitte sagen Sie mir die falsche mit dem oben genannten code, wenn Sie ausgeführt wird. Es ist perfekt in einem normalen java-Programm ausführen in der JVM, aber nicht im tomcat-server als webapp
- hmm... das ist komisch. Ideal ist es, wenn Sie eine Verbindung mit dem gleichen (https) URL, sollte man diese Ausnahme in beiden-standalone-app und webapp. Ich habe den relevanten Teil als Antwort zu erklären, so 'wie dies'. Aber ich bin nicht sicher, warum es wird davon abhängen, container, dass dieser code ausgeführt.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Hier das könnte helfen: (Auszüge aus http://code.naishe.in/2011/07/looks-like-article-no-more-unable-to.html )
PS: zu lang für einen Kommentar, so als Antwort.
Ihre truststore nicht vertraut, das Zertifikat des Servers. Sie müssen, exportieren Sie es aus dem server, und installieren Sie es auf dem client. Den anderen link gepostet hast, zeigt einen Weg, das zu tun. Das eigentliche problem ist wohl, dass der server verwendet ein selbst signiertes Zertifikat, statt ein von einer ZERTIFIZIERUNGSSTELLE signiertes Zertifikat, das nur bewirkt, dass dieses problem für jeden Kunden. Beste Lösung ist, das Geld auszugeben und zu beheben.
Problem : Normalen Java-Programm funktionierte einwandfrei
Aber webapp in tomcat server nicht ordnungsgemäß funktioniert, obwohl ich die gleiche Methode/code
Lösung:
So konfigurierte ich die tomcat für SSL-Zertifikat.
Wenn einer mit dem gleichen problem.
Nur konfigurieren Sie die tomcat für SSL-Zertifikat.
Dies wird hilfreich sein, um die Konfiguration von tomcat für SSL-Zertifikat
Danke für alle Antworten und Kommentare. 🙂
Ich hatte das gleiche Problem mit ein gültig signiertes wildcard-Zertifikat von symantec.
Ersten versuchen mit dem java-Anwendung mit -Djavax.net.debug=SSL, um zu sehen, was wirklich Los ist.
Landete ich importieren Sie das Zwischenzertifikat die verursacht wurde der cert-Kette zu brechen.
Ich habe die fehlenden intermediate-Zertifikat von symantec (sehen Sie den download-link, um die fehlenden cert in den ssl-handshake-Protokoll: http://svrintl-g3-aia.verisign.com/SVRIntlG3.cer in meinem Fall).
Und ich importiert das Zertifikat in den java keystore. Nach dem Import der intermediate-Zertifikat für meine wildcard-ssl-cert endlich angefangen zu arbeiten:
müssen Sie null zurück zur Umgehung der Zertifikatsprüfung
null
an alle, die von dieser Methode: finden Sie in der Javadoc; es ist ein Verstoß gegen den Vertrag. 3. Es ist nicht richtig zu schreibenTrustManager
vertraut, dass alles, wie es gegen die gesamte Zweck des Zertifikats Austausch und macht SSL anfällig für man-in-the-middle-Angriffe. -1.