keytool - 鍵と証明書の管理ツール

暗号化鍵、X.509 証明書チェーン、および信頼できる証明書を含むキーストア (データベース) を管理します。

形式

keytool [ commands ]

Java SE 6 で keytool のコマンドインタフェースが変更されました。 詳細については「変更点」の節を参照してください。以前に定義されたコマンドも引き続きサポートされています。

説明

keytool は、鍵と証明書を管理するためのユーティリティーです。keytool を使うと、自分の公開鍵と非公開鍵のペア、および関連する証明書を管理し、デジタル署名を使った自己認証 (ほかのユーザーまたはサービスに対して自分自身を認証すること) や、データの整合性と証明書に関するサービスを利用することができます。keytool では、通信相手の公開鍵を (証明書の形で) キャッシュすることもできます。

「証明書」とは、あるエンティティー (人物、会社など) からのデジタル署名付きの文書のことです。 証明書には、ほかのあるエンティティーの公開鍵 (およびその他の情報) が特別な値を持っていることが書かれています(「証明書」を参照)。データにデジタル署名が付いている場合は、デジタル署名を検証することで、データの整合性およびデータが本物であることをチェックできます。データの「整合性」とは、データが変更されたり、改変されたりしていないことを意味します。 また、データが「本物である」とは、そのデータが、データを作成して署名したと称する人物から実際に渡されたデータであることを意味します。

また、keytool を使えば、DES などの対称暗号化/復号化で使用される秘密鍵を管理することもできます。

keytool は、鍵と証明書を「キーストア」に格納します。

コマンドとオプションに関する注

以下では、コマンドとそのオプションについて説明します。注:

オプションのデフォルト値

オプションのデフォルト値は、次のとおりです。
-alias "mykey"

-keyalg
    "DSA" (-genkeypair を使用している場合)
    "DES" (-genseckey を使用している場合)

-keysize
    1024 (-genkeypair を使用している場合)
    56 (-genseckey を使用していて -keyalg が "DES" の場合)
    168 (-genseckey を使用していて -keyalg が "DESede" の場合)

-validity 90

-keystore ユーザーのホームディレクトリの .keystore というファイル

-storetype セキュリティープロパティーファイルの「keystore.type」プロパティーの値で、
           java.security.KeyStore の静的な getDefaultType メソッドから返される

-file 読み込みの場合は標準入力、書き込みの場合は標準出力

-protected false

公開/非公開鍵ペアの生成において、署名アルゴリズム (-sigalg オプション) は、基になる非公開鍵のアルゴリズムから派生します。基になる非公開鍵が DSA タイプである場合、-sigalg オプションのデフォルト値は SHA1withDSA になり、基になる非公開鍵が RSA タイプである場合は、-sigalg オプションのデフォルト値は MD5withRSA になります。選択可能な -keyalg および -sigalg の完全な一覧については、「Java Cryptography Architecture API Specification & Reference」を参照してください。

一般オプション

-v オプションは、-help コマンドを除くすべてのコマンドで使用できます。このオプションを指定した場合、コマンドは「冗長」モードで実行され、詳細な証明書情報が出力されます。

また、-Jjavaoption オプションも、任意のコマンドで使用できます。このオプションを指定した場合、指定された javaoption 文字列が Java インタプリタに直接渡されます。このオプションには、空白を含めることはできません。このオプションは、実行環境またはメモリー使用を調整する場合に便利です。指定できるインタプリタオプションを一覧表示するには、コマンド行で java -h または java -X と入力してください。

次のオプションは、キーストアに対する操作を行うすべてのコマンドで指定できます。

-storetype storetype
この修飾子は、インスタンスを生成するキーストアのタイプを指定します。

-keystore keystore
キーストアの場所を指定します。

特定の keytool コマンドを実行する際に、JKS ストアタイプが使用され、かつキーストアファイルがまだ存在していなかった場合、新しいキーストアファイルが作成されます。たとえば、keytool -genkeypair の実行時に -keystore オプションが指定されなかった場合、.keystore という名前のデフォルトキーストアファイルがユーザーのホームディレクトリ内にまだ存在していなければ、そこに作成されます。同様に、-keystore ks_file というオプションが指定されてもその ks_file が存在しなかった場合、そのファイルが作成されます。

-keystore オプションからの入力ストリームは、KeyStore.load メソッドに渡されます。URL として NONE が指定されている場合は、null のストリームが KeyStore.load メソッドに渡されます。NONE は、KeyStore がファイルベースではなく、たとえば、ハードウェアトークンデバイスに置かれている場合に指定します。

-storepass storepass
キーストアの整合性を保護するために使うパスワードを指定します。

storepass は、6 文字以上にする必要があります。指定したパスワードは、キーストアの内容にアクセスするすべてのコマンドで使われます。この種のコマンドを実行するときに、コマンド行で -storepass オプションを指定しなかった場合は、パスワードの入力を求められます。

