X.509 証明書と証明書の取り消しリスト (CRL)
最終更新日:2001 年 5 月 1 日
- 概要:証明書とは
- 証明書を使うアプリケーション
- 証明書の取得方法
- X.509 証明書の内容
- 証明書のアクセスと管理に使う Java API
- X.509 証明書の生成、表示、インポート、およびエクスポートのための Java ツール
「公開鍵証明書」とは、あるエンティティが発行したデジタル署名のある文書で、別のエンティティの公開鍵 (およびほかの情報) が特定の値であることを証明するものです。
以下では、いくつかの重要な用語について説明します。
- 公開鍵
- 公開鍵は、特定のエンティティに関連付けられた数です。公開鍵は、該当するエンティティとの間に信頼できる関係を持つ必要があるすべての人に対して公開することを意図したものです。公開鍵は、署名を検証するのに使われます。
- デジタル署名
- データが「デジタル署名」されると、そのデータは、エンティティの「アイデンティティ」と、そのエンティティがデータの内容について知っていることを証明する署名とともに格納されます。エンティティの非公開鍵を使って署名することで、データを偽造できなくなります。
- アイデンティティ
- エンティティを特定するための既知の方法です。システムによっては、公開鍵をアイデンティティにするものがあります。公開鍵のほかにも、Unix UID や電子メールアドレス、X.509 識別名など、さまざまなものをアイデンティティとすることができます。
- 署名
- 署名は、エンティティ (署名者) の非公開鍵を使い、あるデータに対して計算されるものです。
- 非公開鍵
- 非公開鍵は特定のエンティティだけが知っている数のことで、この数のことを、そのエンティティの非公開鍵といいます。非公開鍵は、ほかに知られないように秘密にしておくことが前提になっています。非公開鍵と公開鍵は、すべての公開鍵暗号化システムで対になって存在しています。DSA などの典型的な公開鍵暗号化システムの場合、1 つの非公開鍵は正確に 1 つの公開鍵に対応します。非公開鍵は、署名を計算するのに使われます。
- エンティティ
- エンテンティは、人、組織、プログラム、コンピュータ、企業、銀行など、一定の度合いで信頼の対象となるさまざまなものを指します。
公開鍵暗号化では、その性質上、ユーザの公開鍵にアクセスする必要があります。大規模なネットワーク環境では、互いに通信しているエンティティ間で以前の関係が引き続き確立されていると仮定したり、使われているすべての公開鍵を収めた信頼できるリポジトリが存在すると仮定したりすることは不可能です。このような公開鍵の配布に関する問題を解決するために証明書が考案されました。現在では、「証明書発行局 (CA)」が「信頼できる第三者」として機能します。CA は、信頼されて、ほかのエンティティのために証明書に署名する (証明書を発行する) エンティティ (ビジネスなど) です。CA だけが、法的な契約による義務の下で、有効かつ信頼できる証明書を作成するものと見なされています。 VeriSign、Thawte、Entrust をはじめ、多くの CA が存在します。Netscape や Microsoft の認証サーバ、Entrust の CA 製品などを所属組織内で利用すれば、独自の証明書発行局を運営することも可能です。
現在、X.509 証明書のアプリケーションでもっとも身近なものは、SSL プロトコルをサポートする Web ブラウザ (Netscape Navigator や Microsoft Internet Explorer など) です。SSL (Secure Socket Layer) は、ネットワークトラフィックにプライバシーと認証機能を提供するセキュリティプロトコルです。SSL をサポートするブラウザは、SSL をサポートする 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 証明書は、署名のほかに次のデータを含んでいます。
- バージョン
- 証明書に適用される X.509 規格のバージョンを特定します。証明書に指定できる情報は、バージョンによって異なります。これまでに、3 つのバージョンが定義されています。
- シリアル番号
- 証明書を作成したエンティティは、そのエンティティが発行するほかの証明書と区別するために、証明書にシリアル番号を割り当てます。この情報は、さまざまな方法で使われます。たとえば、証明書が取り消されると、シリアル番号が証明書の取り消しリスト (CRL) に格納されます。
- 署名アルゴリズム識別子
- 証明書に署名を付けるときに CA が使ったアルゴリズムを特定します。
- 発行者名
- 証明書に署名したエンティティの X.500 名です。エンティティは、通常は CA です。この証明書を使うことは、証明書に署名を付けたエンティティを信頼することを意味します。「ルート」つまり「トップレベル」の CA の証明書など、場合によっては発行者が自身の証明書に署名を付けることがある点に注意してください。
- 有効期間
- 各証明書は、限られた期間だけ有効になります。この期間は開始の日時と終了の日時によって指定され、数秒の短い期間から 100 年という長期にわたることもあります。選択される有効期間は、証明書への署名に使われる非公開鍵の強度や証明書に支払う金額など、さまざまな要因で異なります。有効期間は、使用する非公開鍵が損なわれない場合に、エンティティが公開鍵を信頼できると期待される期間です。
- プリンシパル名
- 証明書で公開鍵が識別されているエンティティの名前です。この名前は X.500 標準を使うので、インターネット全体で一意なものと想定されます。これは、エンティティの識別名 (DN) で、次に示すのはその例です。
CN=Java Duke, OU=Java Software Division, O=Sun Microsystems Inc, C=US
これらはそれぞれプリンシパルの通称、組織単位、組織、国を表します。
- プリンシパルの公開鍵情報
- 名前を付けられたエンティティの公開鍵とアルゴリズム識別子です。アルゴリズム識別子では、公開鍵に対して使われている公開鍵暗号化システムおよび関連する鍵パラメータが指定されています。
「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) の標準化を進めています。
われわれはこの作業に常に注目しており、規定されている「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 のエントリのための抽象クラスです。
keytool
( Solaris 用 ) ( Win32 用 )
このツールを使うと、公開鍵と非公開鍵のペアや自己署名の X.509 Version 1 証明書を作成したり、キーストアを管理したりできます。鍵と証明書を使って、Java アプリケーションやアプレットにデジタル署名します (jarsigner ツール (Solaris 用) (Win32 用) を参照)。
「キーストア」とは、特定の企業用の鍵と証明書を保持する、保護されたデータベースです。キーストアへのアクセスは、パスワードによって保護されます。キーストアのパスワードは、キーストアの作成時に作成者が定義し、変更できるのは、パスワードが現在設定されている場合にだけです。また、キーストアに含まれる非公開鍵は、それぞれのパスワードによって保護できます。
keytool を使うと、ファイルとして格納されている X.509 v1、v2、および v3 の証明書の表示、インポート、およびエクスポートが可能で、自己署名による新しい v1 証明書を作成することもできます。具体的には、keytool のドキュメント (Solaris 用) (Win32 用) の「例」を参照してください。