Ist es möglich, Java zu erhalten das „Trust Store“ zu ignorieren und nur akzeptieren, was SSL-Zertifikat wird es?

StackOverflow https://stackoverflow.com/questions/1219208

  •  10-07-2019
  •  | 
  •  

Frage

Ich versuche, einen SSL-Client zu schreiben, die Mail mit der javax.mail API sendet. Das Problem, das ich habe ist, dass die Server-Anforderung, die ich SSL verwenden, aber der Server ist auch mit einem Nicht-Standard-SSL-Zertifikat konfiguriert. Die Web-Seiten, die ich gefunden habe, sagen, dass ich das Zertifikat in den Trust Store zu installieren. Ich will nicht zu tun, dass (ich nicht über die erforderlichen Berechtigungen verfügen.)

  1. Gibt es eine Möglichkeit Java zu bekommen, um nur das Zertifikat Fehler zu ignorieren und akzeptieren es?
  2. Gelingt das nicht, ist es eine Möglichkeit, das Vertrauen Shop hat für mein Programm lokal sein, und nicht für die ganze JVM installiert?
War es hilfreich?

Lösung

Sie müssen einen gefälschten Trustmanager erstellen, die alle Zertifikate akzeptiert, und es als Manager registrieren. So etwas wie folgt aus:

public class MyManager implements com.sun.net.ssl.X509TrustManager {
  public boolean isClientTrusted(X509Certificate[] chain) { return true; }
  public boolean isHostTrusted(X509Certificate[] chain) { return true; }
  ...
}


com.sun.net.ssl.TrustManager[] managers =
  new com.sun.net.ssl.TrustManager[] {new MyManager()};

com.sun.net.ssl.SSLContext.getInstance("SSL").
       .init(null, managers, new SecureRandom());

Andere Tipps

Arbeitscode (in jdk1.6.0_23) für # 1.

Import

import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
import java.security.cert.X509Certificate;

Das tatsächliche Vertrauen aller Trustmanager-Code.

TrustManager trm = new X509TrustManager() {
    public X509Certificate[] getAcceptedIssuers() {
        return null;
    }

    public void checkClientTrusted(X509Certificate[] certs, String authType) {

    }

    public void checkServerTrusted(X509Certificate[] certs, String authType) {
    }
};

SSLContext sc = SSLContext.getInstance("SSL");
sc.init(null, new TrustManager[] { trm }, null);
HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());

Versuchen Sie, diese (Antwort auf Frage 2):

System.setProperty("javax.net.ssl.trustStore", "/path/to/truststore");

Sie können auch diese als zusätzliche Befehlszeilenparameter angeben:

java -Djavax.net.ssl.trustStore=/path/to/truststore <remaining arguments>

Auf Fedora dies das System breiten Java Trust Store in /etc/pki/java/cacerts sein könnte

Fügen Sie einfach -Dtrust_all_cert=true zu VM Argumente. Dieses Argument sagt java alle Zertifikatsprüfungen zu ignorieren.

In Kommandozeile können Sie Argument -noCertificationCheck zu Java hinzufügen, um die Zertifikatsprüfungen zu ignorieren.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top