web-dev-qa-db-ja.com

Javaでサーバー証明書チェーンが有効で信頼できることを確認する方法

リモートサーバーとのHttps接続を作成してから、証明書を取得して確認する必要があります。

私は接続をうまく確立しました:

_try {  
    url = new URL(this.SERVER_URL);  
    HttpURLConnection con = (HttpURLConnection) url.openConnection();   
    HttpsURLConnection secured = (HttpsURLConnection) con;  
    secured.connect(); 
}  
_

しかし、getServerCertificateChain()メソッドはHttpsURLConnection型では定義されていないようです。

それでは、サーバー証明書チェーンを取得するにはどうすればよいですか?私の理解では、getServerCertificateChain()は_X509Certificate_オブジェクトの配列を返す必要があり、このクラスには、証明書の問い合わせに使用できるメソッドがあることです。

私はそれを確認する必要があります:

  1. 証明書は有効で信頼されており、
  2. 証明書失効リスト配布ポイントを証明書のシリアル番号と照合します。
  3. 有効期限が切れていないことを確認し、
  4. 証明書のURLが別のものと一致していることを確認します(すでに取得済みです)。

私は道に迷っていて、どんな助けにも感謝します!

17
Marc H

必要なメソッドは getServerCertificates であり、getServerCertificateChainではありません。ニースのサンプルコード here がいくつかあります。


[〜#〜]編集[〜#〜]

自分のサンプルコードをいくつか追加しました。あなたのための良い出発点。 HttpsURLConnection および X509Certificate のJavadocを確認することを忘れないでください。

import Java.net.URL;
import Java.security.cert.Certificate;
import Java.security.cert.CertificateExpiredException;
import Java.security.cert.X509Certificate;

import javax.net.ssl.HttpsURLConnection;

public class TestSecuredConnection {

    /**
     * @param args
     */
    public static void main(String[] args) {
        TestSecuredConnection tester = new TestSecuredConnection();
        try {
            tester.testConnectionTo("https://www.google.com");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public TestSecuredConnection() {
        super();
    }

    public void testConnectionTo(String aURL) throws Exception {
        URL destinationURL = new URL(aURL);
        HttpsURLConnection conn = (HttpsURLConnection) destinationURL
                .openConnection();
        conn.connect();
        Certificate[] certs = conn.getServerCertificates();
        for (Certificate cert : certs) {
            System.out.println("Certificate is: " + cert);
            if(cert instanceof X509Certificate) {
                try {
                    ( (X509Certificate) cert).checkValidity();
                    System.out.println("Certificate is active for current date");
                } catch(CertificateExpiredException cee) {
                    System.out.println("Certificate is expired");
                }
            }
        }
    }
}
25
Perception

すばやくグーグルすると、BouncyCastleを使用したこの例が表示されます。質問に答えるほうがいいと思います。 http://www.nakov.com/blog/2009/12/01/x509-certificate-validation-in-Java-build-and-verify-chain-and-verify-clr-with-bouncy-お城/

2
Kirby

Kirbyとarulraj.netによって言及されたこのサンプルコードは、2011年にApache CXFから削除され、OCSPをサポートしませんでした。 Apache PDFBox プロジェクトは、このコードを「復活」させ、OCSPサポートと、元のコードに欠けていたその他の機能を追加しました。 CRL署名チェック。リリース2.0.13以降、改善されたソースコードは、CertificateVerifierクラスのサンプルサブプロジェクトで使用できます。 オンラインで利用可能 にも改善が加えられています。

コードは完全であると主張しておらず、ルートが信頼できるかどうかはまだチェックしていません。開発はJIRAの課題 PDFBOX-3017 で追跡されます。

1
Tilman Hausherr