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());
- }
- }