web-dev-qa-db-ja.com

Javaで信頼されたルート証明書のリストを取得するにはどうすればよいですか?

Javaアプリでプログラムによってすべての信頼されたルート証明書にアクセスできるようにしたいと思います。

私はキーストアインターフェースを見ていましたが、JREに暗黙的に含まれる信頼されたルートのリストを取得したいと思っています。

これはどこからでもアクセスできますか?

32
Shawn D.

ルート証明書のセットを取得してそれらを反復処理する方法を示す例があります キーストア内の最も信頼された認証局(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) {
        } 
    }
}
36
Bill the Lizard

これは、すべての証明書を取得するためにシステムのデフォルトのトラストストアを使用して、より柔軟にする必要があります。

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

「」

12
k_o_