キーストアから情報を取り出す場合は、パスワードを省略できます。 パスワードを省略すると、取り出す情報の整合性をチェックできないので、警告が表示されます。

-providerName provider_name
セキュリティープロパティーファイル内に含まれる暗号化サービスプロバイダ名を特定するために使用されます。

-providerClass provider_class_name
暗号化サービスプロバイダがセキュリティープロパティーファイルに指定されていないときは、そのマスタークラスファイルの名前を指定するときに使われます。

-providerArg provider_arg
-providerClass と組み合わせて使用します。provider_class_name のコンストラクタに対する省略可能な文字列入力引数を表します。

-protected
true または false のいずれか。専用 PIN リーダーなどの保護された認証パスを介してパスワードを指定する必要がある場合には、この値に true を指定してください。

コマンド

キーストアへのデータの作成または追加

-genkeypair {-alias alias} {-keyalg keyalg} {-keysize keysize} {-sigalg sigalg} [-dname dname] [-keypass keypass] {-validity valDays} {-storetype storetype} {-keystore keystore} [-storepass storepass] {-providerClass provider_class_name {-providerArg provider_arg}} {-v} {-protected} {-Jjavaoption}

鍵のペア (公開鍵および関連する非公開鍵) を生成します。公開鍵は X.509 v3 自己署名証明書でラップされます。 証明書は、単一の要素を持つ証明書チェーンとして格納されます。この証明書チェーンと非公開鍵は、alias で特定される新しいキーストアエントリに格納されます。

keyalg には、鍵のペアを生成するのに使うアルゴリズムを指定し、keysize には、生成する各鍵のサイズを指定します。 sigalg には、自己署名証明書に署名を付けるときに使うアルゴリズムを指定します。このアルゴリズムは、keyalg と互換性のあるものでなければなりません。

dname には、alias に関連付け、自己署名証明書の issuer フィールドと subject フィールドとして使う X.500 識別名を指定します。コマンド行で識別名を指定しなかった場合は、識別名の入力を求められます。

keypass には、生成される鍵のペアのうち、非公開鍵を保護するのに使うパスワードを指定します。パスワードを指定しなかった場合、ユーザーはその入力求められます。このとき、Return キーを押すと、キーストアのパスワードと同じパスワードが鍵のパスワードに設定されます。 keypass は、6 文字以上でなければなりません。

valDays には、証明書の有効日数を指定します。

このコマンドは、以前のリリースでは -genkey という名前でした。この古い名前は、このリリースでも引き続きサポートされており、今後のリリースでもサポートされる予定です。ただし、今後はわかりやすいように、新しい名前 -genkeypair を使用することをお勧めします。

-genseckey {-alias alias} {-keyalg keyalg} {-keysize keysize} [-keypass keypass] {-storetype storetype} {-keystore keystore} [-storepass storepass] {-providerClass provider_class_name {-providerArg provider_arg}} {-v} {-protected} {-Jjavaoption}

秘密鍵を生成し、それを alias で特定される新しい KeyStore.SecretKeyEntry 内に格納します。

keyalg は秘密鍵の生成に使用するアルゴリズムを、keysize は生成する鍵のサイズを、それぞれ指定します。keypass は秘密鍵の保護に使用するパスワードです。パスワードを指定しなかった場合、ユーザーはその入力求められます。このとき、Return キーを押すと、キーストアのパスワードと同じパスワードが鍵のパスワードに設定されます。 keypass は、6 文字以上でなければなりません。

-importcert {-alias alias} {-file cert_file} [-keypass keypass] {-noprompt} {-trustcacerts} {-storetype storetype} {-keystore keystore} [-storepass storepass] {-providerName provider_name} {-providerClass provider_class_name {-providerArg provider_arg}} {-v} {-protected} {-Jjavaoption}

