web-dev-qa-db-ja.com

Javaを使用してX.509証明書を検証する場合、どのデータを検証する必要がありますか?

さて、私は1年前に学校のRFIDシステムでPKIを始めました。今、私はこれを自分の仕事に実装するように求められます。私はアイデアの大部分を理解しています。疑いは証明書の検証についてです。

「それ以前」と「後で」という有効な日付があることは知っています。これは、証明書が有効であると言うのに十分ですか?これは、証明書が毎年変更されるため、署名されたデータが有効なキーで署名されていることを確認したいためです。これをJavaに実装するにはどうすればよいですか?

もう1つの質問は失効に関するものです。それが何のためにあるのか理解できません。誰か説明してもらえますか?

6
BRabbit27

証明書の失効がない場合、証明書を検証する唯一の方法は、日付が正しいこと、および証明書に署名したCAが信頼できることを確認することです。 VPNアクセス用のユーザーにクライアント証明書を発行し、その証明書が紛失または盗難にあった場合はどうなりますか?サーバーが危険にさらされ、証明書が信頼されなくなった場合はどうなりますか?証明書の取り消しにより、受け入れられなくなった個々の証明書を「取り消す」ことができます。証明書を検証するとき、クライアントはCRL(証明書失効リスト)をチェックして、失効した証明書のリストを確認し、証明書がまだ良好であることを確認します。

4
Paul Ackerman

証明書の検証は、日付を確認するよりも少し多いです。

RFC 528 をご覧ください。何度も読んでそのドキュメントを完全に理解していなければ、あらゆる種類のセキュリティと適切な相互運用性を備えた証明書の検証を実装できると考えるのはまったくの妄想です。 X.509関連の標準には多くのクラッドが蓄積されているため、証明書の検証の実装は困難な作業です。 X.509スタイルガイド は必読です(現在は少し日付が付けられていますが、X.509の世界の状況について正しい印象を与えています)。

実際、上司がX.509検証を実装するように指示した場合、上司はあなたをからかったか、または現実から深刻に切り離されています。

あなたの最善の策は、すでに仕事をしているいくつかの既存のライブラリを使用することです。幸い、Java自体にそのためのコードが付属しています。Java.security.cert パッケージ。 Java PKI Programmer's Guide と、それに隣接する note をよく読んでください。

Revocationは、PKIで「おっと、申し訳ありませんが、以前のメッセージを無視する」に相当します。これは、署名と名前の制約、およびポリシーツリーとキーの使用法のすべての道具がすべて問題がないと述べている場合でも、特定の証明書を使用しないことを宣言するために使用されます。失効ステータスのチェックには、失効の可能性のあるリスト(CRL)のダウンロードや、一部の証明書のステータスを表明するオンラインサーバー(OCSP)との会話が含まれます。いずれにしても、それは高価でかさばり、対応する認証局が失効情報を適切で標準に準拠した方法で発行する場合にのみ機能します。

8
Tom Leek

証明書パスAPIについて@Tom Leekが述べたことに加えて、「TLS証明書」について話しているようです。これは、TLSの範囲内でX.509証明書を使用している可能性があることを示しています。

これをJavaのTLSスタック(JSSE)の一部として行うには、既存のX509TrustManagerインフラストラクチャを使用できます。私はそれが RFC 528 または RFC 328 のどちらに対して検証するのかわからないことを認めなければなりません(おそらくそれはJava使用しています。Sun/ Oracle JRE 6を想定していますが、実装は セキュリティプロバイダー によって異なります。これは、すでに認証パスAPIのラッパーです。言及した。

TrustManagerFactorynullで初期化する例を次に示します。これは トラストアンカーのデフォルト値 を使用します。以下は、トラストマネージャーを提供します。

TrustManagerFactory factory = TrustManagerFactory.getInstance("PKIX");
factory.init((KeyStore)null);
TrustManager[] trustManagers = factory.getTrustManagers();

トラストマネージャのcheck*メソッドは、何かが失敗したときに CertificateException をスローします。また、日付の有効性もチェックします。

トラストマネージャーを使用して SSLContext を初期化し、SSLSocket(ファクトリを介して)またはSSLEngineを初期化できます。デフォルトでは、SSLSocketFactoryはデフォルトのSSLContextを使用し、それ自体がいくつかの デフォルト値 で初期化されます。

アプリケーションの拡張機能を確認したり、特定のルールを緩和したりする必要がある場合は、独自のTrustManagerを作成することもできます。 (たとえば、既存のトラストマネージャーをラップするための小さなライブラリを作成しました プロキシ証明書などの他の形式の証明書を受け入れますRFC 382 -3280ではありません)。 )

特定の拡張機能を検証するには、ASN.1などを処理するためのデータ構造を提供するため、 BouncyCastle を使用することをお勧めします。

6
Bruno