X.509 証明書と証明書の取り消しリスト (CRL)
- 概要: 証明書とは
- 証明書を使うアプリケーション
- 証明書の取得方法
- X.509 証明書の内容
- 証明書のアクセスと管理に使う Java API
- X.509 証明書の生成、表示、インポート、およびエクスポートのための Java ツール
公開鍵証明書とは、あるエンティティーが発行したデジタル署名のある文書で、別のエンティティーの公開鍵 (およびほかの情報) が特定の値であることを証明するものです。
次では、いくつかの重要な用語について説明します。
- 公開鍵
- 公開鍵は、特定のエンティティーに関連付けられた数です。公開鍵は、該当するエンティティーとの間に信頼できる関係を持つ必要があるすべての人に対して公開することを意図したものです。公開鍵は、署名を検証するのに使われます。
- デジタル署名
- データがデジタル署名されると、そのデータは、エンティティーの「アイデンティティー」と、そのエンティティーがデータの内容について知っていることを証明する署名とともに格納されます。エンティティーの非公開鍵を使って署名することで、データを偽造できなくなります。
- アイデンティティー
- エンティティーを特定するための既知の方法です。システムによっては、公開鍵をアイデンティティーにするものがあります。公開鍵のほかにも、Unix UID や電子メールアドレス、X.509 識別名など、さまざまなものをアイデンティティーとすることができます。
- Signature
- 署名は、エンティティー (署名者) の非公開鍵を使い、あるデータに対して計算されるものです。
- 非公開鍵
- 非公開鍵は特定のエンティティーだけが知っている数のことで、この数のことを、そのエンティティーの非公開鍵といいます。非公開鍵は、ほかに知られないように秘密にしておくことが前提になっています。非公開鍵は、ほかに知られないように秘密にしておくことが前提になっています。非公開鍵と公開鍵は、すべての公開鍵暗号化システムで対になって存在しています。DSA などの典型的な公開鍵暗号化システムの場合、1 つの非公開鍵は正確に 1 つの公開鍵に対応します。非公開鍵は、署名を計算するのに使われます。
- Entity
- エンテンティーは、人、組織、プログラム、コンピュータ、企業、銀行など、一定の度合いで信頼の対象となるさまざまなものを指します。
公開鍵暗号化では、その性質上、ユーザーの公開鍵にアクセスする必要があります。大規模なネットワーク環境では、互いに通信しているエンティティー間で以前の関係が引き続き確立されていると仮定したり、使われているすべての公開鍵を収めた信頼できるリポジトリが存在すると仮定したりすることは不可能です。このような公開鍵の配布に関する問題を解決するために証明書が考案されました。現在では、証明書発行局 (CA) が信頼できる第三者として機能します。CA は、信頼されて、ほかのエンティティーのために証明書に署名する (証明書を発行する) エンティティー (ビジネスなど) です。CA だけが、法的な契約による義務の下で、有効かつ信頼できる証明書を作成するものと見なされています。VeriSign、Thawte、Entrust をはじめ、多くの公開 CA が存在します。Netscape や Microsoft の認証サーバー、Entrust の CA 製品などを所属組織内で利用すれば、独自の証明書発行局を運営することも可能です。
現在、X.509 証明書のアプリケーションでもっとも身近なものは、TLS プロトコルをサポートする Web ブラウザ (Mozilla Firefox や Microsoft Internet Explorer など) です。TLS (Transport Layer Security) は、ネットワークトラフィックにプライバシと認証機能を提供するセキュリティープロトコルです。TLS をサポートするブラウザは、TLS をサポートする Web サーバーとの間でだけ、このプロトコルを使うことができます。
X.509 の証明書に依存する技術としては、ほかに次のものがあります。
- 署名された Java ARchive や Microsoft Authenticode など、さまざまなコード署名方式。
- PEM や S/MIME など、機密保護された電子メールの各種標準。
- SET など、電子商取引用のプロトコル。
証明書を取得する基本的な方法としては、次の 2 つがあります。
- 自分で作成する (keytool などの適当なツールを使う)
- 証明書発行局に証明書の発行を依頼する (直接要求する、または keytool などのツールを使って生成した要求を使う)。
証明書の作成処理で必要になる主な入力には、次のものがあります。
- 対になった公開鍵と非公開鍵。専用のツール (keytool など) やブラウザを使って生成されたものです。公開鍵だけがだれに対しても提示されます。非公開鍵は、データへの署名に使われます。他人に非公開鍵を知られると、所有者になりすまされて、所有者に帰属する法的な文書を偽造されることにもなりかねません。
- 認定されるエンティティー (自分など) についての情報を提供する必要があります。一般に、名前や勤務先住所などの情報が含まれます。CA に証明書の発行を依頼する場合、通常、情報が正しいことを証明するものを提示しなければなりません。
CA に証明書の発行を依頼する場合は、自分の非公開鍵と自分についての情報を提出します。keytool や、証明書署名要求 (CSR) の生成をサポートするブラウザなどのツールを使ってこの情報にデジタル署名し、CA に送ります。CA は証明書を生成して、送り返します。
自分で証明書を生成する場合は、同様の情報に加えて、さらに若干の情報 (証明書の有効期間、シリアル番号など) を用意し、keytool などのツールを使って証明書を作成します。自己署名の証明書では受け入れられない場合があります。CA が提供する価値の 1 つは、中立で信頼できる紹介サービスを提供することであり、その一部は、認証サービス業務 (CSP) の中で公開されている検証要件に基づいています。
X.509 規格では、証明書に含める情報が定義されており、この情報を証明書に書き込む方法 (データ形式) についても記述されています。すべての X.509 証明書は、署名のほかに次のデータを含んでいます。
- Version
- 証明書に適用される X.509 規格のバージョンを特定します。証明書に指定できる情報は、バージョンによって異なります。これまでに、3 つのバージョンが定義されています。
- シリアル番号
- 証明書を作成したエンティティーは、そのエンティティーが発行するほかの証明書と区別するために、証明書にシリアル番号を割り当てます。この情報は、さまざまな方法で使われます。たとえば、証明書が取り消されると、シリアル番号が証明書の取り消しリスト (CRL) に格納されます。
- 署名アルゴリズム識別子
- 証明書に署名を付けるときに CA が使ったアルゴリズムを特定します。
- 発行者名
- 証明書に署名したエンティティーの X.500 名です。エンティティーは、通常は CA です。この証明書を使うことは、証明書に署名を付けたエンティティーを信頼することを意味します。ルートまたはトップレベルの CA の証明書など、場合によっては発行者が自身の証明書に署名を付けることがある点に注意してください。
- 有効期間
- 各証明書は、かぎられた期間だけ有効になります。この期間は開始の日時と終了の日時によって指定され、数秒の短い期間から 100 年という長期にわたることもあります。選択される有効期間は、証明書への署名に使われる非公開鍵の強度や証明書に支払う金額など、さまざまな要因で異なります。有効期間は、使用する非公開鍵が損なわれない場合に、エンティティーが公開鍵を信頼できると期待される期間です。
- Subject 名
- 証明書で公開鍵が識別されているエンティティーの名前です。この名前は X.500 標準を使うので、インターネット全体で一意なものと想定されます。これは、エンティティーの識別名 (DN) で、次はその例です。
CN=Java Duke, OU=Java Software Division, O=Sun Microsystems Inc, C=US
これらはそれぞれサブジェクトの通称、組織単位、組織、国を表します。
- Subject の公開鍵情報
- 名前を付けられたエンティティーの公開鍵とアルゴリズム識別子です。アルゴリズム識別子では、公開鍵に対して使われている公開鍵暗号化システムおよび関連する鍵パラメータが指定されています。
X.509 Version 1 は、1988 年から利用されて広く普及しており、もっとも一般的です。
X.509 Version 2 では、サブジェクトや発行者の名前をあとで再利用できるようにするために、サブジェクトと発行者の一意識別子の概念が導入されました。ほとんどの証明書プロファイル文書では、名前を再使用しないことと、証明書で一意な識別子を使わないことが、強く推奨されています。Version 2 の証明書は、広くは使われていません。
X.509 Version 3 はもっとも新しい (1996 年) 規格で、拡張機能の概念をサポートしています。拡張機能は、だれでも定義でき、証明書に含めることができます。現在使われている一般的なエクステンションとしては、現在使われている一般的な拡張機能としては、KeyUsage (「署名専用」など、鍵の使用を特定の目的に制限する)、AlternativeNames (DNS 名、電子メールアドレス、IP アドレスなど、ほかのアイデンティティーを公開鍵に関連付けることができる) などがあります。拡張機能には、critical というマークを付けて、その拡張機能のチェックと使用を義務付けることができます。たとえば、critical とマークされ、KeyCertSign が設定された KeyUsage エクステンションが証明書に含まれている場合、この証明書を SSL 通信中に提示すると、証明書が拒否されます。これは、証明書のエクステンションによって、関連する非公開鍵が証明書の署名専用として指定されており、SSL では使用できないためです。
証明書のすべてのデータは、ASN.1/DER と呼ばれる 2 つの関連規格を使ってエンコードされます。Abstract Syntax Notation 1 はデータについて記述しています。Definite Encoding Rules は、データの保存および転送の方法について記述しています。この組み合わせは、「強力かつ柔軟」であると同時に「わかりにくく使いづらい」ものであると言われています。
IETF PKIX の作業班は、インターネット公開鍵インフラストラクチャー (PKI) の標準化を進めています。われわれはこの作業に常に注目しており、RFC 3280 で規定されている X.509 Certificate and CRL Profile をサポートします。
java.security.cert
にある Certificate API には、次のクラスとインタフェースが含まれています。
- CertificateFactory クラスは、証明書ファクトリの機能を定義します。証明書ファクトリは、エンコーディングから証明書のオブジェクト、証明書の取り消しリスト (CRL) のオブジェクト、および証明書パスのオブジェクトを生成するために使用されます。
- Certificate クラスは、さまざまな証明書を管理するための抽象クラスです。形式は異なっていても重要な共通の使用方法を備えた、証明書のための抽象化です。たとえば、X.509 と PGP などは異なる種類の証明書ですが、一般的な証明書の機能 (エンコードと検証など) と、公開鍵など一部の情報を共有しています。
- CRL クラスは、さまざまな証明書の取り消しリスト (CRL) を管理するための抽象クラスです。
- X509Certificate クラスは、X.509 証明書のための抽象クラスです。X.509 証明書のすべての属性にアクセスするための標準的な手段を提供します。
- X509Extension インタフェースは、X.509 拡張情報のためのインタフェースです。X.509 Version 3 の証明書および Version 2 の CRL に定義されている拡張情報は、付加属性をユーザーや公開鍵と関連付けるためのメカニズムを提供します。これは、証明書の階層や CRL の配布を管理するためのものです。
- X509CRL クラスは、X.509 証明書の取り消しリスト (CRL) のための抽象クラスです。CRL は、タイムスタンプの付いたリストで、取り消された証明書を示しています。CRL は証明書発行局 (CA) によって署名され、公開のリポジトリで自由に利用できるようになっています。
- X509CRLEntry クラスは、CRL のエントリのための抽象クラスです。
JDK 1.4 で、証明書の連鎖または証明書パスの構築および検証をサポートするために、新しいクラスが追加されました。これらのクラスの詳細は、
「PKI プログラマーズガイド」を参照してください。
keytool (
Solaris 用) (
Windows 用) という名前のツールがあり、このツールを使用すると、公開鍵と非公開鍵のペアや自己署名の X.509 Version 3 証明書を作成したり、キーストアを管理したりできます。鍵と証明書を使って、Java アプリケーションやアプレットにデジタル署名します (
jarsigner ツール (
Solaris 用) (
Windows 用) を参照)。
キーストアとは、鍵と証明書を保持する保護されたデータベースです。キーストアへのアクセスは、パスワードによって保護されます。キーストアのパスワードは、キーストアの作成時に作成者が定義し、変更できるのは、パスワードが現在設定されている場合にだけです。また、キーストアに含まれる非公開鍵は、それぞれのパスワードによって保護できます。
keytool を使用すると、ファイルとして格納されている X.509 v1、v2、および v3 の証明書の表示、インポート、およびエクスポートが可能で、自己署名による新しい v3 証明書を作成することもできます。具体的には、keytool のドキュメント (Solaris 用) (Windows 用) の「例」セクションを参照してください。