Как мога да получа списък с надеждни основни сертификати в Java?

Бих искал да мога да получа достъп до всички надеждни основни сертификати програмно в приложение на Java.

Гледах интерфейса на хранилището за ключове, но се надявам да получа списъка с доверени корени, който се подразбира с JRE.

Това достъпно ли е някъде?


person Shawn D.    schedule 18.08.2010    source източник


Отговори (2)


Има пример, който показва как да получите набор от главните сертификати и да преминете през тях, наречен Изброяване на най-надеждните сертифициращи органи (CA) в хранилище за ключове. Ето една леко модифицирана версия, която отпечатва всеки сертификат (тествано на 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) {
        } 
    }
}
person Bill the Lizard    schedule 18.08.2010
comment
добре, ще пробвам това. (времето минава) Проработи. Знаете ли, тъжното е, че паролата за хранилището за ключове по подразбиране наистина е „changeit“. Благодаря. - person Shawn D.; 18.08.2010
comment
Знаете ли за по-добра парола за хранилището на ключове по подразбиране? - person Thorbjørn Ravn Andersen; 18.08.2010
comment
има ли начин да промените паролата по подразбиране?? - person Jaime Hablutzel; 13.05.2011
comment
@jaime: Можете да го промените с помощта на keytool. sslshopper.com/ - person Bill the Lizard; 13.05.2011
comment
Това вероятно ще работи през повечето време, но не е гарантирано: stackoverflow.com/a/8885263/372643 - person Bruno; 01.05.2012
comment
Този код има значителни ограничения, IMO. Например, ако довереното хранилище по подразбиране е зададено с помощта на системни свойства (javax.net.ssl.trustStore, javax.net.ssl.trustStorePassword, javax.net.ssl.trustStoreType и т.н.), тогава този код в крайна сметка ще зареди грешното доверие магазин. Този тип код също ще причини проблеми в среди, в които довереното хранилище по подразбиране е заменено с нещо като NSS (за съответствие с FIPS). - person jsight; 29.11.2012
comment
@Bill - Този клас извлича най-доверените CA от хранилището за ключове - моля, простете ми невежеството... какво означава най-доверен? - person jww; 28.04.2014
comment
@jww most-trusted в този случай просто препраща към доверена котва (en.wikipedia.org/wiki/Trust_anchor). В горния пример това биха били доверените CA или органите, които издават/подписват сертификатите на сайт, който може да посетите, или URL адрес, с който може да взаимодействате. - person josh-cain; 11.11.2015
comment
Exampledepot.com се продава сега (2018). Но тази връзка изглежда добре java2s.com/Tutorial/Java/0490__Security/ - person datafiddler; 14.03.2018

Това трябва да е по-гъвкаво, като се използва хранилището за доверие по подразбиране в системата за получаване на всички сертификати:

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

```

person k_o_    schedule 20.10.2016
comment
изисква Android N - person Greg; 08.03.2017