プライマリ・コンテンツに移動
Java Platform, Standard Editionツール・リファレンス
リリース10
E94992-01
目次へ移動
目次

前
次

keytool

keytoolコマンドおよびオプションは、暗号化鍵、X.509証明書チェーンおよび信頼できる証明書を含むキーストア(データベース)の管理に使用します。

形式

keytool [-commands]
commands

keytoolのコマンドは次のとおりです。

  • -certreq: 証明書要求を生成します

  • -changealias: エントリの別名を変更します

  • -delete: エントリを削除します

  • -exportcert:証明書をエクスポートします

  • -genkeypair: 鍵ペアを生成します

  • -genseckey: 秘密鍵を生成します

  • -gencert: 証明書要求から証明書を生成します

  • -importcert: 証明書または証明書チェーンをインポートします

  • -importpass: パスワードをインポートします

  • -importkeystore: 別のキーストアから1つまたはすべてのエントリをインポートします

  • -keypasswd: エントリの鍵のパスワードを変更します

  • -list:キーストア内のエントリをリストします

  • -printcert: 証明書の内容を出力します

  • -printcertreq: 証明書要求の内容を出力します

  • -printcrl: 証明書失効リスト(CRL)ファイルの内容を出力します

  • -storepasswd: キーストアのストア・パスワードを変更します

これらのコマンドとそのオプションの説明は、コマンドとオプションを参照してください。

説明

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

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

また、keytoolコマンドを使用して、対称暗号化および復号化(データ暗号化規格)で使用される秘密鍵とパスフレーズを管理することもできます。

keytoolコマンドは、鍵と証明書をキーストアに格納します。

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

次の注意事項は、コマンドとオプションの説明に適用されます。

  • どのコマンド名およびオプション名にも先頭にハイフン記号(-)が付きます。

  • 各コマンドのオプションは、任意の順序で指定できます。

  • イタリック体になっていないか、中カッコ({ })か角カッコ([ ])で囲まれているすべての項目は、そのとおりに指定する必要があります。

  • オプションを囲む中カッコは、そのオプションをコマンド行で指定しなかったときに、デフォルト値が使用されることを意味します。中カッコは、-v-rfcおよび-Jオプションを囲むためにも使用されますが、これらのオプションはコマンド行で指定された場合にのみ意味を持ちます。これらには、デフォルト値はありません。

  • オプションを囲む角カッコは、そのオプションをコマンド行で指定しなかった場合に、ユーザーが値の入力を求められることを意味します。-keypassオプションをコマンド行で指定しなかった場合、keytoolコマンドはまず、キーストアのパスワードを使用して非公開/秘密鍵の復元を試みます。この試みが失敗すると、keytoolコマンドはユーザーに対して非公開/秘密鍵のパスワードの入力を求めます。

  • イタリック体の項目の実際の値(オプションの値)は、ユーザーが指定する必要がある。たとえば、-printcertコマンドの形式は次のとおりである

    keytool -printcert {-file cert_file} {-v}

    -printcertコマンドを指定するときは、次のようにcert_fileのかわりに実際のファイル名を指定します。keytool -printcert -file VScert.cer

  • オプションの値に空白(スペース)が含まれている場合は、値を引用符で囲む必要があります。

コマンドとオプション

keytoolコマンドとそのオプションは、それらが実行するタスクでグループ化できます。

キーストアに対してデータを作成または追加するためのコマンド:

  • -gencert

  • -genkeypair

  • -genseckey

  • -importcert

  • -importpass

別のキーストアの内容をインポートするためのコマンド:

  • -importkeystore

証明書要求を生成するためのコマンド:

  • -certreq

データをエクスポートするためのコマンド:

  • -exportcert

データを表示するためのコマンド:

  • -list

  • -printcert

  • -printcertreq

  • -printcrl

キーストアを管理するためのコマンド:

  • -storepasswd

  • -keypasswd

  • -delete

  • -changealias

キーストアに対してデータを作成または追加するためのコマンド

-gencert

-gencertコマンドで使用可能なオプションは次のとおりです。

  • {-rfc}: Request For Comment (RFC)スタイルの出力

  • {-infile infile}: 入力ファイル名

  • {-outfile outfile}: 出力ファイル名

  • {-alias alias}: 処理するエントリの別名

  • {-sigalg sigalg}: 署名アルゴリズム名

  • {-dname dname}: 識別名

  • {-startdate date}: 証明書の有効開始日時

  • {-ext ext}*: X.509拡張

  • {-validity days}: 有効日数

  • [-keypass arg]: 鍵のパスワード

  • {-keystore keystore}: キーストア名

  • [-storepass arg]: キーストアのパスワード

  • {-storetype type}: キーストアのタイプ

  • {-providername name}: プロバイダ名

  • {-addprovider name [-providerarg arg]}: 名前(SunPKCS11など)でセキュリティ・プロバイダを追加し、-addproviderの引数を構成します

  • {-providerclass class [-providerarg arg]}: 完全修飾クラス名でセキュリティ・プロバイダを追加し、-providerclassの引数を構成します

  • {-providerpath list}: プロバイダのクラス・パス

  • {-v}: 詳細出力

  • {-protected}: 保護されているメカニズムで提供されるパスワード

-gencertコマンドを使用し、証明書要求ファイル(keytool -certreqコマンドで作成可能)に対する応答として証明書を生成します。このコマンドは、infile (省略された場合は標準入力)から要求を読み取り、別名の非公開鍵を使用して要求に署名し、X.509証明書をoutfile (省略された場合は標準出力)に出力します。-rfcが指定された場合の出力形式は、Base64でエンコードされたPEMです。それ以外の場合は、バイナリDERが作成されます。

-sigalgの値には、証明書に署名するときに使用するアルゴリズムを指定します。startdate引数は、証明書が有効になる開始時間および日付です。valDays引数には、証明書の有効日数を指定します。

dnameが指定されている場合は、生成される証明書のサブジェクトとして使用されます。そうでない場合は、証明書要求の名前が使われます。

extの値は、証明書に組み込まれるX.509拡張機能を示します。-extの構文は、一般的なコマンドのオプションを参照してください。

-gencertオプションを使用すると、証明書チェーンを作成できます。次の例では、証明書チェーンに3つの証明書を含むe1という証明書を作成します。

次のコマンドでは、caca1ca2、およびe1という4つの鍵ペアを作成します。

keytool -alias ca -dname CN=CA -genkeypair
keytool -alias ca1 -dname CN=CA -genkeypair
keytool -alias ca2 -dname CN=CA -genkeypair
keytool -alias e1 -dname CN=E1 -genkeypair

次の2つのコマンドでは、署名付き証明書のチェーンを作成します。caca1に署名し、ca1ca2に署名し、これらのすべてが自己発行されます。

keytool -alias ca1 -certreq |
    keytool -alias ca -gencert -ext san=dns:ca1 |
    keytool -alias ca1 -importcert

keytool -alias ca2 -certreq |
    keytool -alias ca1 -gencert -ext san=dns:ca2 |
    keytool -alias ca2 -importcert

次のコマンドでは、証明書e1を作成し、それをca2によって署名されたe1.certファイルに格納します。この結果、e1の証明書チェーンにはcaca1、およびca2が含まれることになります。

keytool -alias e1 -certreq | keytool -alias ca2 -gencert > e1.cert
-genkeypair

-genkeypairコマンドで使用可能なオプションは次のとおりです。

  • {-alias alias}: 処理するエントリの別名

  • {-keyalg alg}: 鍵アルゴリズム名

  • {-keysize size}: 鍵のビット・サイズ

  • {-sigalg alg}: 署名アルゴリズム名

  • -destalias alias: ターゲット別名

  • [-dname name]: 識別名

  • {-startdate date}: 証明書の有効開始日時

  • [-ext value}*: X.509拡張

  • {-validity days}: 有効日数

  • [-keypass arg]: 鍵のパスワード

  • {-keystore keystore}: キーストア名

  • [-storepass arg]: キーストアのパスワード

  • {-storetype type}: キーストアのタイプ

  • {-providername name}: プロバイダ名

  • {-addprovider name [-providerarg arg]}: 名前(SunPKCS11など)でセキュリティ・プロバイダを追加し、-addproviderの構成引数を追加します

  • {-providerclass class [-providerarg arg] }: 完全修飾クラス名でセキュリティ・プロバイダを追加し、-providerclassの構成引数を追加します

  • {-providerpath list}: プロバイダのクラス・パス

  • {-v}: 詳細出力

  • {-protected}: 保護されているメカニズムで提供されるパスワード

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

-keyalgの値には鍵ペアの生成に使用するアルゴリズムを、-keysizeの値には生成する各鍵のサイズを、それぞれ指定します。-sigalgの値には、自己署名証明書に署名するときに使用するアルゴリズムを指定します。このアルゴリズムは、-keyalgの値と互換性がある必要があります。

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

-keypassの値には、生成される鍵ペアのうち、非公開鍵を保護するために使用されるパスワードを指定します。パスワードを指定しなかった場合は、ユーザーにその入力が求められます。プロンプトで[Return]キーを押すと、鍵のパスワードがキーストアのパスワードと同じパスワードに設定されます。-keypassの値は、6文字以上である必要があります。