ファイル cert_file から証明書または証明書チェーン (証明書チェーンの場合は、PKCS#7 形式の応答で提供されるもの) を読み込み、alias によって特定されるキーストアエントリに格納します。ファイルが指定されていない場合は、標準入力から証明書または PKCS#7 応答を読み込みます。

keytool では、X.509 v1、v2、v3 の証明書、および、PKCS#7 形式の証明書から構成されている PKCS#7 形式の証明書チェーンをインポートできます。インポートするデータは、バイナリ符号化方式、または出力可能符号化方式 (Base64 符号化とも呼ばれる) のどちらかで提供する必要があります。 出力可能符号化方式は、インターネット RFC 1421 証明書符号化規格で定義されています。この符号化方式の場合、証明書は「-----BEGIN」で始まる文字列で開始され、「-----END」で始まる文字列で終了しなければなりません。

証明書のインポートには、次の 2 つの目的があります。

  1. 信頼できる証明書のリストに証明書を追加する

  2. CA に証明書署名要求 (-certreq コマンドを参照) を送信した結果として、CA から受け取った証明応答をインポートする

どちらの種類のインポートを行うかは、-alias オプションの値によって指定します。

  1. 別名がキーエントリをポイントしない場合keytool はユーザーが信頼できる証明書エントリを追加しようとしているものと見なします。この場合、別名がキーストア内にすでに存在していてはいけません。別名がすでに存在している場合、その別名の信頼できる証明書がすでに存在することになるので、keytool はエラーを出力し、証明書のインポートを行いません。

  2. 別名がキーエントリをポイントしない場合keytool はユーザーが信頼できる証明書エントリを追加しようとしているものと見なします。

新しい信頼できる証明書のインポート

keytool は、キーストアに証明書を追加する前に、キーストア内にすでに存在する信頼できる証明書を使って、インポートする証明書から (ルート CA の) 自己署名証明書に至るまでの信頼のチェーンの構築を試みます。

-trustcacerts オプションを指定した場合、追加の証明書は信頼できるすなわち cacerts という名前のファイルに含まれる証明書のチェーンと見なされます。

keytool が、インポートする証明書から自己署名証明書 (キーストアまたは cacerts ファイルに含まれている自己署名証明書) に至るまでの信頼のパスの構築に失敗した場合は、インポートする証明書の情報を表示し、ユーザーに確認を求めます。 この場合は、表示された証明書のフィンガープリントと、ほかのなんらかの (信頼できる) 情報源 (証明書の所有者本人など) から入手したフィンガープリントとを比較します。「信頼できる証明書」として証明書をインポートするときは、証明書が有効であることを慎重に確認する必要があります。詳細は、「信頼できる証明書のインポートに関する注意事項」を参照してください。インポート操作は、証明書を確認する時点で中止できます。ただし、-noprompt オプションが指定されている場合、ユーザーとの対話は行われません。

証明応答のインポート

「証明応答」をインポートするときは、キーストア内の信頼できる証明書、および (-trustcacerts オプションが指定されている場合は) cacerts キーストアファイルで構成された証明書を使って証明応答が検査されます。

証明応答が信頼できるかどうかを決定する方法は次のとおりです。

  • 証明応答が単一の X.509 証明書である場合keytool は、証明応答から (ルート CA の) 自己署名証明書に至るまでの信頼チェーンの確立を試みます。証明応答と、証明応答の認証に使われる証明書の階層構造は、alias の新しい証明書チェーンを形成します。信頼チェーンが確立されない場合、証明応答はインポートされません。この場合、keytool は証明書を出力せず、ユーザーに検証を求めるプロンプトを表示します。 ユーザーが証明応答の信頼性を判断するのは、不可能ではなくても非常に困難だからです。

  • 証明応答が PKCS#7 形式の証明書チェーンである場合keytool は、まずチェーンを並べ替えて、ユーザーの証明書が最初に、ルート CA の自己署名証明書が最後にくるようにしたあと、証明応答に含まれるルート CA の証明書と、キーストア内または (-trustcacerts オプションが指定されている場合は) cacerts キーストアファイル内の信頼できる証明書とをすべて比較し、一致するものがあるかどうかを調べます。一致するものが見つからなかった場合は、ルート CA の証明書の情報を表示し、ユーザーに確認を求めます。 この場合は、表示された証明書のフィンガープリントと、ほかのなんらかの (信頼できる) 情報源 (ルート CA 自身など) から入手したフィンガープリントとを比較します。インポート操作は、証明書を確認する時点で中止できます。ただし、-noprompt オプションが指定されている場合、ユーザーとの対話は行われません。

証明書応答内の公開鍵が alias の下にすでに格納されているユーザーの公開鍵に一致した場合、古い証明書チェーンが応答内の新しい証明書チェーンで置き換えられます。以前の証明書チェーンを新しい証明書チェーンで置き換えることができるのは、有効な keypass、つまり該当するエントリの非公開鍵を保護するためのパスワードを指定した場合だけです。パスワードを指定しておらず、非公開鍵のパスワードがキーストアのパスワードと異なる場合は、非公開鍵のパスワードの入力を求められます。

このコマンドは、以前のリリースでは -import という名前でした。この古い名前は、このリリースでも引き続きサポートされており、今後のリリースでもサポートされる予定です。ただし、今後はわかりやすいように、新しい名前 -importcert を使用することをお勧めします。

-importkeystore -srckeystore srckeystore -destkeystore destkeystore {-srcstoretype srcstoretype} {-deststoretype deststoretype} [-srcstorepass srcstorepass] [-deststorepass deststorepass] {-srcprotected} {-destprotected} {-srcalias srcalias {-destalias destalias} [-srckeypass srckeypass] [-destkeypass destkeypass] } {-noprompt} {-srcProviderName src_provider_name} {-destProviderName dest_provider_name} {-providerClass provider_class_name {-providerArg provider_arg}} {-v} {-protected} {-Jjavaoption}

ソースキーストアからターゲットキーストアへ、単一のエントリまたはすべてのエントリをインポートします。

srcalias オプションが指定された場合、このコマンドは、その別名で特定される単一のエントリをターゲットキーストアにインポートします。destalias 経由でターゲット別名が指定されなかった場合、srcalias がターゲット別名として使用されます。ソースのエントリがパスワードで保護されていた場合、srckeypass を使ってそのエントリが回復されます。srckeypass が指定されなかった場合、keytoolsrcstorepass を使ってそのエントリを回復しようとします。srcstorepass が指定されなかったか正しくなかった場合、ユーザーはパスワードの入力を求められます。ターゲットエントリは destkeypass によって保護されます。destkeypass が指定されなかった場合、ターゲットエントリはソースエントリのパスワードによって保護されます。

srcalias オプションが指定されなかった場合、ソースキーストア内のすべてのエントリがターゲットキーストア内にインポートされます。各ターゲットエントリは対応するソースエントリの別名の下に格納されます。ソースのエントリがパスワードで保護されていた場合、srcstorepass を使ってそのエントリが回復されます。srcstorepass が指定されなかったか正しくなかった場合、ユーザーはパスワードの入力を求められます。ソースキーストア内のあるエントリタイプがターゲットキーストアでサポートされていない場合や、あるエントリをターゲットキーストアに格納する際にエラーが発生した場合、ユーザーはそのエントリをスキップして処理を続行するか、あるいは処理を中断するかの選択を求められます。ターゲットエントリはソースエントリのパスワードによって保護されます。

ターゲット別名がターゲットキーストア内にすでに存在していた場合、ユーザーは、そのエントリを上書きするか、あるいは異なる別名の下で新しいエントリを作成するかの選択を求められます。

-noprompt を指定した場合、ユーザーは新しいターゲット別名の入力を求められません。既存のエントリはそのターゲット別名で自動的に上書きされます。最後に、インポートできないエントリは自動的にスキップされ、警告が出力されます。

データのエクスポート

-certreq {-alias alias} {-sigalg sigalg} {-file certreq_file} [-keypass keypass] {-storetype storetype} {-keystore keystore} [-storepass storepass] {-providerName provider_name} {-providerClass provider_class_name {-providerArg provider_arg}} {-v} {-protected} {-Jjavaoption}

PKCS#10 形式を使って証明書署名要求 (CSR) を生成します。

CSR は、証明書発行局 (CA) に送信することを目的としたものです。CA は、証明書要求者を (通常はオフラインで) 認証し、証明書または証明書チェーンを送り返します。 この証明書または証明書チェーンは、キーストア内の既存の証明書チェーン (最初は 1 つの自己署名証明書から構成される) に置き換えて使います。

alias に関連付けられた非公開鍵と X.500 識別名は、PKCS#10 証明書要求を作成するのに使われます。非公開鍵はキーストア内ではパスワードによって保護されているので、非公開鍵にアクセスするには、適切なパスワードを提供する必要があります。コマンド行で keypass を指定しておらず、非公開鍵のパスワードがキーストアのパスワードと異なる場合は、非公開鍵のパスワードの入力を求められます。

sigalg には、CSR に署名を付けるときに使うアルゴリズムを指定します。

CSR は、ファイル certreq_file に格納されます。ファイルが指定されていない場合は、標準出力に CSR が出力されます。

CA からの応答をインポートするには、importcert コマンドを使います。

-exportcert {-alias alias} {-file cert_file} {-storetype storetype} {-keystore keystore} [-storepass storepass] {-providerName provider_name} {-providerClass provider_class_name {-providerArg provider_arg}} {-rfc} {-v} {-protected} {-Jjavaoption}

alias に関連付けられた証明書を (キーストアから) 読み込み、ファイル cert_file に格納します。

ファイルが指定されていない場合は、標準出力に証明書が出力されます。

デフォルトでは、バイナリ符号化方式の証明書が出力されます。 ただし、-rfc オプションを指定した場合は、出力可能符号化方式の証明書が出力されます。 出力可能符号化方式は、インターネット RFC 1421 証明書符号化規格で定義されています。

alias が、信頼できる証明書を参照している場合は、該当する証明書が出力されます。それ以外の場合、alias は、関連付けられた証明書チェーンを持つ鍵エントリを参照します。この場合は、チェーン内の最初の証明書が返されます。この証明書は、alias によって表されるエンティティーの公開鍵を認証する証明書です。

このコマンドは、以前のリリースでは -export という名前でした。この古い名前は、このリリースでも引き続きサポートされており、今後のリリースでもサポートされる予定です。ただし、今後はわかりやすいように、新しい名前 -exportcert を使用することをお勧めします。

データの表示

-list {-alias alias} {-storetype storetype} {-keystore keystore} [-storepass storepass] {-providerName provider_name} {-providerClass provider_class_name {-providerArg provider_arg}} {-v | -rfc} {-protected} {-Jjavaoption}

alias で特定されるキーストアエントリの内容を (標準出力に) 出力します。別名が指定されていない場合は、キーストア全体の内容が表示されます。

このコマンドは、デフォルトでは証明書の MD5 フィンガープリントを表示します。-v オプションが指定されている場合は、所有者、発行者、シリアル番号、拡張機能などの付加的な情報とともに、人間が読むことのできる形式で証明書が表示されます。-rfc オプションが指定されている場合は、出力可能符号化方式で証明書の内容が表示されます。 出力可能符号化方式は、インターネット RFC 1421 証明書符号化規格で定義されています。

-v オプションと -rfc オプションとを同時に指定することはできません。

-printcert {-file cert_file} {-v} {-Jjavaoption}

ファイル cert_file から証明書を読み込み、人間が読むことのできる形式で証明書の内容を表示します。ファイルが指定されていない場合は、標準入力から証明書を読み込みます。

証明書は、バイナリ符号化方式または出力可能符号化方式で表示できます。出力可能符号化方式は、インターネット RFC 1421 証明書符号化規格で定義されています。

注:このコマンドはキーストアとは関係なく動作します。

キーストアの管理

-storepasswd [-new new_storepass] {-storetype storetype} {-keystore keystore} [-storepass storepass] {-providerName provider_name} {-providerClass provider_class_name {-providerArg provider_arg}} {-v} {-Jjavaoption}

キーストアの内容の整合性を保護するために使うパスワードを変更します。new_storepass には、新しいパスワードを指定します。 new_storepass は、6 文字以上でなければなりません。

-keypasswd {-alias alias} [-keypass old_keypass] [-new new_keypass] {-storetype storetype} {-keystore keystore} [-storepass storepass] {-providerName provider_name} {-providerClass provider_class_name {-providerArg provider_arg}} {-v} {-Jjavaoption}

alias によって特定される非公開/秘密鍵を保護するためのパスワードを、old_keypass から new_keypass に変更します。 new_keypass は、6 文字以上でなければなりません。

コマンド行で -keypass オプションを指定しておらず、鍵のパスワードがキーストアのパスワードと異なる場合は、鍵のパスワードの入力を求められます。

コマンド行で -new オプションを指定しなかった場合は、新しいパスワードの入力を求められます。

-delete [-alias alias] {-storetype storetype} {-keystore keystore} [-storepass storepass] {-providerName provider_name} {-providerClass provider_class_name {-providerArg provider_arg}} {-v} {-protected} {-Jjavaoption}

alias によって特定されるエントリをキーストアから削除します。コマンド行で別名を指定しなかった場合は、別名の入力を求められます。

-changealias {-alias alias} [-destalias destalias] [-keypass keypass] {-storetype storetype} {-keystore keystore} [-storepass storepass] {-providerName provider_name} {-providerClass provider_class_name {-providerArg provider_arg}} {-v} {-protected} {-Jjavaoption}

指定された alias から新しい別名 destalias へ、既存のキーストアエントリを移動します。ターゲット別名が指定されなかった場合、このコマンドはその入力を求めます。元のエントリがエントリパスワードで保護されていた場合、「-keypass」オプション経由でそのパスワードを指定できます。鍵パスワードが指定されなかった場合、storepass (指定された場合) がまず試みられます。その試みが失敗すると、ユーザーはパスワードの入力を求められます。

ヘルプの表示

-help

基本的なコマンドとそのオプションの一覧を表示します。

ここでは、自分の鍵のペアおよび信頼できるエンティティーからの証明書を管理するためのキーストアを作成する場合を例として示します。

鍵のペアの生成

まず、キーストアを作成して鍵のペアを生成する必要があります。次に示すのは、実行するコマンドの例です。

    keytool -genkeypair -dname "cn=Mark Jones, ou=JavaSoft, o=Sun, c=US"
      -alias business -keypass kpi135 -keystore /working/mykeystore
      -storepass ab987c -validity 180

注:このコマンドは 1 行に入力しなければなりません。例で複数行に入力しているのは読みやすくするためです。

この例では、working ディレクトリに mykeystore という名前のキーストアを作成し (キーストアはまだ存在していないと仮定する)、作成したキーストアにパスワード ab987c を割り当てます。生成する公開鍵と非公開鍵のペアに対応するエンティティーの「識別名」は、通称が「Mark Jones」、組織単位が「JavaSoft」、組織が「Sun」、2 文字の国番号が「US」です。公開鍵と非公開鍵のサイズはどちらも 1024 ビットで、鍵の作成にはデフォルトの DSA 鍵生成アルゴリズムを使用します。

このコマンドは、公開鍵と識別名情報を含む自己署名証明書 (デフォルトの SHA1withDSA 署名アルゴリズムを使用) を作成します。証明書の有効期間は 180 日です。 証明書は、別名「business」で特定されるキーストアエントリ内の非公開鍵に関連付けられます。非公開鍵にはパスワード「kpi135」が割り当てられます。

オプションのデフォルト値を使う場合は、上に示したコマンドを大幅に短くすることができます。実際には、オプションを 1 つも指定せずにコマンドを実行することも可能です。 デフォルト値を持つオプションでは、オプションを指定しなければデフォルト値が使われ、必要な値については入力を求められます。たとえば、単に次のように入力することもできます。

    keytool -genkeypair
この場合は、mykey という別名でキーストアエントリが作成され、新しく生成された鍵のペア、および 90 日間有効な証明書がこのエントリに格納されます。このエントリは、ホームディレクトリ内の .keystore という名前のキーストアに置かれます。このキーストアがまだ存在していない場合は、作成されます。識別名情報、キーストアのパスワード、および非公開鍵のパスワードについては、入力を求められます。

以下では、オプションを指定しないで -genkeypair コマンドを実行したものとして例を示します。 情報の入力を求められた場合は、最初に示した -genkeypair コマンドの値を入力したものとします (たとえば、非公開鍵のパスワードには kpi135 と指定)。

証明書発行局に対する署名付き証明書の要求

現時点で手元にあるのは、1 通の自己署名証明書だけです。証明書に証明書発行局 (CA) の署名が付いていれば、ほかのユーザーから証明書が信頼できる可能性も高くなります。CA の署名を取得するには、まず、証明書署名要求 (CSR) を生成します。 たとえば、次のようにします。

    keytool -certreq -file MarkJ.csr
CSR (デフォルト別名「mykey」によって特定されるエンティティーの CSR) が作成され、MarkJ.csr という名前のファイルに置かれます。このファイルは、VeriSign などの CA に提出します。 CA は要求者を (通常はオフラインで) 認証し、要求者の公開鍵を認証した署名付きの証明書を送り返します。場合によっては、CA が証明書のチェーンを返すこともあります。 証明書のチェーンでは、各証明書がチェーン内のその前の署名者の公開鍵を認証します。

CA からの証明書のインポート

作成した自己署名証明書は、証明書チェーンで置き換える必要があります。 証明書チェーンでは、各証明書が、「ルート」CA を起点とするチェーン内の次の証明書の署名者の公開鍵を認証します。

CA からの証明応答をインポートするには、キーストアか、(importcert コマンド で説明しているように) cacerts キーストアファイル内に 1 つ以上の「信頼できる証明書」がある必要があります。

cacerts キーストアファイルは、5 つの VeriSign ルート CA 証明書を含んだ状態で出荷されているので、VeriSign の証明書を、信頼できる証明書としてキーストア内にインポートする必要はないかもしれません。ただし、ほかの CA に対して署名付き証明書を要求していて、この CA の公開鍵を認証する証明書が、cacerts にまだ追加されていない場合は、該当する CA からの証明書を、「信頼できる証明書」としてインポートする必要があります。

通常、CA からの証明書は、自己署名証明書、またはほかの CA によって署名された証明書です (後者の場合は、該当するほかの CA の公開鍵を認証する証明書も必要)。たとえば、ABC という企業が CA だとします。 このとき、この CA の公開鍵を認証する自己署名証明書と考えられる ABCCA.cer という名前のファイルを、ABC から入手したとします。

「信頼できる証明書」として証明書をインポートするときは、証明書が有効であることを慎重に確認する必要があります。まず、証明書の内容を表示し (keytool -printcert コマンドを使用するか、または -noprompt オプションを指定しないで keytool -importcert コマンドを使用)、表示された証明書のフィンガープリントが、期待されるフィンガープリントと一致するかどうかを確認します。証明書を送信した人物に連絡し、この人物が提示した (または安全な公開鍵のリポジトリによって提示される) フィンガープリントと、上のコマンドで表示されたフィンガープリントとを比較します。フィンガープリントが一致すれば、送信途中でほかの何者か (攻撃者など) による証明書のすり替えが行われていないことを確認できます。送信途中でこの種の攻撃が行われていた場合、チェックを行わずに証明書をインポートすると、攻撃者によって署名されたすべてのものを信頼することになります。

ABCCA.cer を有効な証明書として信頼する場合は、証明書をキーストアに追加できます。 たとえば、次のようにします。

    keytool -importcert -alias abc -file ABCCA.cer
ABCCA.cer ファイルのデータを含む「信頼できる証明書」のエントリがキーストア内に作成され、該当するエントリに abc という別名が割り当てられます。

CA からの証明応答のインポート

証明書署名要求の提出先の CA の公開鍵を認証する証明書をインポートしたあとは (または同種の証明書がすでに cacerts ファイル内に存在している場合は)、証明応答をインポートし、自己署名証明書を証明書チェーンで置き換えることができます。この証明書チェーンは、CA の応答がチェーンの場合、証明書署名要求に対する応答として CA から送り返された証明書チェーンです。 また、CA の応答が単一の証明書の場合は、この証明応答と、インポート先のキーストア内または cacerts キーストアファイル内にすでに存在する信頼できる証明書とを使って構築した証明書チェーンです。

たとえば、証明書署名要求を VeriSign に送信したとします。送り返された証明書の名前が VSMarkJ.cer だとすると、次のようにして応答をインポートできます。

    keytool -importcert -trustcacerts -file VSMarkJ.cer

公開鍵を認証する証明書のエクスポート

たとえば、jarsigner を使って Java ARchive (JAR) ファイルに署名したとします。この JAR ファイルはクライアントによって使われますが、クライアント側では署名を認証したいと考えています。

クライアントが署名を認証する方法の 1 つに、まず自分の公開鍵の証明書を「信頼できる」エントリとしてクライアントのキーストアにインポートする方法があります。そのためには、証明書をエクスポートして、クライアントに提供します。たとえば、次のようにして、証明書を MJ.cer という名前のファイルにコピーします。 このエントリには「mykey」という別名が使われているとします。

    keytool -exportcert -alias mykey -file MJ.cer
証明書と署名付き JAR ファイルを入手したクライアントは、jarsigner ツールを使って署名を認証できます。

キーストアのインポート

コマンド「importkeystore」を使えば、あるキーストアの全体を別のキーストア内にインポートできます。 これは、鍵や証明書といったソースキーストア内のすべてのエントリが、単一のコマンドを使ってターゲットキーストア内にインポートされることを意味します。このコマンドを使えば、異なるタイプのキーストア内に含まれるエントリをインポートすることができます。インポート時には、ターゲットキーストア内の新しいエントリはすべて、元と同じ別名および (秘密鍵や非公開鍵の場合は) 保護用パスワードを持ちます。ソースキーストア内の非公開鍵や秘密鍵の回復時に問題が発生した場合、keytool はユーザーにパスワードの入力を求めます。このコマンドは、別名の重複を検出すると、ユーザーに新しい別名の入力を求めます。 ユーザーは、新しい別名を指定することも、単純に既存の別名の上書きを keytool に許可することもできます。

たとえば、通常の JKS タイプのキーストア key.jks 内のエントリを PKCS #11 タイプのハードウェアベースのキーストア内にインポートするには、次のコマンドを使用できます。

keytool -importkeystore
    -srckeystore key.jks -destkeystore NONE
    -srcstoretype JKS -deststoretype PKCS11
    -srcstorepass changeit -deststorepass topsecret

また、importkeystore コマンドを使えば、あるソースキーストア内の単一のエントリをターゲットキーストアにインポートすることもできます。この場合、上記の例で示したオプションに加え、インポート対象となる別名を指定する必要があります。srcalias オプションを指定する場合には、ターゲット別名もコマンド行から指定できるほか、秘密/非公開鍵の保護用パスワードやターゲット保護用パスワードも指定できます。そうすれば、プロンプトのまったく表示されない keytool コマンドを発行できます。これは、keytool コマンドをスクリプトファイルに含める際に非常に便利です。 次に例を示します。

keytool -importkeystore
    -srckeystore key.jks -destkeystore NONE
    -srcstoretype JKS -deststoretype PKCS11
    -srcstorepass changeit -deststorepass topsecret
    -srcalias myprivatekey -destalias myoldprivatekey
    -srckeypass oldkeypass -destkeypass mynewkeypass
    -noprompt

用語と警告

キーストア

キーストアは、暗号化の鍵と証明書を格納するための機能です。

証明書

証明書 (公開鍵証明書とも呼ぶ) とは、あるエンティティー (「発行者」) からのデジタル署名付きの文書のことです。 証明書には、ほかのあるエンティティー (「署名者」) の公開鍵 (およびその他の情報) が特別な値を持っていることが書かれています。

X.500 識別名

X.500 識別名は、エンティティーを特定するために使われます。 たとえば、X.509 証明書の subject フィールドと issuer (署名者) フィールドで指定される名前は、X.500 識別名です。 keytool は、次のサブパートをサポートしています。

-genkeypair コマンド-dname オプションの値として識別名文字列を指定する場合は、次の形式で指定する必要があります。

CN=cName, OU=orgUnit, O=org, L=city, S=state, C=countryCode

イタリック体の項目は、実際に指定する値を表します。 短縮形のキーワードの意味は、次のとおりです。

	CN=commonName
	OU=organizationUnit
	O=organizationName
	L=localityName
	S=stateName
	C=country

次に示すのは、識別名文字列の例です。

CN=Mark Smith, OU=JavaSoft, O=Sun, L=Cupertino, S=California, C=US
次は、この文字列を使ったコマンドの例です。
keytool -genkeypair -dname "CN=Mark Smith, OU=JavaSoft, O=Sun, L=Cupertino,
S=California, C=US" -alias mark

キーワードの短縮形では、大文字と小文字は区別されません。たとえば、CN、cn、および Cn は、どれも同じものとして扱われます。

一方、キーワードの指定順序には意味があり、各サブコンポーネントは上に示した順序で指定する必要があります。ただし、サブコンポーネントをすべて指定する必要はありません。たとえば、次のように一部のサブコンポーネントだけを指定できます。

CN=Steve Meier, OU=SunSoft, O=Sun, C=US

識別名文字列の値にコンマが含まれる場合に、コマンド行で文字列を指定するときには、次のようにコンマを文字 \ でエスケープする必要があります。

   cn=peter schuster, o=Sun Microsystems\, Inc., o=sun, c=us

識別名文字列をコマンド行で指定する必要はありません。識別名を必要とするコマンドを実行するときに、コマンド行で識別名を指定しなかった場合は、各サブコンポーネントの入力を求められます。この場合は、コンマを文字 \ でエスケープする必要はありません。

信頼できる証明書のインポートに関する注意事項

重要:信頼できる証明書として証明書をインポートする前に、証明書の内容を慎重に調べてください。

まず、証明書の内容を表示し (-printcert コマンドを使用するか、または -noprompt オプションを指定しないで -import コマンドを使用)、表示された証明書のフィンガープリントが、期待されるフィンガープリントと一致するかどうかを確認します。たとえば、あるユーザーから証明書が送られてきて、この証明書を /tmp/cert という名前でファイルに格納しているとします。この場合は、信頼できる証明書のリストにこの証明書を追加する前に、-printcert コマンドを実行してフィンガープリントを表示できます。 たとえば、次のようにします。

  keytool -printcert -file /tmp/cert
    Owner: CN=ll, OU=ll, O=ll, L=ll, S=ll, C=ll
    Issuer: CN=ll, OU=ll, O=ll, L=ll, S=ll, C=ll
    Serial Number: 59092b34
    Valid from: Thu Sep 25 18:01:13 PDT 1997 until: Wed Dec 24 17:01:13 PST 1997
    Certificate Fingerprints:
         MD5:  11:81:AD:92:C8:E5:0E:A2:01:2E:D4:7A:D7:5F:07:6F
         SHA1: 20:B6:17:FA:EF:E5:55:8A:D0:71:1F:E8:D6:9D:C0:37:13:0E:5E:FE
次に、証明書を送信した人物に連絡し、この人物が提示したフィンガープリントと、上のコマンドで表示されたフィンガープリントとを比較します。フィンガープリントが一致すれば、送信途中でほかの何者か (攻撃者など) による証明書のすり替えが行われていないことを確認できます。送信途中でこの種の攻撃が行われていた場合、チェックを行わずに証明書をインポートすると、攻撃者によって署名されたすべてのもの (攻撃的意図を持つクラスファイルを含んだ JAR ファイルなど) を信頼することになります。

注:証明書をインポートする前に必ず -printcert コマンドを実行しなければならないわけではありません。 キーストア内の信頼できる証明書のリストに証明書を追加する前に -importcert コマンドを実行すると、証明書の情報が表示され、確認を求めるメッセージが表示されます。インポート操作は、この時点で中止できます。ただし、確認メッセージが表示されるのは、-importcert コマンドを -noprompt オプションを指定せずに実行した場合だけです。-noprompt オプションが指定されている場合、ユーザーとの対話は行われません。

パスワードに関する注意事項

キーストアに対する操作を行うほとんどのコマンドでは、ストアのパスワードが必要です。また、一部のコマンドでは、非公開/秘密鍵のパスワードが必要になることがあります。

パスワードはコマンド行で指定できます (ストアのパスワードには -storepass オプション、非公開鍵のパスワードには -keypass オプションを使用)。ただし、テストを目的とする場合、または安全であることがわかっているシステムで実行する場合以外は、コマンド行やスクリプトでパスワードを指定しないでください。

必要なパスワードのオプションをコマンド行で指定しなかった場合は、パスワードの入力を求められます。

関連項目

変更点

Java SE 6 で keytool のコマンドインタフェースが変更されました。

keytool は、ユーザーがパスワードを入力する際にその入力内容を表示しなくなりました。ユーザーはパスワード入力時にその入力内容を確認できなくなったため、初期キーストアパスワードを設定したり鍵パスワードを変更したりするなど、パスワードの設定や変更を行うたびにパスワードの再入力を求められます。

変更されたコマンドの中には、名前が変更されただけのものもあれば、廃止されてこのドキュメントに記載されなくなったものもあります。以前のすべてのコマンド (名前が変更されたものと廃止されたものの両方) は、このリリースでも引き続きサポートされており、今後のリリースでもサポートされる予定です。keytool のコマンドインタフェースに加えられたすべての変更点の概要を、次に示します。

名前が変更されたコマンド:

廃止されてドキュメントに記載されなくなったコマンド:


Copyright © 2002-2006 Sun Microsystems, Inc. All Rights Reserved.

Sun
Java Software