2015-10-28 4 views
15

ich die folgende Ausnahme bin immer:Ignorieren SSL-Zertifikat in einem Servlet

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 

ich tat etwas Forschung und änderte meine Verbindungscode dieses:

SSLContext sslContext = new SSLContextBuilder().loadTrustMaterial(null, new TrustStrategy() { 
      public boolean isTrusted(X509Certificate[] arg0, String arg1) throws CertificateException { 
       return true; 
      } 
     }).build(); 

CloseableHttpClient client = HttpClients.custom() 
      .setRedirectStrategy(new LaxRedirectStrategy()) 
      .setSslcontext(sslContext) 
      .setConnectionManager(connMgr) 
      .build(); 

Dieses Problem bisher fixiert, ich bin nicht mehr die Ausnahme und die Verbindung funktioniert.

Das Problem tritt wieder auf, wenn ich denselben Code in einem Servlet verwende, das in Tomcat läuft.

Warum?

Antwort

4

Versuchen Sie den folgenden Code.

import java.security.cert.CertificateException; 
import java.security.cert.X509Certificate; 

import javax.net.ssl.X509TrustManager; 

public class DummyX509TrustManager implements X509TrustManager { 

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

    @Override 
    public void checkServerTrusted(X509Certificate[] paramArrayOfX509Certificate, String paramString) 
      throws CertificateException { 
    } 

    @Override 
    public void checkClientTrusted(X509Certificate[] paramArrayOfX509Certificate, String paramString) 
      throws CertificateException { 
    } 
}; 


final TrustManager[] trustAllCerts = new TrustManager[] { new DummyX509TrustManager() }; 
try { 
    SSLContext sslContext= SSLContext.getInstance("SSL"); 
    sslContext.init(null, trustAllCerts, null); 

    CloseableHttpClient client = HttpClients.custom() 
     .setRedirectStrategy(new LaxRedirectStrategy()) 
     .setSslcontext(sslContext) 
     .setConnectionManager(connMgr) 
     .build(); 
} catch (KeyManagementException e) { 
    throw new IOException(e.getMessage()); 
} catch (NoSuchAlgorithmException e) { 
    throw new IOException(e.getMessage()); 
} 
+0

Ich denke, das war die CertificateException anzugehen, die erschien, als ich den Keystore hinzufügte und die .crt importierte. Stellt sich heraus, dass ich diese Problemumgehung nicht wirklich verwenden kann, möchte ich lieber die ursprüngliche SunCertPathBuilderException vermeiden. – Tim

+0

Trotzdem habe ich Ihre Lösung versucht und ich bekomme diesen Fehler jetzt: 'java.security.KeyStoreException: Problem Zugriff auf Trust storejava.security.cert.CertificateParsingException: signed overrun, bytes = 266 bei com.sun.net.ssl.internal. ssl.TrustManagerFactoryImpl.engineInit (TrustManagerFactoryImpl.java:55) ' – Tim

+1

Ihre Antwort ließ mich das Ganze überprüfen und ich hatte einen Fehler in meinem Code. Da du der einzige bist, der geantwortet hat, ist es fair, dass du das Kopfgeld bekommst :) Danke – Tim

2

ist das Website-Zertifikat von einer privaten/firmeneigenen Zertifizierungsstelle ausgestellt oder ist es ein selbst signierte?

... new SSLContextBuilder().loadTrustMaterial(null, new TrustStrategy() ... 
  • TruStore ist null:
    Haben Sie versucht, einen Schlüsselspeicher/Datei zu laden, um die vertrauenswürdigen Zertifizierungs + ihre Ketten enthalten?
  • isTrusted gibt immer "true" zurück:
    Sie überschreiben den standardmäßigen JSSE-Zertifikatsüberprüfungsprozess und vertrauen allen, also keine Sicherheit.
  • Diese Ausnahme: bedeutet, dass die Zertifikatsprüfung fehlgeschlagen ist. RootCA oder die gesamte CA-Kette fehlt.

So scheint es Tomcat ignoriert Ihre SSLContext. So verwendet, ist der sslContext sowieso nutzlos. Debugging-Ergebnisse? JVM SSL-Einstellungen? Ausnahmestapel-Trace?

-1

Sie haben ein Servlet entwickelt. Recht? Es ist nichts anderes als eine Webseite. Wenn Sie eine SSL-fähige Webseite möchten, müssen Sie nach der Installation dieses Zertifikats ein SSL-Zertifikat erwerben. Wenn Sie dieses Zertifikat nicht besitzen, verwenden Sie die oben genannten Codes. Die oben genannten Codes sind für alle Sicherheitsprobleme geeignet.

Sie müssen das SSL/TSL-Zertifikat von Unternehmen wie Verisign und Thawte kaufen.