Pytanie Jak mogę uzyskać listę zaufanych certyfikatów głównych w Javie?


Chciałbym móc programowo uzyskać dostęp do wszystkich zaufanych certyfikatów głównych w aplikacji Java.

Patrzyłem na interfejs magazynu kluczy, ale mam nadzieję, że otrzymam listę zaufanych źródeł, która jest ukryta w środowisku JRE.

Czy jest to dostępne w dowolnym miejscu?


27
2017-08-18 00:33


pochodzenie




Odpowiedzi:


Istnieje przykład pokazujący, jak uzyskać zestaw certyfikatów głównych i wykonać iterację za ich pośrednictwem Wyświetlanie najbardziej zaufanych urzędów certyfikacji (CA) w magazynie kluczy. Oto nieco zmodyfikowana wersja, która wypisuje każdy certyfikat (testowany w systemie Windows Vista).

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.security.InvalidAlgorithmParameterException;
import java.security.KeyStore;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.cert.CertificateException;
import java.security.cert.PKIXParameters;
import java.security.cert.TrustAnchor;
import java.security.cert.X509Certificate;
import java.util.Iterator;


public class Main {

    public static void main(String[] args) {
        try {
            // Load the JDK's cacerts keystore file
            String filename = System.getProperty("java.home") + "/lib/security/cacerts".replace('/', File.separatorChar);
            FileInputStream is = new FileInputStream(filename);
            KeyStore keystore = KeyStore.getInstance(KeyStore.getDefaultType());
            String password = "changeit";
            keystore.load(is, password.toCharArray());

            // This class retrieves the most-trusted CAs from the keystore
            PKIXParameters params = new PKIXParameters(keystore);

            // Get the set of trust anchors, which contain the most-trusted CA certificates
            Iterator it = params.getTrustAnchors().iterator();
            while( it.hasNext() ) {
                TrustAnchor ta = (TrustAnchor)it.next();
                // Get certificate
                X509Certificate cert = ta.getTrustedCert();
                System.out.println(cert);
            }
        } catch (CertificateException e) {
        } catch (KeyStoreException e) {
        } catch (NoSuchAlgorithmException e) {
        } catch (InvalidAlgorithmParameterException e) {
        } catch (IOException e) {
        } 
    }
}

33
2017-08-18 01:01



ok, spróbuję tego. (czas mija) Zadziałało. Wiesz, to smutne, że hasło do domyślnego magazynu kluczy to naprawdę "zmień". Dzięki. - Shawn D.
Znasz lepsze hasło do domyślnego magazynu kluczy? - Thorbjørn Ravn Andersen
@jaime: Możesz to zmienić za pomocą keytool. sslshopper.com/... - Bill the Lizard
Ten kod ma istotne ograniczenia, IMO. Na przykład, jeśli domyślny magazyn zaufanych certyfikatów jest ustawiony przy użyciu właściwości systemu (javax.net.ssl.trustStore, javax.net.ssl.trustStorePassword, javax.net.ssl.trustStoreType, itp.), Wówczas ten kod zakończy ładowanie niewłaściwego zaufania sklep. Ten typ kodu powoduje także problemy w środowiskach, w których domyślny magazyn zaufanych certyfikatów został zastąpiony przez coś takiego jak NSS (dla zgodności z FIPS). - jsight
@Bill - "Ta klasa pobiera najbardziej zaufane CA z magazynu kluczy" - proszę wybaczyć mojej ignorancji ... co oznacza "najbardziej zaufany"? - jww


Powinno to być bardziej elastyczne przy użyciu domyślnego magazynu zaufanych certyfikatów w systemie, aby uzyskać wszystkie certyfikaty:

TrustManagerFactory trustManagerFactory =
   TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
List<Certificate> x509Certificates = new ArrayList<>();
trustManagerFactory.init((KeyStore)null);                 
Arrays.asList(trustManagerFactory.getTrustManagers()).stream().forEach(t -> {
                    x509Certificates.addAll(Arrays.asList(((X509TrustManager)t).getAcceptedIssuers()));
                });

`` `


7
2017-10-20 14:47



wymaga Androida N - Greg