-startdateの値には、証明書の発行時間を指定します。これは、X.509証明書のValidityフィールドの「Not Before」値としても知られています。

このオプションの値は、次のいずれかの形式で設定できます。

([+-]nnn[ymdHMS])+

[yyyy/mm/dd] [HH:MM:SS]

最初の形式では、現在の時間から指定された値だけシフトした時間が発行時間になります。この値は、サブ値のシーケンスを連結したものです。各サブ値の内部では、プラス記号(+)が未来へのシフトを意味し、マイナス記号(-)が過去へのシフトを意味します。シフトする時間は、年、月、日、時、分または秒(それぞれymdHMまたはSの1文字で示される)を単位とするnnnです。発行時間の正確な値は、左端のサブ値から順にjava.util.GregorianCalendar.add(int field, int amount)メソッドを使用して計算されます。たとえば、発行時間は次のように指定できます。

Calendar c = new GregorianCalendar();
c.add(Calendar.YEAR, -1);
c.add(Calendar.MONTH, 1);
c.add(Calendar.DATE, -1);
return c.getTime()

2番目の形式では、ユーザーが年/月/日と時間:分:秒の2つの部分に正確な発行時間を設定します(ローカル・タイムゾーンを使用)。ユーザーは、一方の部分のみを指定できます。その場合、もう一方の部分は現在の日付(または時間)と同じと見なされます。ユーザーは、形式の定義に示された正確な桁数を指定する必要があります(短い場合は0でパディングします)。日付と時間の両方を指定する場合は、2つの部分の間に空白文字を1つのみ入れます。時間は、常に24時間形式で指定してください。

このオプションを指定しなかった場合、開始日は現在の時間になります。このオプションは1回のみ指定できます。

dateの値には、証明書が有効と見なされる(-startdateで指定された日付、または-startdateが指定されていない場合は現在の日付から始まる)日数を指定します。

-genseckey

-genseckeyコマンドで使用可能なオプションは次のとおりです。

  • {-alias alias}: 処理するエントリの別名

  • [-keypass arg] : 鍵のパスワード

  • {-keyalg alg}: 鍵アルゴリズム名

  • {-keysize size}: 鍵のビット・サイズ

  • {-keystore keystore}: キーストア名

  • [-storepass arg]: キーストアのパスワード

  • {-storetype type}: キーストアのタイプ

  • {-providername name}: プロバイダ名

  • {-addprovider name [-providerarg arg]}: 名前(SunPKCS11など)でセキュリティ・プロバイダを追加し、-addproviderの引数を構成します

  • {-providerclass class [-providerarg arg]}: 完全修飾クラス名でセキュリティ・プロバイダを追加し、-providerclassの引数を構成します

  • {-providerpath list}: プロバイダのクラス・パス

  • {-v}: 詳細出力

  • {-protected}: 保護されているメカニズムで提供されるパスワード

-genseckeyコマンドを使用して秘密鍵を生成し、これをaliasで特定される新しいKeyStore.SecretKeyEntryに格納します。

-keyalgの値には秘密鍵の生成に使用するアルゴリズムを、-keysizeの値には生成する鍵のサイズを、それぞれ指定します。-keypassの値には、秘密鍵を保護するパスワードを指定します。パスワードを指定しなかった場合は、ユーザーにその入力が求められます。プロンプトで[Return]キーを押すと、鍵のパスワードが-keystoreに使用されているパスワードと同じパスワードに設定されます。-keypassの値は、6文字以上である必要があります。

-importcert

-importcertコマンドで使用可能なオプションは次のとおりです。

  • {-noprompt}: プロンプトを表示しません

  • {-trustcacerts}: cacertsからの証明書を信頼します

  • {-protected}: パスワードは保護メカニズムを介して提供されます

  • {-alias alias}: 処理するエントリの別名

  • {-file file}: 入力ファイル名

  • [-keypass arg]: 鍵のパスワード

  • {-keystore keystore}: キーストア名

  • {-cacerts}: cacertsキーストアにアクセスします

  • [-storepass arg]: キーストアのパスワード

  • {-storetype type}: キーストアのタイプ

  • {-providername name}: プロバイダ名

  • {-addprovider name [-providerarg arg ]}: 名前(SunPKCS11など)でセキュリティ・プロバイダを追加し、-addproviderの引数を構成します

  • {-providerclass class [-providerarg arg]}: 完全修飾クラス名でセキュリティ・プロバイダを追加し、-providerclassの引数を構成します

  • {-providerpath list}: プロバイダのクラス・パス

  • {-v}: 詳細出力

