SSL-Zertifikatfehler in Java ignorieren

Immer wieder darf man mit Servern zusammenarbeiten, die zwar eine SSL/TLS-Verbindung anbieten, dabei aber auf müllige Zertifikate setzen:

  • Unbekannte/selbstgebaute CA
  • Komische CA-Chains bei der die Zwischenzertifikate fehlen
  • Servername passt nicht zum OU/DN

Dass man mit solchen Zertifikaten den ganzen Sicherheitsaskept ad-absurdum führt interessiert die Serverbetreiber meist nicht.

Trotz allem will/muss man mit solchen Diensten aber kommunizieren.
MIttels folgendem Code ignoriert man sowohl ungültige CA-Ketten als auch unpassende Zertifikate zum Server selber:

Bei der Verwendung dieses Codes ignoriert man sämtliche SSL-Verifaktionsfehler. Bitte sei dir absolut bewusst, was du tust und was die Implikationen auf deinen Sicherheitsarchitektur sind!

  1. package de.zeeman;
  2.  
  3. import java.security.KeyManagementException;
  4. import java.security.NoSuchAlgorithmException;
  5. import java.security.SecureRandom;
  6. import java.security.cert.CertificateException;
  7. import java.security.cert.X509Certificate;
  8.  
  9. import javax.net.ssl.HostnameVerifier;
  10. import javax.net.ssl.HttpsURLConnection;
  11. import javax.net.ssl.KeyManager;
  12. import javax.net.ssl.SSLContext;
  13. import javax.net.ssl.SSLSession;
  14. import javax.net.ssl.TrustManager;
  15. import javax.net.ssl.X509TrustManager;
  16.  
  17. public final class NullSslVerifier  {
  18.  
  19.     private static final class AcceptAllTrustManager implements X509TrustManager {
  20.  
  21.         @Override
  22.         public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
  23.         }
  24.  
  25.         @Override
  26.         public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
  27.         }
  28.  
  29.         @Override
  30.         public X509Certificate[] getAcceptedIssuers() {
  31.             return null;
  32.         }
  33.     }
  34.  
  35.     private static final class AcceptAllHostnameVerifier implements HostnameVerifier  {
  36.         @Override
  37.         public boolean verify(String hostname, SSLSession session) {
  38.             return true;
  39.         }
  40.     }
  41.    
  42.     public NullSslVerifier() {
  43.         try {
  44.             installTrustManager();
  45.             installHostnameVerifier();
  46.         } catch (Exception e) {
  47.             throw new RuntimeException(e.getMessage(), e);
  48.         }
  49.     }
  50.    
  51.     /** Ignore unknown / incomplete CA chains */
  52.     private void installTrustManager() throws NoSuchAlgorithmException, KeyManagementException {
  53.         SSLContext ctx = SSLContext.getInstance("TLS");
  54.         ctx.init(new KeyManager[]{}, new TrustManager[] {new AcceptAllTrustManager()}, new SecureRandom());
  55.         SSLContext.setDefault(ctx);    
  56.     }
  57.    
  58.     /** Ignore invalid / non-matching SSL certificates */
  59.     private void installHostnameVerifier() {
  60.         HttpsURLConnection.setDefaultHostnameVerifier(new AcceptAllHostnameVerifier());    
  61.     }
  62. }

Schreibe einen Kommentar