X.509証明書と証明書失効リスト(CRL)
- 概要: 証明書とは
- 証明書を使うアプリケーション
- 証明書の取得方法
- 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証明書のアプリケーションでもっとも身近なものは、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や、証明書署名要求の生成をサポートするブラウザなどのツールを使ってこの情報にデジタル署名し、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 v3の証明書およびv2のCRLに定義されている拡張情報は、付加属性をユーザーや公開鍵と関連付けるためのメカニズムを提供します。これは、証明書の階層やCRLの配布を管理するためのものです。
- X509CRLクラスは、X.509証明書失効リスト(CRL)のための抽象クラスです。CRLは、タイムスタンプの付いたリストで、取り消された証明書を示しています。これは証明書発行局(CA)によって署名され、公開のリポジトリで自由に利用できるようになっています。
- X509CRLEntryクラスは、CRLのエントリのための抽象クラスです。
JDK 1.4で、証明書の連鎖または証明書パスの構築および検証をサポートするために、新しいクラスが追加されました。これらのクラスの詳細は、
「PKIプログラマーズ・ガイド」を参照してください。
keytool (
Solaris、LinuxまたはMac OS X用、
Windows用)という名前のツールがあり、このツールを使用すると、公開鍵と非公開鍵のペアや自己署名のX.509 v3証明書を作成したり、キーストアを管理したりできます。鍵と証明書を使って、Javaアプリケーションやアプレットにデジタル署名します(
jarsignerツール(
Solaris、LinuxまたはMac OS X用、
Windows用)を参照)。
キーストアとは、鍵と証明書を保持する保護されたデータベースです。キーストアへのアクセスは、パスワードによって保護されます。キーストアのパスワードは、キーストアの作成時に作成者が定義し、変更できるのは、現在のパスワードを指定した場合のみです。また、キーストアに含まれる各非公開鍵は、それぞれのパスワードによって保護できます。
keytoolを使用すると、ファイルとして格納されているX.509 v1、v2、およびv3の証明書の表示、インポート、およびエクスポートが可能で、自己署名による新しいv3証明書を作成することもできます。具体的には、keytoolのドキュメント(Solaris、LinuxまたはMac OS X用、Windows用)の「例」の項を参照してください。