-importcertコマンドを使用して、-file fileから証明書または証明書チェーン(証明書チェーンは、PKCS#7形式の応答またはX.509証明書のシーケンスで提供される)を読み取り、-aliasによって特定されるkeystoreエントリに格納します。-file fileが指定されていない場合は、stdinから証明書または証明書チェーンを読み取ります。

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

証明書のインポートには2つの目的があります。信頼できる証明書のリストに証明書を追加することと、証明書署名要求(CSR)を認証局(CA)に送信した結果としてそのCAから受け取った証明書応答をインポートすることです。証明書要求を生成するためのコマンド-certreqコマンドを参照してください。

インポートのタイプは、-aliasオプションの値によって指定します。別名が鍵エントリを指していない場合、keytoolコマンドはユーザーが信頼できる証明書エントリを追加しようとしていると見なします。この場合、別名がキーストア内に存在してない必要があります。別名が存在している場合、その別名の信頼できる証明書がすでに存在することになるため、keytoolコマンドはエラーを出力し、証明書をインポートしません。-aliasが鍵エントリを指している場合、keytoolコマンドはユーザーが証明書応答をインポートしようとしていると見なします。

-importpass

-importpassコマンドで使用可能なオプションは次のとおりです。

  • {-alias alias}: 処理するエントリの別名

  • [-keypass arg]: 鍵のパスワード

  • {-keyalg alg}: 鍵アルゴリズム名

  • {-keysize size}: 鍵のビット・サイズ

  • {-keystore keystore}: キーストア名

  • [-storepass arg]: キーストアのパスワード

  • {-storetype type}: キーストアのタイプ

  • {-providername name}: プロバイダ名

  • {-addprovider name [-providerarg arg]}: 名前(SunPKCS11など)でセキュリティ・プロバイダを追加し、-addproviderの引数を構成します

  • {-providerclass class [-providerarg arg]}: 完全修飾クラス名でセキュリティ・プロバイダを追加し、-providerclassの引数を構成します

  • {-providerpath list}: プロバイダのクラス・パス

  • {-v}: 詳細出力

  • {-protected}: 保護されているメカニズムで提供されるパスワード

-importpassコマンドを使用してパスフレーズをインポートし、これを-aliasで特定される新しいKeyStore.SecretKeyEntryに格納します。パスフレーズは標準入力ストリームで指定されます。指定されていない場合、ユーザーにその入力が求められます。-keypassオプションは、インポートされたパスフレーズを保護するためのパスワードを提供します。パスワードを指定しなかった場合は、ユーザーにその入力が求められます。プロンプトで[Return]キーを押すと、鍵のパスワードがkeystoreに使用されるパスワードと同じパスワードに設定されます。-keypassの値は、6文字以上である必要があります。

別のキーストアの内容をインポートするためのコマンド

-importkeystore

-importkeystoreコマンドで使用可能なオプションは次のとおりです。

  • {-srckeystore keystore}: ソース・キーストア名

  • {-destkeystore keystore}: ターゲット・キーストア名

  • {-srcstoretype type}: ソース・キーストアのタイプ

  • {-deststoretype type}: ターゲット・キーストアのタイプ

  • [-srcstorepass arg]: ソース・キーストアのパスワード

  • [-deststorepass arg]: ターゲット・キーストアのパスワード

  • {-srcprotected パスワードで保護されるソース・キーストア

  • {-destprotected}: パスワードで保護されるターゲット・キーストア

  • {-srcprovidername name}: ソース・キーストア・プロバイダ名

  • {-destprovidername name}: ターゲット・キーストア・プロバイダ名

  • {-srcalias alias}: ソース別名

  • {-destalias alias}: ターゲット別名

  • [-srckeypass arg]: ソースの鍵のパスワード

  • [-destkeypass arg]: ターゲットの鍵のパスワード

  • {-noprompt}: プロンプトを表示しません

  • {-addprovider name [-providerarg arg]: 名前(SunPKCS11など)でセキュリティ・プロバイダを追加し、-addproviderの引数を構成します

  • {-providerclass class [-providerarg arg]}: 完全修飾クラス名でセキュリティ・プロバイダを追加し、-providerclassの引数を構成します

  • {-providerpath list}: プロバイダのクラス・パス

  • {-v}: 詳細出力

注意:

次の行はすべてのオプションの1行目に指定します。
 -srckeystore keystore -destkeystore keystore

-importkeystoreコマンドを使用して、ソース・キーストア内の単一のエントリまたはすべてのエントリをターゲット・キーストアにインポートします。

注意:

keytool -importkeystoreコマンドの使用時に-destkeystoreを指定しなかった場合、使用されるデフォルトのキーストアは$HOME/.keystoreです。

-srcaliasオプションが指定された場合、このコマンドは、その別名で特定される単一のエントリをターゲット・キーストアにインポートします。-destaliasでターゲット別名が指定されなかった場合、-srcaliasがターゲット別名として使用されます。ソースのエントリがパスワードで保護されていた場合、-srckeypassを使用してそのエントリが回復されます。-srckeypassが指定されなかった場合、keytoolコマンドは-srcstorepassを使用してそのエントリを回復しようとします。-srcstorepassが指定されなかったか正しくなかった場合は、ユーザーにパスワードの入力が求められます。ターゲット・エントリは-destkeypassによって保護されます。-destkeypassが指定されなかった場合、ターゲット・エントリはソース・エントリのパスワードによって保護されます。たとえば、ほとんどのサード・パーティ製ツールでは、PKCS #12キーストアのstorepasskeypassを同じにする必要があります。これらのツール用のPKCS#12キーストアを作成するには、常に-deststorepassと同じ-destkeypassを指定します。

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

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

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

証明書要求を生成するためのコマンド

-certreq

-certreqコマンドで使用可能なオプションは次のとおりです。

  • {-alias alias}: 処理するエントリの別名

  • {-sigalg alg}: 署名アルゴリズム名

  • {-file file}: 出力ファイル名

  • [ -keypass arg]: 鍵のパスワード

  • {-keystore keystore}: キーストア名

  • {-dname name}: 識別名

  • {-ext value}: X.509拡張

  • [-storepass arg]: キーストアのパスワード

  • {-storetype type}: キーストアのタイプ

  • {-providername name}: プロバイダ名

  • {-addprovider name [-providerarg arg]}: 名前(SunPKCS11など)でセキュリティ・プロバイダを追加し、-addproviderの引数を構成します

  • {-providerclass class [-providerarg arg]}: 完全修飾クラス名でセキュリティ・プロバイダを追加し、-providerclassの引数を構成します

  • {-providerpath list}: プロバイダのクラス・パス

  • {-v}: 詳細出力

  • {-protected }: 保護されているメカニズムで提供されるパスワード

-certreqコマンドを使用して、PKCS #10形式で証明書署名要求(CSR)を生成します。

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

aliasに関連付けられた非公開鍵は、PKCS #10証明書要求を作成するために使用されます。秘密鍵にアクセスするには、正しいパスワードを指定する必要があります。コマンド行で-keypassを指定しておらず、キーストアの整合性の保護に使用されるパスワードと異なる場合、そのパスワードの入力を求められます。-dnameが指定された場合は、これがCSR内のサブジェクトとして使用されます。それ以外の場合は、別名に関連付けられたX.500識別名が使われます。

-sigalgの値には、CSRに署名するときに使用するアルゴリズムを指定します。

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

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

データをエクスポートするためのコマンド

-exportcert

-exportcertコマンドで使用可能なオプションは次のとおりです。

  • {-rfc}: RFCスタイルの出力

  • {-alias alias}: 処理するエントリの別名

  • {-file file}: 出力ファイル名

  • {-keystore keystore}: キーストア名

  • {-cacerts}: cacertsキーストアにアクセスします

  • [-storepass arg]: キーストアのパスワード

  • {-storetype type}: キーストアのタイプ

  • {-providername name}: プロバイダ名

  • {-addprovider name [-providerarg arg]}: 名前(SunPKCS11など)でセキュリティ・プロバイダを追加し、-addproviderの引数を構成します

  • {-providerclass class [-providerarg arg] }: 完全修飾クラス名でセキュリティ・プロバイダを追加し、-providerclassの引数を構成します

  • {-providerpath list}: プロバイダのクラス・パス

  • {-v }: 詳細出力

  • {-protected}: 保護されているメカニズムで提供されるパスワード

-exportcertコマンドを使用して、-alias aliasに関連付けられた証明書をキーストアから読み取り、cert_fileファイルに格納します。ファイルが指定されていない場合は、stdoutに証明書が出力されます。

デフォルトでは、バイナリ・エンコードで証明書が出力されます。-rfcオプションが指定されている場合は、インターネットRFC 1421証明書エンコード規格で定義されている出力可能エンコード形式で出力されます。

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

データを表示するためのコマンド

-list

-listコマンドで使用可能なオプションは次のとおりです。

  • {-rfc}: RFCスタイルの出力

  • {-alias alias}: 処理するエントリの別名

  • {-keystore keystore}: キーストア名

  • {-cacerts}: cacertsキーストアにアクセスします

  • [-storepass arg]: キーストアのパスワード

  • {-storetype type}: キーストアのタイプ

  • {-providername name}: プロバイダ名

  • {-addprovider name [-providerarg arg]}: 名前(SunPKCS11など)でセキュリティ・プロバイダを追加し、-addproviderの引数を構成します

  • {-providerclass class [-providerarg arg] }: 完全修飾クラス名でセキュリティ・プロバイダを追加し、-providerclassの引数を構成します

  • {-providerpath list}: プロバイダのクラス・パス

  • {-v}: 詳細出力

  • {-protected}: 保護されているメカニズムで提供されるパスワード

-listコマンドを使用して、-aliasで特定されるキーストア・エントリの内容をstdoutに出力します。-alias aliasが指定されていない場合は、キーストア全体の内容が出力されます。

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

注意:

同じコマンドで-v-rfcの両方を指定することはできません。指定しないとエラーがレポートされます。

-printcert

-printcertコマンドで使用可能なオプションは次のとおりです。

  • {-rfc}: RFCスタイルの出力

  • {-file cert_file}: 入力ファイル名

  • {-sslserver server[:port]}: Secure Sockets Layer (SSL)サーバーのホストおよびポート

  • {-jarfile JAR_file}: 署名付き.jarファイル

  • {-v}: 詳細出力

-printcertコマンドを使用して、-file cert_fileからの証明書、-sslserver server[:port]にあるSSLサーバー、または-jarfile JAR_fileで指定された署名付きJARファイルを読み取って出力します。その内容は判読可能な形式で出力されます。ポートが指定されていない場合は、標準のHTTPSポート443が想定されます。

注意:

-sslserverオプションと-fileオプションは同じコマンドには指定できません。指定しないとエラーがレポートされます。どちらのオプションも指定されていない場合は、stdinから証明書が読み取られます。

-rfcが指定されている場合、keytoolコマンドはインターネットRFC 1421証明書エンコード規格で定義されているPEMモードで証明書を出力します。

証明書がファイルまたはstdinから読み取られた場合は、バイナリ・エンコード形式またはインターネットRFC 1421証明書エンコード規格で定義されている出力可能エンコード形式で証明書が出力される可能性があります。

SSLサーバーがファイアウォールの背後にある場合は、コマンド行に-J-Dhttps.proxyHost=proxyhostおよび-J-Dhttps.proxyPort=proxyportオプションを指定してプロキシ・トンネリングを使用できます。

注意:

このオプションはキーストアとは関係なく使用できます。

-printcertreq

-printcertreqコマンドで使用可能なオプションは次のとおりです。

  • {-file file}: 入力ファイル名

  • {-v}: 詳細出力

-printcertreqコマンドを使用して、PKCS #10形式の証明書要求の内容を出力します。この要求は、keytool -certreqコマンドで生成できます。このコマンドは、ファイルから要求を読み取ります。ファイルが存在しない場合は、標準入力から要求が読み取られます。

-printcrl

-printcrlコマンドで使用可能なオプションは次のとおりです。

  • -file crl: 入力ファイル名

  • {-v}: 詳細出力

-printcrlコマンドを使用して、-file crlから証明書失効リスト(CRL)を読み取ります。CRLは、発行元のCAによって取り消されたデジタル証明書のリストです。CAによってcrlファイルが生成されます。

注意:

このオプションはキーストアとは関係なく使用できます。

キーストアを管理するためのコマンド

-storepasswd

-storepasswdコマンドで使用可能なオプションは次のとおりです。

  • [-new arg]: 新規パスワード

  • {-keystore keystore}: キーストア名

  • {-cacerts}: cacertsキーストアにアクセスします

  • [-storepass arg]: キーストアのパスワード

  • {-storetype type}: キーストアのタイプ

  • {-providername name}: プロバイダ名

  • {-addprovider name [-providerarg arg]}: 名前(SunPKCS11など)でセキュリティ・プロバイダを追加し、-addproviderの引数を構成します

  • {-providerclass class [-providerarg arg]}: 完全修飾クラス名でセキュリティ・プロバイダを追加し、-providerclassの引数を構成します

  • {-providerpath list}: プロバイダのクラス・パス

  • {-v}: 詳細出力

-storepasswdコマンドを使用して、キーストアの内容の整合性を保護するために使用するパスワードを変更します。新しいパスワードは-new argで設定しますが、これは6文字以上にする必要があります。

-keypasswd

-keypasswdコマンドで使用可能なオプションは次のとおりです。

  • {-alias alias}: 処理するエントリの別名

  • [-keypass old_keypass]: 鍵のパスワード

  • [-new new_keypass]: 新規パスワード

  • {-keystore keystore}: キーストア名

  • {-storepass arg}: キーストアのパスワード

  • {-storetype type}: キーストアのタイプ

  • {-providername name}: プロバイダ名

  • {-addprovider name [-providerarg arg]}: 名前(SunPKCS11など)でセキュリティ・プロバイダを追加し、-addproviderの引数を構成します

  • {-providerclass class [-providerarg arg]}: 完全修飾クラス名でセキュリティ・プロバイダを追加し、-providerclassの引数を構成します

  • {-providerpath list}: プロバイダのクラス・パス

  • {-v}: 詳細出力

-keypasswdコマンドを使用して、(-aliasによって特定される非公開/秘密鍵を保護している)パスワードを-keypass old_keypassから-new new_keypassに変更します。パスワードの値は6文字以上にする必要があります。

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

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

-delete

-deleteコマンドで使用可能なオプションは次のとおりです。

  • [-alias alias]: 処理するエントリの別名

  • {-keystore keystore}: キーストア名

  • {-cacerts}: cacertsキーストアにアクセスします

  • [-storepass arg]: キーストアのパスワード

  • {-storetype type}: キーストアのタイプ

  • {-providername name}: プロバイダ名

  • {-addprovider name [-providerarg arg]}: 名前(SunPKCS11など)でセキュリティ・プロバイダを追加し、-addproviderの引数を構成します

  • {-providerclass class [-providerarg arg]}: 完全修飾クラス名でセキュリティ・プロバイダを追加し、-providerclassの引数を構成します

  • {-providerpath list}: プロバイダのクラス・パス

  • {-v}: 詳細出力

  • {-protected}: 保護されているメカニズムで提供されるパスワード

-deleteコマンドを使用して、キーストアから-alias aliasエントリを削除します。コマンド行で指定しなかった場合は、ユーザーにaliasの入力が求められます。

-changealias

-changealiasコマンドで使用可能なオプションは次のとおりです。

  • {-alias alias}: 処理するエントリの別名

  • [-destalias alias]: ターゲット別名

  • [-keypass arg]: 鍵のパスワード

  • {-keystore keystore}: キーストア名

  • {-cacerts}: cacertsキーストアにアクセスします

  • [-storepass arg]: キーストアのパスワード

  • {-storetype type}: キーストアのタイプ

  • {-providername name}: プロバイダ名

  • {-addprovider name [-providerarg arg]}: 名前(SunPKCS11など)でセキュリティ・プロバイダを追加し、-addproviderの引数を構成します

  • {-providerclass class [-providerarg arg]}: 完全修飾クラス名でセキュリティ・プロバイダを追加し、-providerclassの引数を構成します

  • {-providerpath list}: プロバイダのクラス・パス

  • {-v}: 詳細出力

  • {-protected}: 保護されているメカニズムで提供されるパスワード

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

ヘルプ情報を表示するためのコマンド

--helpを使用してkeytoolコマンドのリストを表示することも、特定のkeytoolコマンドのヘルプ情報を表示することもできます。
  • keytoolコマンドのリストを表示するには、次のように入力します。

    keytool --help
  • 特定のkeytoolコマンドのヘルプ情報を表示するには、次のように入力します。

    keytool -command --help

一般的なコマンドのオプション

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

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

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

-storetype storetype

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

-keystore keystore

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

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

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

-cacerts cacerts

cacertsキーストアに対して作用します。このオプションは、"-keystore path_to_cacerts -storetype type_of_cacerts"と同等です。-keystoreまたは-storetypeオプションが-cacertsオプションとともに使用されると、エラーがレポートされます。

-storepass [:env | :file ] argument

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

修飾子envまたはfileが指定されていない場合、パスワードの値はargumentです。これは6文字以上である必要があります。それ以外の場合、パスワードは次のように取得されます。

  • env: argumentという名前の環境変数からパスワードを取得します。

  • file: argumentという名前のファイルからパスワードを取得します。

注意: -keypass-srckeypass-destkeypass-srcstorepass-deststorepassなど、パスワードが必要な他のすべてのオプションで修飾子envおよびfileを受け入れます。パスワード・オプションと修飾子は必ずコロン(:)で区切ってください。

このパスワードは、キーストアの内容にアクセスするすべてのコマンドで使われます。このようなコマンドでは、コマンド行で-storepassオプションを指定しなかった場合、パスワードの入力を求められます。

キーストアから情報を取り出す場合、パスワードはオプションです。パスワードを指定しなかった場合は、取得された情報の整合性を検証できないため、警告が表示されます。

-providername name

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

-providerclass class

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

-providerpath list

プロバイダのクラス・パスを指定するために使用されます。

-providerarg arg

-providerclassオプションとともに使用し、class名のコンストラクタに対するオプションの文字列入力引数を表します。

-protected=true|false

専用PINリーダーなどの保護された認証パスを介してパスワードを指定する必要がある場合は、この値をtrueとして指定します。-importkeystoreコマンドには2つのキーストアが関係しているため、2つのオプション(-srcprotectedおよび-destprotected)をそれぞれソース・キーストアおよびターゲット・キーストアとして指定します。

-ext {name{:critical} {=value}}

X.509証明書の拡張機能を示します。このオプションは、生成された証明書に拡張機能を組み込むために-genkeypairおよび-gencertで、または証明書要求で要求された拡張機能を表示するために-certreqで使用できます。このオプションは、複数回使用できます。name引数には、サポートされている拡張機能名(サポートされている名前付き拡張機能を参照)または任意のOID番号を指定できます。value引数を指定した場合は、拡張機能の引数を示します。valueを省略した場合は、拡張機能のデフォルト値または拡張機能自体に引数は不要です。修飾子:criticalを指定した場合は、拡張機能のisCritical属性がtrueであることを意味し、それ以外の場合はfalseであることを意味します。:criticalのかわりに:cを使用できます。

オプション値の例

次の例は、各種のオプション値のデフォルトを示しています。

-alias "mykey"
 
-keyalg
    "DSA" (when using -genkeypair)
    "DES" (when using -genseckey)
 
-keysize
    2048 (when using -genkeypair and -keyalg is "RSA")
    2048 (when using -genkeypair and -keyalg is "DSA")
    256 (when using -genkeypair and -keyalg is "EC")
    56 (when using -genseckey and -keyalg is "DES")
    168 (when using -genseckey and -keyalg is "DESede")
 
-validity 90
  
-keystore <the file named .keystore in the user's home directory>

-destkeystore <the file named .keystore in the user's home directory>
   
 -storetype <the value of the "keystore.type" property in the
    security properties file, which is returned by the static
    getDefaultType method in java.security.KeyStore>
 
-file
    stdin (if reading)
    stdout (if writing)
 
-protected false

証明書または証明書要求の生成中、次のように適切なレベルのセキュリティ強度を提供するために、デフォルトの署名アルゴリズム(-sigalgオプション)が基礎となる非公開鍵のアルゴリズムから導出されます。

keyalg keysize デフォルトのsigalg

DSA

任意のサイズ

SHA256withDSA   

RSA

   

<= 3072

<= 7680

> 7680

SHA256withRSA

SHA384withRSA

SHA512withRSA

EC

<384

<512

= 512

SHA256withECDSA

SHA384withECDSA

SHA512withECDSA

注意:

追加設定なしのセキュリティを向上させるために、デフォルトの鍵のサイズおよび署名アルゴリズム名はJDKの各リリースでより強い値に定期的に更新されます。古いJDKのリリースとの相互運用性が重要な場合は、このデフォルトがそれらのリリースでサポートされていることを確認してください。または、-keysizeまたは-sigalgオプションを使用して、自己責任でデフォルト値をオーバーライドすることもできます。

サポートされている名前付き拡張機能

keytoolコマンドは、これらの名前付き拡張機能をサポートしています。名前は、大/小文字が区別されません。

BCまたはBasicContraints

値:

完全な形式であるca:{true|false}[,pathlen:len]またはca:true,pathlen:lenの短縮形であるlen

lenが省略されている場合、結果となる値はca:trueです。

KUまたはKeyUsage

値:

usage(,usage)*

usageには次のいずれかを指定できます。
  • digitalSignature

  • nonRepudiation (contentCommitment )

  • keyEncipherment

  • dataEncipherment

  • keyAgreement

  • keyCertSign

  • cRLSign

  • encipherOnly

  • decipherOnly

.

あいまいさがないかぎり、usage引数は、最初の数文字(digitalSignatureの場合はdigなど)に短縮したり、キャメル記法(digitalSignatureの場合はdScRLSignの場合はcRLSなど)で指定できます。usageの値は大文字と小文字が区別されます。

EKUまたはExtendedKeyUsage

値:

usage(,usage)*

usageには次のいずれかを指定できます。

  • anyExtendedKeyUsage

  • serverAuth

  • clientAuth

  • codeSigning

  • emailProtection

  • timeStamping

  • OCSPSigning

  • 任意のOID文字列

あいまいさがないかぎり、usage引数は、最初の数文字に短縮したり、キャメル記法で指定できます。usageの値は大文字と小文字が区別されます。

SANまたはSubjectAlternativeName

値:

type:value(,type:value)*

typeには次のいずれかを指定できます。
  • EMAIL

  • URI

  • DNS

  • IP

  • OID

value引数はtypeを表す文字列形式の値です。
IANまたはIssuerAlternativeName

値:

SANまたはSubjectAlternativeNameと同じです。

SIAまたはSubjectInfoAccess

値:

method:location-type:location-value (,method:location-type:location-value)*

methodには次のいずれかを指定できます。
  • timeStamping

  • caRepository

  • 任意のOID

location-typeおよびlocation-value引数には、SubjectAlternativeName拡張機能でサポートされている任意のtype:valueを指定できます。
AIAまたはAuthorityInfoAccess

値:

SIAまたはSubjectInfoAccessと同じです。

method引数には次のいずれかを指定できます。
  • ocsp

  • caIssuers

  • 任意のOID

nameがOIDである場合、その値はOCTET STRINGのデータ型および長さのバイトを除く拡張機能のextnValueの16進数でダンプされたDefinite Encoding Rules (DER)エンコードです。標準の16進数字(0-9、a-f、A-F)以外の余分な文字は16進文字列では無視されます。したがって、01:02:03:04と01020304はどちらも同じ値として受け入れられます。値がない場合は、拡張機能に空の値のフィールドが含まれます。

特別な名前であるhonoredは、-gencertでのみ使用され、証明書要求に含まれる拡張機能をどのように受け付けるかを示します。この名前の値は、all (要求されたすべての拡張機能を受け付ける)、name{:[critical|non-critical]} (名前付き拡張機能を受け付けるが、異なるisCritical属性を使用する)および-name (allとともに使用し、例外を示す)のカンマ区切りリストです。要求された拡張機能は、デフォルトでは受け付けられません。

-ext honoredオプションとは別に、名前またはOIDによる-extオプションを指定すると、すでに受け付けられた拡張機能にその拡張機能が追加されます。ただし、この名前(またはOID)が受け付けられた値にも含まれる場合は、その値と重大性が要求内の設定をオーバーライドします。名前またはOIDによって同じタイプの拡張機能が複数回指定されると、最後の拡張機能のみが使用されます。

subjectKeyIdentifier拡張機能は常に作成されます。自己署名でない証明書の場合は、authorityKeyIdentifierが作成されます。

注意:

ユーザーは、拡張機能(および証明書の他のフィールド)の組合せによってはインターネット標準に準拠しない場合があることに注意してください。「証明書の適合性に関する警告」を参照してください。

キーストア作成におけるタスクの例

次の各例では、公開/非公開鍵のペアと信頼できるエンティティからの証明書を管理するためにキーストアを作成する際の、一連の処理について説明します。

鍵ペアの生成

キーストアを作成してから、鍵ペアを生成します。

次のような単一行としてコマンドを入力できます。

keytool -genkeypair -dname "cn=myname, ou=mygroup, o=mycompany, c=mycountry"
    -alias business -keypass password
    -keystore /working/mykeystore
    -storepass password -validity 180

このコマンドは、作業ディレクトリにmykeystoreという名前のキーストアを作成し(まだ存在していない場合)、作成したキーストアに-keypassで指定したパスワードを割り当てます。識別名がmynamemygroupmycompanyおよび2文字の国コードであるmycountryのエンティティの公開/非公開鍵のペアが生成されます。鍵はどちらも2048ビットで、鍵の作成にはデフォルトのDSA鍵生成アルゴリズムを使用します

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

オプションのデフォルト値を使うと、コマンドが大幅に短くなります。その場合、オプションを指定する必要はありません。指定しなかったオプションにデフォルト値があれば、デフォルト値が使用されます。必要な値については入力を求められます。たとえば、次のように入力することもできます。

keytool -genkeypair

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

注意:

以降の例では、オプションを指定しないで-genkeypairコマンドを実行したものとし、値の入力を求められた場合は、最初の-genkeypairコマンドに指定した値を入力したものとします。たとえば、識別名をcn=myname, ou=mygroup, o=mycompany, c=mycountryとします。

CAに対する署名付き証明書の要求

注意:

鍵ペアの生成により自己署名証明書が作成されました。ただし証明書は、CAの署名が付いていれば他のユーザーから信頼される可能性が高くなります。

CAの署名を取得するには、次の処理を実行します。

  1. CSRを生成します。

    keytool -certreq -file myname.csr
    

    デフォルトの別名mykeyによって特定されるエンティティのCSRが作成され、myname.csrという名前のファイルに要求が配置されます。

  2. myname.csrをDigiCertなどのCAに送信します。

CAは要求者を(通常はオフラインで)認証し、要求者の公開鍵を認証した署名付きの証明書を送り返します。場合によっては、CAが証明書のチェーンを返すこともあります。証明書のチェーンでは、各証明書がチェーン内の前の署名者の公開鍵を認証します。

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

CAの証明書をインポートするには、次の処理を実行します。

  1. CAからの証明書応答をインポートするには、キーストアかcacertsキーストア・ファイル内に1つ以上の信頼できる証明書が存在している必要があります。「コマンド」の-importcertを参照してください。

    • 証明書応答が証明書チェーンの場合は、チェーンのトップの証明書が必要です。そのCAの公開鍵を認証するルートCAの証明書です。

    • 証明書応答が単一の証明書の場合は、(その証明書に署名した)発行元CAの証明書が必要です。その証明書が自己署名されていない場合は、その署名者の証明書が必要となり、このようにして自己署名付きのルートCA証明書まで必要になります。

    cacertsキーストアは、Oracle Javaルート証明書プログラムのCAによって発行された一連のルート証明書を含んだ状態で出荷されています。CAに対して署名付き証明書を要求しており、そのCAの公開鍵を認証する証明書がcacertsに追加されていない場合は、そのCAからの証明書を信頼できる証明書としてインポートする必要があります。

    通常、CAからの証明書は、自己署名付きの証明書か別のCAによって署名された証明書です。別のCAによって署名されている場合は、そのCAの公開鍵を認証する証明書が必要です。

    たとえば、CAである会社からX.cerファイルを入手してあり、そのファイルがそのCAの公開鍵を認証する自己署名証明書であるとします。信頼できる証明書としてその証明書をインポートする前に、証明書が有効であることを確認する必要があります。

    1. keytool -printcertコマンドを使用するか、-nopromptオプションを指定せずにkeytool -importcertコマンドを使用して、証明書を表示します。表示された証明書のフィンガプリントが期待されるフィンガプリントと一致していることを確認します。

    2. 証明書を送信した人に連絡し、表示されたフィンガプリントを、この人が提示した(または安全な公開鍵のリポジトリによって提示される)フィンガプリントと比較します。

    フィンガプリントが一致した場合にのみ、送信途中に他の何者かの証明書(攻撃者の証明書など)ですり替えられていないことを保証できます。このような攻撃が行われていた場合、チェックを行わずに証明書をインポートすると、攻撃者によって署名されたすべてのものを信頼することになります。

  2. 自己署名証明書を証明書チェーンで置き換えます。証明書チェーンでは、各証明書がチェーン内の前の証明書の署名者の公開鍵を認証し、それがルートCAまで続きます。

    証明書を有効なものとして信頼する場合は、次のコマンドを入力して証明書をキーストアに追加できます。

    keytool -importcert -alias alias -file X.cer
    

    このコマンドは、CA証明書ファイルのデータから、キーストア内に信頼できる証明書エントリを作成し、aliasの値をそのエントリに割り当てます。

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

証明書署名要求の提出先のCAの公開鍵を認証する証明書をインポートした後(または同種の証明書がすでにcacertsファイル内に存在している場合は)、証明書応答をインポートし、自己署名証明書を証明書チェーンで置き換えることができます。

証明書チェーンは次のいずれかです。
  • CAの応答がチェーンの場合、CAから送り返されます。

  • CAの応答が単一の証明書の場合、作成されます。この証明書チェーンは、証明書応答と、応答のインポート先のキーストア内またはcacertsキーストア・ファイル内で使用可能な信頼できる証明書を使用して構成されます。

たとえば、証明書署名要求をDigiCertに送信した場合は、次のコマンドを入力してその応答をインポートできます。

注意:

この例の場合、返される証明書の名前はDCmyname.cerになります。

keytool -importcert -trustcacerts -file DCmyname.cer

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

注意:

jarsignerコマンドを使用してJava Archive (JAR)ファイルに署名した場合、このファイルを使用するクライアントはその署名を認証する必要があります。

クライアントが認証する方法の1つは、署名者の公開鍵証明書を信頼できるエントリとしてクライアントのキーストアにインポートすることです。そのために、証明書をエクスポートしてクライアントに提供できます。

例:

  1. 次のコマンドを入力して、証明書をmyname.cerという名前のファイルにコピーします。

    注意:

    この例の場合、エントリにはmykeyという別名があります。

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

キーストアのインポート

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

たとえば、次のコマンドを入力して、通常のJKSタイプのキーストアkey.jksから、PKCS #11タイプのハードウェアベースのキーストアにエントリをインポートします。

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

また、importkeystoreコマンドを使用して、ソース・キーストア内の単一のエントリをターゲット・キーストアにインポートすることもできます。この場合、前の例で使用したオプションに加え、インポート対象の別名を指定する必要があります。-srcaliasオプションを指定すると、次のように必要なターゲット別名、秘密鍵または非公開鍵の保護用パスワード、およびターゲットの保護用パスワードも指定できます。

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

SSLサーバー用の証明書の生成

次に、次の3つのエンティティの鍵ペアと証明書を生成するために使用するkeytoolコマンドを示します。

  • ルートCA (root)

  • 中間CA (ca)

  • SSLサーバー(server)

すべての証明書が同じキーストアに格納されていることを確認してください。次の例では、鍵アルゴリズムとしてRSAをお薦めします。

keytool -genkeypair -keystore root.jks -alias root -ext bc:c
keytool -genkeypair -keystore ca.jks -alias ca -ext bc:c
keytool -genkeypair -keystore server.jks -alias server
 
keytool -keystore root.jks -alias root -exportcert -rfc > root.pem
 
keytool -storepass password -keystore ca.jks -certreq -alias ca |
    keytool -storepass password -keystore root.jks
    -gencert -alias root -ext BC=0 -rfc > ca.pem
keytool -keystore ca.jks -importcert -alias ca -file ca.pem
 
keytool -storepass password -keystore server.jks -certreq -alias server |
    keytool -storepass password -keystore ca.jks -gencert -alias ca
    -ext ku:c=dig,kE -rfc > server.pem
cat root.pem ca.pem server.pem |
    keytool -keystore server.jks -importcert -alias server

用語

キーストア

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

キーストアのエントリ

キーストアには様々なタイプのエントリを含めることができます。keytoolコマンドでもっとも適用範囲の広いエントリ・タイプは、次の2つです。

鍵のエントリ - 各エントリは、非常に重要な暗号化の鍵の情報を保持します。この情報は、未許可のアクセスを防ぐために、保護された形で格納されます。一般に、このタイプのエントリに格納される鍵は、秘密鍵か、または対応する公開鍵の証明書チェーンを伴う非公開鍵です。「証明書チェーン」を参照してください。keytoolコマンドがこの両方のタイプのエントリを処理できるのに対し、jarsignerツールは後者のタイプのエントリ、つまり非公開鍵とそれに関連付けられた証明書チェーンのみを処理します。

信頼できる証明書のエントリ - 各エントリは、別のパーティに属する公開鍵証明書を1つ含んでいます。このエントリは信頼できる証明書と呼ばれます。これは、キーストアの所有者が、証明書内の公開鍵が証明書のサブジェクト(所有者)によって識別されたアイデンティティに属することを信頼しているためです。証明書の発行者は、証明書に署名を付けることによって、その内容を保証します。

キーストアの別名

キーストアのすべてのエントリ(鍵および信頼できる証明書のエントリ)は、一意の別名を介してアクセスされます。

別名を指定するのは、-genseckeyコマンドを使って秘密鍵を生成したり、-genkeypairコマンドを使って鍵ペア(公開鍵と非公開鍵)を生成したり、-importcertコマンドを使って証明書または証明書チェーンを信頼できる証明書のリストに追加したりするなど、特定のエンティティをキーストアに追加する場合です。これ以後、keytoolコマンドでエンティティを参照する場合は、このときに指定した別名を使用する必要があります。

たとえば、dukeという別名を使って新しい公開鍵と非公開鍵のペアを生成し、公開鍵を自己署名証明書でラップするには、次のコマンドを実行します。「証明書チェーン」を参照してください。

keytool -genkeypair -alias duke -keypass passwd

この例では、最初のpasswdを指定しています。このパスワードは、後続のコマンドで別名dukeに関連付けられた非公開鍵にアクセスする際に必要になります。Dukeの非公開鍵のパスワードを後で変更する場合は、次のようなコマンドを実行します。

keytool -keypasswd -alias duke -keypass passwd -new newpasswd

これは、最初のpasswdnewpasswdに変更しています。テストを目的とする場合、またはセキュアなシステムを使用している場合以外は、コマンド行やスクリプトでパスワードを指定しないでください。必要なパスワードのオプションをコマンド行で指定しなかった場合は、その入力を求められます。

キーストアの実装

java.securityパッケージで提供されるKeyStoreクラスには、キーストア内の情報に対するアクセスと変更を行うための明確に定義されたインタフェースが用意されています。複数の異なる固定実装を生成できます(それぞれ特定の型のキーストアを実装)。

現在、keytooljarsignerの2つのコマンド行ツールでキーストアの実装を使用しています。KeyStoreクラスはpublicであるため、ユーザーはこのクラスを使用する追加のセキュリティ・アプリケーションを作成できます。

JDK 9以降、デフォルトのキーストアの実装は、PKCS12です。これは、RSA PKCS12 Personal Information Exchange Syntax Standardに基づくクロス・プラットフォーム・キーストアです。この規格は、ユーザーの非公開鍵、証明書、その他の秘密を格納および転送することを主な目的としています。Oracleが提供する別の組込みの実装があります。これは、JKSという独自のキーストア・タイプ(形式)を使用してキーストアをファイルとして実装します。この実装では、個々の非公開鍵は個別のパスワードによって保護され、キーストア全体の整合性も(非公開鍵とは別の)パスワードによって保護されます。

キーストアの実装は、プロバイダ・ベースです。具体的には、KeyStoreで提供されるアプリケーション・インタフェースがService Provider Interface (SPI)という形で実装されています。つまり、対応するKeystoreSpi抽象クラスが(やはりjava.securityパッケージ内に)あり、プロバイダが実装する必要があるService Provider Interfaceメソッドを定義しています。プロバイダとは、Java Security APIによってアクセス可能なサービスのサブセットに対し、その固定実装を提供するパッケージまたはパッケージの集合のことです。キーストアの実装を提供するには、プロバイダを実装して統合する手順に関する項で説明されているように、クライアントがプロバイダを実装し、KeystoreSpiサブクラスの実装を提供する必要があります。

アプリケーションでは、KeyStoreクラスで提供されるgetInstanceファクトリ・メソッドを使うことで、様々なプロバイダから異なるタイプのキーストア実装を選択できます。キーストア・タイプは、キーストア情報の格納形式とデータ形式を定義するとともに、キーストア内の非公開/秘密鍵とキーストアの整合性を保護するために使われるアルゴリズムを定義します。異なるタイプのキーストアの実装には、互換性はありません。

keytoolコマンドは、任意のファイルベース・キーストア実装で動作します。コマンド行で渡されたキーストアの場所をファイル名として扱い、それをFileInputStreamに変換して、そこからキーストア情報をロードします。jarsignerコマンドは、URLで指定できる任意の場所からキーストアを読み取ることができます。

keytooljarsignerの場合は、-storetypeオプションを使ってコマンド行でキーストア・タイプを指定できます。

キーストアのタイプを明示的に指定しなかった場合、ツールはセキュリティ・プロパティ・ファイル内で指定されたkeystore.typeプロパティの値に基づいてキーストア実装を選択します。セキュリティ・プロパティ・ファイルは、java.securityという名前で、セキュリティ・プロパティ・ディレクトリにあります。

  • Oracle Solaris、LinuxおよびOS X: java.home/lib/security

  • Windows: java.home\lib\security

各ツールは、keystore.type値を取得してから、現在インストールされているすべてのプロバイダを調べて、そのタイプのキーストアを実装しているものを見つけます。その後、そのプロバイダのキーストアの実装を使用します。KeyStoreクラスには、アプリケーションとアプレットがkeystore.typeプロパティの値を取得するためのgetDefaultTypeという名前のstaticメソッドが定義されています。次のコード行は、keystore.typeプロパティで指定されたデフォルトのキーストア・タイプのインスタンスを生成します。

KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());

デフォルトのキーストア・タイプは、pkcs12で、RSA PKCS12 Personal Information Exchange Syntax Standardに基づいたクロス・プラットフォーム・キーストアです。これは、セキュリティ・プロパティ・ファイル内の次の行によって指定されています。

keystore.type=pkcs12

各ツールでデフォルト以外のキーストアの実装を使用するには、上の行を変更して別のキーストアのタイプを指定します。たとえば、Oracleのjksキーストアの実装を使用する場合は、行を次のとおり変更します。

keystore.type=jks

注意:

キーストア・タイプの指定では、大文字と小文字は区別されません。たとえば、JKSjksは同じものと見なされます。

証明書

証明書(または公開鍵証明書)とは、あるエンティティ(発行者)からのデジタル署名付きの文書のことです。証明書には、他のあるエンティティ(サブジェクト)の公開鍵およびその他の情報が特定の値を持っていることが書かれています。証明書に関連する用語は次のとおりです。

  • 公開鍵: 特定のエンティティに関連付けられた数値であり、そのエンティティとの間に信頼できる関係を持つ必要があるすべての人に対して公開することを意図したものです。公開鍵は、署名を検証するのに使われます。

  • デジタル署名: データがデジタル署名されると、そのデータは、エンティティのアイデンティティと、そのエンティティがデータの内容について知っていることを証明する署名とともに格納されます。エンティティの非公開鍵を使ってデータに署名を付けると、データの偽造は不可能になります。

  • アイデンティティ: エンティティを特定するための既知の方法です。システムによっては、公開鍵をアイデンティティにするものがあります。他にも、Oracle Solaris UIDや電子メール・アドレス、X.509識別名など、様々なものをアイデンティティにすることが可能です。

  • 署名: 署名は、エンティティの非公開鍵を使い、あるデータに対して計算されるものです。署名者は、証明書の場合は発行者とも呼ばれます。

  • 非公開鍵: 特定のエンティティのみが知っているはずの数値であり、その数値がそのエンティティの非公開鍵になります(つまり、秘密にしておく必要があります)。非公開鍵と公開鍵は、すべての公開鍵暗号化システムで対になって存在しています。DSAなどの典型的な公開鍵暗号化システムの場合、1つの非公開鍵は厳密に1つの公開鍵に対応します。非公開鍵は、署名を計算するのに使われます。

  • エンティティ: エンティティは、人、組織、プログラム、コンピュータ、企業、銀行など、一定の度合いで信頼の対象となる様々なものを指します。

公開鍵暗号化では、ユーザーの公開鍵にアクセスする必要があります。大規模なネットワーク環境では、互いに通信しているエンティティ間で以前の関係が確立されたことや、使われているすべての公開鍵を収めた信頼できるリポジトリが存在することは保証できません。このような公開鍵の配布に関する問題を解決するために証明書が考案されました。現在では、証明書発行局(CA)が信頼できる第三者として機能します。CAは、他のエンティティの証明書に署名(発行)することを信頼して任されている企業などのエンティティです。CAは法律上の契約に拘束されるので、有効かつ信頼できる証明書のみを作成するものとして扱われます。DigiCert、Comodo、Entrustなど、多数の公共の証明書発行局があります。

Microsoftの認証サーバーやEntrustのCA製品などを所属組織内で利用すれば、独自の証明書発行局を運営することも可能です。keytoolコマンドを使って、証明書の表示、インポートおよびエクスポートができます。また、自己署名証明書を生成することもできます。

現在、keytoolコマンドはX.509証明書を対象にしています。

X.509証明書

X.509規格では、証明書に含める情報が定義されており、この情報を証明書に書き込む方法(データ形式)についても記述されています。証明書のすべてのデータは、ASN.1/DERと呼ばれる2つの関連規格を使ってエンコードされます。Abstract Syntax Notation 1はデータについて記述しています。Definite Encoding Rulesはデータの保存および転送の方法について記述しています。

すべてのX.509証明書は、署名のほかに次のデータを含んでいます。

  • バージョン: 証明書に適用されるX.509規格のバージョンを特定します。証明書に指定できる情報は、バージョンによって異なります。これまでに、3つのバージョンが定義されています。keytoolコマンドでは、v1、v2およびv3の証明書のインポートとエクスポートが可能です。生成されるのは、v3の証明書です。

    • X.509 Version 1は、1988年から利用されて広く普及しており、もっとも一般的です。

    • X.509 Version 2では、サブジェクトや発行者の名前を後で再利用できるようにするために、サブジェクトと発行者の一意識別子の概念が導入されました。ほとんどの証明書プロファイル文書では、名前を再使用しないことと、証明書で一意な識別子を使用しないことが、強く推奨されています。Version 2の証明書は、広くは使用されていません。

    • X.509 Version 3はもっとも新しい(1996年)規格で、拡張機能の概念をサポートしています。拡張機能は、だれでも定義でき、証明書に含めることができます。一般的な拡張機能としては、KeyUsage (signing-onlyなど、鍵の使用を特定の目的に制限する)、AlternativeNames (DNS名、電子メール・アドレス、IPアドレスなど、他のアイデンティティをこの公開鍵に関連付けることができる)などがあります。拡張機能には、criticalというマークを付けて、その拡張機能のチェックと適用または使用を義務付けることができます。たとえば、criticalとマークされ、KeyCertSignが設定されたkeyCertSign拡張機能が証明書に含まれている場合、この証明書をSSL通信中に提示すると、証明書が拒否されます。これは、証明書の拡張機能によって、関連する非公開鍵が証明書の署名専用として指定されており、SSLでは使用できないためです。

  • シリアル番号: 証明書を作成したエンティティは、そのエンティティが発行する他の証明書と区別するために、証明書にシリアル番号を割り当てます。この情報は、様々な方法で使われます。たとえば、証明書が取り消されると、シリアル番号が証明書の取消しリスト(CRL)に格納されます。

  • 署名アルゴリズム識別子: 証明書に署名を付けるときにCAが使ったアルゴリズムを特定します。

  • 発行者名: 証明書に署名を付けたエンティティのX.500識別名です。これは、通常はCAです。この証明書を使うことは、証明書に署名を付けたエンティティを信頼することを意味します。ルートまたはトップ・レベルのCAの証明書など、発行者が自身の証明書に署名を付ける場合もあります。

  • 有効期間: 各証明書は、限られた期間のみ有効になります。この期間は開始の日時と終了の日時によって指定され、数秒の短い期間から100年という長期にわたることもあります。選択される有効期間は、証明書への署名に使われる非公開鍵の強度や証明書に支払う金額など、様々な要因で異なります。有効期間は、使用する非公開鍵が損なわれない場合に、エンティティが公開鍵を信頼できると期待される期間です。

  • サブジェクト名: 証明書で公開鍵が識別されているエンティティの名前です。この名前はX.500標準を使うので、インターネット全体で一意なものと想定されます。これは、エンティティのX.500識別名(DN)です。次に例を示します。

    CN=Java Duke, OU=Java Software Division, O=Oracle Corporation, C=US
    

    これらはそれぞれサブジェクトの共通名(CN)、組織単位(OU)、組織(O)および国(C)を表します。

  • サブジェクトの公開鍵情報: 名前を付けられたエンティティの公開鍵とアルゴリズム識別子です。アルゴリズム識別子は、この鍵が属する公開鍵暗号化システムと、関連する鍵パラメータを指定します。

証明書チェーン

keytoolコマンドでは、非公開鍵および関連する証明書チェーンを含むキーストアの鍵エントリを作成して管理できます。このようなエントリでは、非公開鍵に対応する公開鍵は、チェーンの最初の証明書に含まれています。

鍵を初めて生成すると、自己署名証明書という1つの要素のみを含むチェーンが開始されます。「コマンド」の-genkeypairを参照してください。自己署名証明書は、発行者(署名者)がサブジェクトと同じである証明書のことです。このサブジェクトは、証明書によって公開鍵が認証されるエンティティです。-genkeypairコマンドを呼び出して新しい公開鍵と非公開鍵のペアを作成すると、公開鍵は常に自己署名証明書でラップされます。

その後、-certreqコマンドを使って証明書署名要求(CSR)が生成され、証明書発行局(CA)に送信されると、CAからの応答が-importcertを使ってインポートされ、この自己署名証明書が証明書のチェーンによって置き換えられます。チェーンの最後にあるのは、Subjectの公開鍵を認証したCAが発行した証明書(応答)です。チェーン内のその次の証明書は、CAの公開鍵を認証する証明書です。

多くの場合、これは自己署名証明書(CAが自身の公開鍵を認証した証明書)であり、チェーンの最後の証明書です。場合によっては、CAが証明書のチェーンを返すこともあります。この場合、チェーン内の最後の証明書(CAによって署名され、鍵エントリの公開鍵を認証する証明書)に変わりはありませんが、チェーン内の2番目の証明書は、別のCAによって署名され、CSRの送信先のCAの公開鍵を認証する証明書になります。チェーン内の次の証明書は、2番目のCAの鍵を認証する証明書になります。以下同様に、自己署名されたルート証明書に達するまでチェーンが続きます。したがって、チェーン内の(最初の証明書以後の)各証明書では、チェーン内の前の証明書の署名者の公開鍵が認証されていることになります。

多くのCAは、チェーンをサポートせずに発行済の証明書のみを返します。特に、中間のCAが存在しないフラットな階層構造の場合は、その傾向が顕著です。このような場合は、キーストアにすでに格納されている信頼できる証明書情報から、証明書チェーンを確立する必要があります。

別の応答形式(PKCS #7標準で定義されている形式)には、発行済の証明書に加え、証明書チェーンのサポートが含まれています。keytoolコマンドでは、どちらの応答形式も扱うことができます。

トップ・レベル(ルート) CAの証明書は、自己署名証明書です。ただし、ルートの公開鍵に対する信頼は、ルートの証明書自体から導き出されるものではなく、新聞などの他の情報源に由来するものです。これは、だれでもDigiCertルートCAのような識別名を使用して自己署名証明書を生成できるためです。ルートCAの公開鍵は広く知られています。ルートCAの公開鍵を証明書に格納する理由は、証明書という形式にすることで多くのツールから利用できるようになるからにすぎません。つまり、この場合の証明書は、ルートCAの公開鍵を運ぶ媒体として利用されるだけです。ルートCAの証明書をキーストアに追加するときは、その前に-printcertオプションを使って証明書の内容を表示し、表示されたフィンガプリントを新聞やルートCAのWebページなどから入手した既知のフィンガプリントと比較する必要があります。

cacerts証明書ファイル

cacertsという証明書ファイルは、セキュリティ・プロパティ・ディレクトリにあります。

  • Oracle Solaris、LinuxおよびOS X: JAVA_HOME /lib/security

  • Windows: java.home\lib\security

java.homeは、ランタイム環境ディレクトリであり、これはJDKのjreディレクトリまたはJava Runtime Environment (JRE)の最上位ディレクトリです。

cacertsファイルは、CAの証明書を含むシステム全体のキーストアを表します。システム管理者は、キーストア・タイプにjksを指定することで、keytoolコマンドを使ってこのファイルの構成と管理を行うことができます。cacertsキーストア・ファイルは、一連のデフォルトのルートCA証明書を含んだ状態で出荷されています。Oracle Solaris、Linux、OS XおよびWindowsでは、次のコマンドを使用してデフォルトの証明書をリストできます。

keytool -list -cacerts 

cacertsキーストア・ファイルの初期パスワードは、changeitです。システム管理者は、SDKのインストール後、このファイルのパスワードとデフォルト・アクセス権を変更する必要があります。

注意:

cacertsファイルを検証することは重要です。cacertsファイル内のCAは、証明書の署名や他のエンティティへの発行を行うエンティティとして信頼されるため、cacertsファイルの管理は慎重に行う必要があります。cacertsファイルには、信頼するCAの証明書のみが含まれている必要があります。ユーザーは、自身の責任で、cacertsファイルにバンドルされている信頼できるルートCA証明書を検証し、信頼性に関する独自の決定を行います。

信頼できないCA証明書をcacertsファイルから削除するには、keytoolコマンドの-deleteオプションを使用します。cacertsファイルはJREのインストール・ディレクトリにあります。このファイルを編集するアクセス権がない場合は、システム管理者に連絡してください。

インターネットRFC 1421証明書エンコード規格

多くの場合、証明書は、バイナリ符号化ではなく、インターネットRFC 1421規格で定義されている出力可能符号化方式を使って格納されます。Base64エンコードとも呼ばれるこの証明書形式では、電子メールやその他のメカニズムを通じて、他のアプリケーションに証明書を容易にエクスポートできます。

-importcertコマンドと-printcertコマンドでは、この形式の証明書とバイナリ符号化の証明書を読み込むことができます。-exportcertコマンドでは、デフォルトでバイナリ・エンコードの証明書が出力されます。ただし、-rfcオプションを指定した場合は、出力可能エンコード形式の証明書が出力されます。

デフォルトでは、-listコマンドは証明書のSHA-256フィンガプリントを出力します。-vオプションを指定すると、人間が読むことのできる形式で証明書が出力されます。-rfcオプションを指定すると、出力可能エンコード形式で証明書が出力されます。

出力可能エンコード形式でエンコードされた証明書の先頭と末尾は、次のテキストで指定されます。

-----BEGIN CERTIFICATE-----

encoded certificate goes here. 

-----END CERTIFICATE-----
X.500識別名

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

  • commonName - 人の共通名(Susan Jonesなど)。

  • organizationUnit: 小さな組織(部、課など)の名称。たとえば、Purchasing (仕入部)など。

  • localityName: 地域(都市)名(Palo Altoなど)。

  • stateName: 州名または地方名(Californiaなど)。

  • country: 2文字の国コード(CHなど)。

(-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=Java, O=Oracle, L=Cupertino, S=California, C=US

このような文字列を使ったコマンドの例を次に示します。

keytool -genkeypair -dname "CN=Mark Smith, OU=Java, O=Oracle, L=Cupertino,
S=California, C=US" -alias mark

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

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

CN=Smith, OU=Java, O=Oracle, C=US

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

cn=Jack, ou=Java\, Product Development, o=Oracle, c=US

識別名文字列をコマンド行で指定する必要はありません。識別名を必要とするコマンドを実行するときに、コマンド行で識別名を指定しなかった場合は、ユーザーが各サブコンポーネントについて入力を求められます。この場合は、カンマをバックスラッシュ(\)でエスケープする必要はありません。

警告

信頼できる証明書のインポートに関する警告

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

Windowsの例:

まず、-printcertコマンドを使用するか、または-nopromptオプションを指定せずに-importcertコマンドを使用して、証明書を表示します。表示された証明書のフィンガプリントが期待されるフィンガプリントと一致するかどうかを確認します。たとえば、あるユーザーから電子メールなどで証明書が送られてきて、それを\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 Jun 24 18:01:13 PDT 2016 until: Wed Jun 23 17:01:13 PST 2016
    Certificate Fingerprints:

                   SHA-1: 20:B6:17:FA:EF:E5:55:8A:D0:71:1F:E8:D6:9D:C0:37:13:0E:5E:FE 
                 SHA-256: 90:7B:70:0A:EA:DC:16:79:92:99:41:FF:8A:FE:EB:90:
                          17:75:E0:90:B2:24:4D:3A:2A:16:A6:E4:11:0F:67:A4

Oracle Solarisの例:

まず、-printcertコマンドを使用するか、または-nopromptオプションを指定せずに-importcertコマンドを使用して、証明書を表示します。表示された証明書のフィンガプリントが期待されるフィンガプリントと一致するかどうかを確認します。たとえば、あるユーザーから電子メールなどで証明書が送られてきて、それを/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 Jun 24 18:01:13 PDT 2016 until: Wed Jun 23 17:01:13 PST 2016
    Certificate Fingerprints:

                   SHA-1: 20:B6:17:FA:EF:E5:55:8A:D0:71:1F:E8:D6:9D:C0:37:13:0E:5E:FE 
                   SHA-256: 90:7B:70:0A:EA:DC:16:79:92:99:41:FF:8A:FE:EB:90:
                           17:75:E0:90:B2:24:4D:3A:2A:16:A6:E4:11:0F:67:A4

次に、証明書を送信した人物に連絡し、この人物が提示したフィンガプリントと、上のコマンドで表示されたフィンガプリントとを比較します。フィンガプリントが一致した場合にのみ、送信途中で他の何者かの証明書(攻撃者の証明書など)ですり替えられていないことを保証できます。このような攻撃が行われていた場合、チェックを行わずに証明書をインポートすると、攻撃者によって署名されたすべてのもの(攻撃的意図を持つクラス・ファイルを含んだJARファイルなど)を信頼することになります。

注意:

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

パスワードに関する警告

キーストアに対する操作を行うほとんどのコマンドでは、ストアのパスワードが必要です。また、一部のコマンドでは、非公開/秘密鍵のパスワードが必要になることがあります。パスワードは、コマンド行の-storepassおよび-keypassオプションで指定できます。ただし、テストを目的とする場合、またはセキュアなシステムを使用している場合以外は、コマンド行やスクリプトでパスワードを指定しないでください。必要なパスワードのオプションをコマンド行で指定しなかった場合は、その入力を求められます。

証明書の適合性に関する警告

インターネットX.509公開鍵インフラストラクチャ証明書および証明書失効リスト(CRL)プロファイルでは、適合するX.509証明書に関するプロファイルを定義しており、これには、証明書のフィールドや拡張機能で有効な値や値の組合せが含まれています。

keytoolコマンドでは、これらの規則がすべて適用されているわけではないので、内部テスト目的で使用する自己署名証明書など、標準に準拠しない証明書が生成される可能性があります。標準に準拠しない証明書は、JREやその他のアプリケーションで拒否されることがあります。ユーザーは、-dname-extなどに必ず正しいオプションを指定するようにしてください。

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

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

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

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

証明書応答のインポート

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

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

  • 証明書応答が単一のX.509証明書である場合、keytoolコマンドは証明書応答から(ルートCAに属する)自己署名証明書までの信頼チェーンの確立を試みます。証明書応答と証明書の階層構造は、別名の新しい証明書チェーンからの証明書応答を認証するために使われます。信頼チェーンが確立されない場合、証明書応答はインポートされません。この場合、keytoolコマンドは証明書を出力せず、ユーザーに確認を求めます。これは、証明書応答が本物かどうかをユーザーが判定するのは非常に難しいためです。

  • 証明書応答がPKCS #7形式の証明書チェーンまたはX.509証明書のシーケンスである場合は、ユーザー証明書が最初で、次に0個以上のCA証明書が続くようにチェーンが並べ替えられます。チェーンが自己署名のルートCA証明書で終わり、 -trustcacertsオプションが指定されている場合、keytoolコマンドは、その証明書と、キーストア内またはcacertsキーストア・ファイル内の信頼できるすべての証明書を照合しようとします。チェーンの最後がルートCAの自己署名証明書ではなく、-trustcacertsオプションが指定された場合、keytoolコマンドは、キーストア内またはcacertsキーストア・ファイル内の信頼できる証明書からルートCAの自己署名証明書を見つけ、チェーンの最後に追加しようとします。証明書が見つからず、-nopromptオプションが指定されてない場合は、チェーンの最後の証明書に関する情報が出力され、ユーザーはそれを確認するように求められます。

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

このコマンドは、以前のリリースでは-importという名前でした。この古い名前は、このリリースでも引き続きサポートされています。新しい名前である-importcertを使用することをお薦めします。