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!

package de.zeeman;

import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;

import javax.net.ssl.HostnameVerifier;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.KeyManager;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSession;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;

public final class NullSslVerifier  {

    private static final class AcceptAllTrustManager implements X509TrustManager {

		@Override
		public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
		}

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

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

    private static final class AcceptAllHostnameVerifier implements HostnameVerifier  {
		@Override
		public boolean verify(String hostname, SSLSession session) {
			return true;
		}
    }
	
	public NullSslVerifier() {
		try {
			installTrustManager();
			installHostnameVerifier();
		} catch (Exception e) {
			throw new RuntimeException(e.getMessage(), e);
		}
	}
	
	/** Ignore unknown / incomplete CA chains */
	private void installTrustManager() throws NoSuchAlgorithmException, KeyManagementException {
        SSLContext ctx = SSLContext.getInstance("TLS");
        ctx.init(new KeyManager[]{}, new TrustManager[] {new AcceptAllTrustManager()}, new SecureRandom());
        SSLContext.setDefault(ctx);		
	}
	
	/** Ignore invalid / non-matching SSL certificates */
	private void installHostnameVerifier() {
        HttpsURLConnection.setDefaultHostnameVerifier(new AcceptAllHostnameVerifier());		
	}
}

Schreibe einen Kommentar