Wie kann ich die initialisieren eines TrustManagerFactory mit mehreren Quellen von Vertrauen?

Meine Anwendung hat eine persönliche vertrauenswürdigen Schlüsselspeicher selbst-signierte Zertifikate für die Nutzung im lokalen Netz - sagen mykeystore.jks. Ich möchte in der Lage sein, eine Verbindung zu öffentlichen Webseiten(sagen google.com) sowie diejenigen, die in meinem lokalen Netzwerk, die selbstsignierte Zertifikate verwenden, die bereitgestellt wurden, lokal.

Das problem hier ist, dass, wenn ich eine Verbindung zu https://google.com, Weg Gebäude schlägt fehl, da die Einstellung meiner eigenen keystore überschreibt die Standard-keystore mit root-CAs zusammen mit der JRE, die Berichterstattung über die Ausnahme

sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

Allerdings, wenn ich importieren Sie ein CA-Zertifikat in meinem eigenen keystore(mykeystore.jks) funktioniert es einwandfrei. Gibt es eine Möglichkeit diese beiden zu unterstützen?

Habe ich meine eigene TrustManger für diesen Zweck,

public class CustomX509TrustManager implements X509TrustManager {

        X509TrustManager defaultTrustManager;

        public MyX509TrustManager(KeyStore keystore) {
                TrustManagerFactory trustMgrFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
                trustMgrFactory.init(keystore);
                TrustManager trustManagers[] = trustMgrFactory.getTrustManagers();
                for (int i = 0; i < trustManagers.length; i++) {
                    if (trustManagers[i] instanceof X509TrustManager) {
                        defaultTrustManager = (X509TrustManager) trustManagers[i];
                        return;
                    }
                }

        public void checkServerTrusted(X509Certificate[] chain, String authType)
                throws CertificateException {
            try {
                defaultTrustManager.checkServerTrusted(chain, authType);
            } catch (CertificateException ce) {
            /* Handle untrusted certificates */
            }
        }
    }

Ich dann die Initialisierung des SSLContext,

TrustManager[] trustManagers =
            new TrustManager[] { new CustomX509TrustManager(keystore) };
SSLContext customSSLContext =
        SSLContext.getInstance("TLS");
customSSLContext.init(null, trustManagers, null);

und legen Sie die socket factory,

HttpsURLConnection.setDefaultSSLSocketFactory(customSSLContext.getSocketFactory());

Hauptprogramm,

URL targetServer = new URL(url);
HttpsURLConnection conn = (HttpsURLConnection) targetServer.openConnection();

Wenn ich nicht mein eigenes Vertrauen, Führungskräfte, verbindet es sich mit https://google.com gut. Wie bekomme ich eine "Standard-trust-manager", die Punkte auf dem Standard-Schlüssel speichern?

InformationsquelleAutor varrunr | 2014-04-17
Schreibe einen Kommentar