2

次のコードを使用して、サーバートラストストアにクライアント証明書を挿入しています

  FileInputStream fileInputStream = new FileInputStream( "c:/server.jks" );
    keyStore.load( fileInputStream, "keystore".toCharArray() );
    fileInputStream.close();
    keyStore.setCertificateEntry( alias, new X509Certificate( trustedCertificate ) );

    FileOutputStream fileOutputStream = new FileOutputStream("c:/server.jks" );
    keyStore.store( fileOutputStream, "keystore".toCharArray() );
    fileOutputStream.close();

これで、証明書がトラストストアに入力されているのに、クライアントの証明書に署名したCAの証明書がトラストストアに存在しないことがわかります。では、証明書をキーストアに入力する前に、CAの証明書が使用可能かどうかを確認する方法はありますか?

4

1 に答える 1

3

証明書がルート機関によって発行されたものか、自己署名されたものかを確認する必要があると思います。デフォルトのJavaキーストアであるcacertsを使用していると思います。私はコードをテストしていませんが、これはあなたの問題の解決策かもしれないと思います:

  1. 次のリンクから取得および変更されたコード:

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

        String filename = System.getProperty("java.home") + "/lib/security/cacerts".replace('/', File.separatorChar);
        Set<X509Certificate> additionalCerts = new HashSet<X509Certificate>();
        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();
            additionalCerts.add(cert);
        }
  1. 次に、次のコードを使用して、クライアント証明書とすべてのルートCAを含むセットを次のコードのverifyCertificate(X509Certificate cert、SetadditionalCerts)メソッドに渡すことができます。

http://www.nakov.com/blog/2009/12/01/x509-certificate-validation-in-java-build-and-verify-chain-and-verify-clr-with-bouncy-castle/

于 2012-04-30T14:22:04.273 に答える