2016-07-11 23 views
1

現在SSLを使用してネットワークTCPサーバーを作成しています。プロダクションでは、最終的にクライアントに証明書の認証を要求します。Java SSL証明書失効確認

緊急時に証明書を取り消すために、CRLを設定したいと考えています。

私の質問は:JavaはCRL(証明書と共に提供されている場合)をチェックしてすぐにチェックするか、手動でそのようなチェックを実装する必要がありますか?

テストでは、CRLが設定された証明書を用意しましたが、Javaで検証できないようです(ローカルWebサーバーにドロップしてアクセスできません)。

私はcom.sun.net.ssl.checkRevocation = true VMオプションを見つけましたが、明らかにCRLを照会しません。 VM java.security.debug =証明書パスに設定デバッグ出力を生成しません、どちらか...

ジャワそのサブシステム内のクラスに関連しているようだ(例えばjava.security.cert.X509CRLSelector)が、それは明らかに始まりません。

私は、キー/トラストおよびZIPアーカイブとしてここからダウンロードすることができ、クライアント/サーバー用の自己署名証明書に基づいてSSLContextの初期化クライアント・サーバとしてApacheミナを用いた小型のmavenスタイルのプロジェクトを書いた:https://www.dropbox.com/s/3fqmd1v9mn2a5ve/ssltest.zip?dl=0

+0

デフォルトでは、javaはCRLをチェックしません。必要に応じてカスタム証明書検証ツールを作成する必要があります。 –

+0

https://www.java.com/ja/download/help/revocation_options.xml –

+0

[CRL Verification in Java](http://stackoverflow.com/questions/30903993/crl-verification)の重複の可能性があります。 -in-java) –

答えて

7

コメントに示唆されているように、カスタムバリデータを実装せずにSSLContext内でCRLチェックを有効にする方法を考えました。

主に、SSLContextのTrustManagerを失効チェッカー、適切な初期化ロジック、数行だけで適切に初期化し、カスタム・チェック・ロジックがなくなり、CRLが検証パスと同時に自動的にチェックされます。

ここでは、基本的に私がクライアントに発行された証明書は、私たちのCRLに失効しているかどうかをチェックし、自分のアプリケーションに必要なものをやったスニペット...

KeyStore ts = KeyStore.getInstance("JKS"); 
FileInputStream tfis = new FileInputStream(trustStorePath); 
ts.load(tfis, trustStorePass.toCharArray()); 

KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm()); 
TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); 

// initialize certification path checking for the offered certificates and revocation checks against CLRs 
CertPathBuilder cpb = CertPathBuilder.getInstance("PKIX"); 
PKIXRevocationChecker rc = (PKIXRevocationChecker)cpb.getRevocationChecker(); 
rc.setOptions(EnumSet.of(
    PKIXRevocationChecker.Option.PREFER_CRLS, // prefer CLR over OCSP 
    PKIXRevocationChecker.Option.ONLY_END_ENTITY, 
    PKIXRevocationChecker.Option.SOFT_FAIL, // handshake should not fail when CRL is not available 
PKIXRevocationChecker.Option.NO_FALLBACK)); // don't fall back to OCSP checking 

PKIXBuilderParameters pkixParams = new PKIXBuilderParameters(ts, new X509CertSelector()); 
pkixParams.addCertPathChecker(rc); 

tmf.init(new CertPathTrustManagerParameters(pkixParams)); 
// init KeyManagerFactory 
kmf.init(...) 

SSLContext ctx = SSLContext.getInstance("TLS"); 
ctx.init(kmf.getKeyManagers), tmf.getTrustManagers(), null); 

です。エンドエンティティのチェックとCRLチェックの失敗を許可するのは、すべてのインフラストラクチャであるためです。

+0

ちょっと、Java 1.7のための同様のソリューションはありますか? – mdavid

+0

@mdavid:申し訳ありませんが、私はあなたにその答えを数回与えることを拒否しましたが、多分あなたはJava 8を試すべきです(リリースの3年後?)。 セキュリティスタックには数多くの改善点があります。http://www.oracle.com/technetwork/java/javase/8-whats-new-2157071.html 変更ログに_PKIXRevocationChecker _ 1.7で証明書を検証するためのすぐれたソリューションはないと思います。 – DoNuT

+0

こんにちは@DoNuT、遠隔地(CRLで提供されている)からCRLを取得し、次の更新時間までキャッシュしていますか?新しいCRLをもう一度取得しますか?前もって感謝します。 – ramtech

関連する問題