Wie initialisiere ich eine TrustManagerFactory mit mehreren Vertrauensquellen?

8

Meine Anwendung verfügt über einen persönlichen Schlüsselspeicher, der vertrauenswürdige selbstsignierte Zertifikate für die Verwendung im lokalen Netzwerk enthält - sagen wir mykeystore.jks . Ich möchte in der Lage sein, eine Verbindung zu öffentlichen Sites (z. B. google.com) sowie zu denen in meinem lokalen Netzwerk herzustellen, die selbst signierte Zertifikate verwenden, die lokal bereitgestellt wurden.

Das Problem hierbei ist, dass beim Erstellen einer Verbindung mit Ссылка der Pfadaufbau fehlschlägt, da das Festlegen eines eigenen Schlüsselspeichers den Standard-Keystore überschreibt, der die gebündelten Stammzertifizierungsstellen enthält mit der JRE, meldet die Ausnahme

%Vor%

Wenn ich jedoch ein CA-Zertifikat in meinen eigenen Keystore ( mykeystore.jks ) importiere, funktioniert es einwandfrei. Gibt es eine Möglichkeit, beides zu unterstützen?

Ich habe zu diesem Zweck meinen eigenen TrustManger,

%Vor%

Ich initialisiere dann den SSLContext,     TrustManager [] trustManagers =                 neuer TrustManager [] {neuer CustomX509TrustManager (Schlüsselspeicher)};     SSLContext customSSLContext =             SSLContext.getInstance ("TLS");     customSSLContext.init (null, trustManagers, null);

und stellen Sie die Socket-Factory ein,

%Vor%

Das Hauptprogramm,

%Vor%

Wenn ich keine eigenen Vertrauensmanager einstelle, wird eine Verbindung zu Ссылка hergestellt. Wie bekomme ich einen "Standard Trust Manager", der auf den Standardschlüsselspeicher verweist?

    
varrunr 17.04.2014, 22:13
quelle

4 Antworten

14

In trustMgrFactory.init(keystore); konfigurieren Sie defaultTrustManager mit Ihrem eigenen persönlichen Keystore, nicht mit dem standardmäßigen Keystore des Systems.

Nach dem Lesen des Quellcodes für sun.security.ssl.TrustManagerFactoryImpl sieht es so aus, als würde trustMgrFactory.init((KeyStore) null); genau das tun, was Sie brauchen (Laden Sie den Standard-Keystore des Systems), und auf der Grundlage schneller Tests scheint es für mich zu funktionieren .

    
Pasi 23.04.2014 20:53
quelle
6

Die Antwort hier ist, wie ich dazu kam zu verstehen, wie man das macht. Wenn Sie nur die System-CA-Zertifikate und einen benutzerdefinierten Keystore von Zertifikaten akzeptieren möchten, habe ich sie mit einigen Komfortmethoden in einer einzigen Klasse vereinfacht. Der vollständige Code ist hier verfügbar:

Ссылка

%Vor%     
Hugh Jeffner 02.03.2016 22:03
quelle
1

Ich bin auf das gleiche Problem mit Commons HttpClient gestoßen. Die Arbeitslösung für meinen Fall bestand darin, die Delegierungskette für PKIX TrustManager folgendermaßen zu erstellen:

%Vor%

Und initialisiere HttpClient auf folgende Weise (ja, es ist hässlich):

%Vor%

In Ihrem Fall mit der einfachen HttpsURLConnection können Sie mit der vereinfachten Version der delegierenden Klasse umgehen:

%Vor%     
Novoj 17.02.2016 16:12
quelle
-1

Wenn Sie einen SSLContext initialisieren, geben Sie ein Array von TrustManagers an. Sie liefern zwei: einen Standard, der den JRE-Truststore verwendet, und einen anderen, der Ihren verwendet. Das Delegationsmodell ist hier die falsche Antwort.

    
EJP 18.04.2014 00:04
quelle

Tags und Links