keytoolコマンド

機械翻訳について

名前

keytool - キーおよび証明書管理ユーティリティ

シノプシス

keytool [commands]

commands

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

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

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

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

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

  • -genkeypair: キー・ペアを生成します

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

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

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

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

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

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

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

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

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

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

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

  • -showinfo: セキュリティ関連情報を表示

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

説明

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

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

また、keytoolコマンドを使用して、対称暗号化および復号化(データ暗号化規格)で使用される秘密キーとパスフレーズを管理することもできます。 他のセキュリティ関連情報も表示されます。

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

keytoolコマンドは、jdk.certpath.disabledAlgorithmsおよびjdk.security.legacyAlgorithmsセキュリティ・プロパティを使用して、セキュリティ・リスクとみなされるアルゴリズムを決定します。 無効化されたアルゴリズムまたはレガシー・アルゴリズムが使用されている場合は、警告が表示されます。 jdk.certpath.disabledAlgorithmsおよびjdk.security.legacyAlgorithmsのセキュリティ・プロパティは、java.securityファイル(JDK $JAVA_HOME/conf/securityディレクトリにあります)で定義されます。

コマンドとオプションに関するノート

次のノートは、コマンドとオプションの説明に適用されます。

コマンドとオプション

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

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

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

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

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

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

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

セキュリティ関連情報を表示するためのコマンド:

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

-gencert

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

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

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

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

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

  • {-sigalg sigalg}: シグネチャ・アルゴリズム名

  • {-dname dname}: 識別名

  • {-startdate startdate}: 証明書妥当性の開始日時

  • {-ext ext}*: X.509 extension

  • {-validity days}: 有効日数

  • [-keypass arg]: キー・パスワード

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

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

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

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

  • {-addprovider name [-providerarg arg]}: オプションのconfigure引数を使用して、セキュリティ・プロバイダをname (例SunPKCS11)で追加します。 セキュリティ・プロバイダの値はモジュールで定義されているセキュリティ・プロバイダの名前です。

    次に例を示します。

    keytool -addprovider SunPKCS11 -providerarg some.cfg ...

    ノート:

    互換性の理由から、SunPKCS11プロバイダは、モジュールで定義されている場合でも、-providerclass sun.security.pkcs11.SunPKCS11を使用してロードできます。 これは、構成が必要なJDKに含まれている唯一のモジュールであるため、-providerclassオプションで最も広く使用されています。 クラス・パスに配置され、リフレクションによってロードされるレガシー・セキュリティ・プロバイダには、引き続き-providerclassを使用する必要があります。

  • {-providerclass class [-providerarg arg]}: オプションのconfigure引数を使用して、完全修飾クラス名でセキュリティ・プロバイダを追加します。

    たとえば、MyProviderがリフレクションを介してロードされるレガシー・プロバイダの場合、

    keytool -providerclass com.example.MyProvider ...

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

  • {-v}: 詳細出力

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

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

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

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

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

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

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

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

次の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}: キー・ビット・サイズ

  • {-groupname name}: グループ名。 たとえば、楕円曲線名です。

  • {-sigalg alg}: シグネチャ・アルゴリズム名

  • [-dname name]: 識別名

  • {-startdate date}: 証明書妥当性の開始日時

  • {-ext value}*: X.509 extension

  • {-validity days}: 有効日数

  • [-keypass arg]: キー・パスワード

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

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

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

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

  • {-addprovider name [-providerarg arg]}: オプションのconfigure引数を使用して、名前(例SunPKCS11)でセキュリティ・プロバイダを追加します。

  • {-providerclass class [-providerarg arg] }: オプションのconfigure引数を使用して、完全修飾クラス名でセキュリティ・プロバイダを追加します。

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

  • {-v}: 詳細出力

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

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

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

-groupnameの値は、生成するキーの名前付きグループ(たとえば、楕円曲線の標準名または事前定義名)を指定します。 -groupnameおよび-keysizeのいずれか1つのみを指定できます。

-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]}: オプションのconfigure引数を使用して、名前(例SunPKCS11)でセキュリティ・プロバイダを追加します。

  • {-providerclass class [-providerarg arg]}: オプションのconfigure引数を使用して、完全修飾クラス名でセキュリティ・プロバイダを追加します。

  • {-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]}: オプションのconfigure引数を使用して、名前(例SunPKCS11)でセキュリティ・プロバイダを追加します。

  • {-providerclass class [-providerarg arg]}: オプションのconfigure引数を使用して、完全修飾クラス名でセキュリティ・プロバイダを追加します。

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

  • {-v}: 詳細出力

-importcertコマンドを使用して証明書または証明書チェーン(後者がPKCS#7形式の返信またはX.509証明書のシーケンスで提供されます。)を-file fileから読み取り、-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]}: オプションのconfigure引数を使用して、名前(例SunPKCS11)でセキュリティ・プロバイダを追加します。

  • {-providerclass class [-providerarg arg]}: オプションのconfigure引数を使用して、完全修飾クラス名でセキュリティ・プロバイダを追加します。

  • {-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]: オプションのconfigure引数を使用して、名前(例SunPKCS11)でセキュリティ・プロバイダを追加します。

  • {-providerclass class [-providerarg arg]}: オプションのconfigure引数を使用して、完全修飾クラス名でセキュリティ・プロバイダを追加

  • {-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 extension

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

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

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

  • {-addprovider name [-providerarg arg]}: オプションのconfigure引数を使用して、名前(例SunPKCS11)でセキュリティ・プロバイダを追加します。

  • {-providerclass class [-providerarg arg]}: オプションのconfigure引数を使用して、完全修飾クラス名でセキュリティ・プロバイダを追加します。

  • {-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]}: オプションのconfigure引数を使用して、名前(例SunPKCS11)でセキュリティ・プロバイダを追加します。

  • {-providerclass class [-providerarg arg] }: オプションのconfigure引数を使用して、完全修飾クラス名でセキュリティ・プロバイダを追加します。

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

  • {-v}: 詳細出力

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

-exportcertコマンドを使用して、-alias aliasに関連付けられたキーストアから証明書を読み取り、-file 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]}: オプションのconfigure引数を使用して、名前(例SunPKCS11)でセキュリティ・プロバイダを追加します。

  • {-providerclass class [-providerarg arg] }: オプションのconfigure引数を使用して、完全修飾クラス名でセキュリティ・プロバイダを追加します。

  • {-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ファイル

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

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

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

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

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

  • {-addprovider name [-providerarg arg]}: オプションのconfigure引数を使用して、名前(例SunPKCS11)でセキュリティ・プロバイダを追加します。

  • {-providerclass class [-providerarg arg]}: オプションのconfigure引数を使用して、完全修飾クラス名でセキュリティ・プロバイダを追加します。

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

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

  • {-v}: 詳細出力

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

ノート:

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

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

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

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

ノート:

このコマンドは、キーストアとは別に使用できます。 このコマンドは、証明書シグネチャ・アルゴリズムがユーザー・キーストア(-keystoreで指定)またはcacertsキーストア(-trustcacertsを指定した場合)内の信頼できる証明書であるかどうかはチェックしません。

-printcertreq

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

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

  • {-v}: 詳細出力

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

-printcrl

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

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

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

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

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

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

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

  • {-addprovider name [-providerarg arg]}: オプションのconfigure引数を使用して、名前(例SunPKCS11)でセキュリティ・プロバイダを追加します。

  • {-providerclass class [-providerarg arg]}: オプションのconfigure引数を使用して、完全修飾クラス名でセキュリティ・プロバイダを追加します。

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

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

  • {-v}: 詳細出力

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

ノート:

このコマンドは、キーストアとは別に使用できます。 このコマンドは、ユーザー・キーストア(-keystoreで指定)またはcacertsキーストア(-trustcacertsを指定した場合)の証明書を使用してCRLを検証しようとし、検証できない場合は警告を出力します。

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

-storepasswd

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

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

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

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

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

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

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

  • {-addprovider name [-providerarg arg]}: オプションのconfigure引数を使用して、名前(例SunPKCS11)でセキュリティ・プロバイダを追加します。

  • {-providerclass class [-providerarg arg]}: オプションのconfigure引数を使用して、完全修飾クラス名でセキュリティ・プロバイダを追加します。

  • {-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]}: オプションのconfigure引数を使用して、名前(例SunPKCS11)でセキュリティ・プロバイダを追加します。

  • {-providerclass class [-providerarg arg]}: オプションのconfigure引数を使用して、完全修飾クラス名でセキュリティ・プロバイダを追加します。

  • {-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]}: オプションのconfigure引数を使用して、名前(例SunPKCS11)でセキュリティ・プロバイダを追加します。

  • {-providerclass class [-providerarg arg]}: オプションのconfigure引数を使用して、完全修飾クラス名でセキュリティ・プロバイダを追加します。

  • {-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]}: オプションのconfigure引数を使用して、名前(例SunPKCS11)でセキュリティ・プロバイダを追加します。

  • {-providerclass class [-providerarg arg]}: オプションのconfigure引数を使用して、完全修飾クラス名でセキュリティ・プロバイダを追加します。

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

  • {-v}: 詳細出力

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

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

-showinfo

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

  • {-tls}: TLS構成情報を表示

  • {-v}: 詳細出力

-showinfoコマンドを使用すると、様々なセキュリティ関連情報を表示できます。 -tlsオプションには、有効なプロトコルや暗号スイートのリストなど、TLS構成が表示されます。

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

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

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

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

-J option引数は、任意のコマンドに使用できます。 -J optionを使用する場合、指定した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
セキュリティ・プロパティ・ファイル内に含まれる暗号化サービス・プロバイダ名を特定するために使用されます。
-addprovider name
名前(SunPKCS11など)でセキュリティ・プロバイダを追加する場合に使用されます。
-providerclass class
セキュリティ・プロパティ・ファイルにサービス・プロバイダが表示されていない場合に、暗号サービス・プロバイダ・マスター・クラス・ファイルの名前を指定するために使用されます。
-providerpath list
プロバイダのクラス・パスを指定するために使用されます。
-providerarg arg
-addproviderまたは-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を使用できます。
-conf file
事前構成済のオプション・ファイルを指定します。

事前構成済のオプション・ファイル

事前構成済のオプション・ファイルは、-confオプションを使用して指定できるJavaプロパティ・ファイルです。 各プロパティは、"keytool.command_name"をプロパティ名として使用するkeytoolコマンドのデフォルト・オプションを表します。 "keytool.all"という特別なプロパティは、すべてのコマンドに適用されるデフォルトのオプションを表します。 プロパティの値には、関連付けられているシステム・プロパティに拡張される${prop}を含めることができます。 オプション値の内部に空白が含まれている場合は、("または')で引用符で囲む必要があります。 すべてのプロパティ名は小文字である必要があります。

事前構成されたオプション・ファイルを使用してkeytoolを起動すると、"keytool.all" (それが存在する場合)の値が最初にkeytoolコマンドラインに追加されます。コマンド名(それが存在する場合)の値が次に表示され、コマンドラインの既存のオプションが最後に追加されます。 単一値のオプションの場合、これによって、特定のコマンドのプロパティで"keytool.all"の値をオーバーライドでき、コマンド行で指定された値で両方をオーバーライドできます。 複数値オプションの場合、これらのすべてがkeytoolによって使用されます。

たとえば、次のようなpreconfigという名前のファイルがあるとします。

    # A tiny pre-configured options file
    keytool.all = -keystore ${user.home}/ks
    keytool.list = -v
    keytool.genkeypair = -keyalg rsa

keytool -conf preconfig -listは次と同じです

keytool -keystore ~/ks -v -list

keytool -conf preconfig -genkeypair -alias meは次と同じです

keytool -keystore ~/ks -keyalg rsa -genkeypair -alias me

keytool -conf preconfig -genkeypair -alias you -keyalg ecは次と同じです

keytool -keystore ~/ks -keyalg rsa -genkeypair -alias you -keyalg ec

これは次の構文と同じ意味です。

keytool -keystore ~/ks -genkeypair -alias you -keyalg ec

-keyalgは単一値のオプションであり、コマンドラインで指定されたec値が事前構成済のオプション・ファイルをオーバーライドするためです。

オプション値の例

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

-alias "mykey"

-keysize
    2048 (when using -genkeypair and -keyalg is "RSA", "DSA", or "RSASSA-PSS")
    256 (when using -genkeypair and -keyalg is "EC")
    255 (when using -genkeypair and -keyalg is "EdDSA")
    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 SHA256withRSA
<= 7680 SHA384withRSA
> 7680 SHA512withRSA
EC < 384 SHA256withECDSA
< 512 SHA384withECDSA
= 512 SHA512withECDSA
RSASSA-PSS <= 3072 RSASSA-PSS (SHA-256を使用)
<= 7680 RSASSA-PSS (SHA-384を使用)
> 7680 RSASSA-PSS (SHA-512を使用)
EdDSA 255 Ed25519
448 Ed448
Ed25519 255 Ed25519
Ed448 448 Ed448

ノート:

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

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

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

BCまたはBasicContraints

値:

完全な形式は、ca:{true | false}[,pathlen: len]またはlenで、ca:true,pathlen: 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 -keyalg rsa -keypass password -keystore /working/mykeystore -storepass password -validity 180

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

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

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

keytool -genkeypair -keyalg rsa

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

ノート:

残りの例では、最初の-genkeypairコマンドで指定された値と等しい値を使用してプロンプトに応答したと想定しています。 たとえば、cn= myname mygroup , 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であり、ファイルはCA公開鍵を認証する自己署名証明書であると想定されている、X.cerファイルを会社から取得したとします。 信頼できる証明書としてその証明書をインポートする前に、証明書が有効であることを確認する必要があります。

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

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

    フィンガープリントが等しい場合のみ、証明書がなんらかの形の証明書(攻撃者証明書など)を使用して移動中に置換されていないことが保証されます。 このような攻撃が行われていた場合、チェックを行わずに証明書をインポートすると、攻撃者によって署名されたすべてのものを信頼することになります。

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

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

    keytool -importcert -alias alias -file *X*.cer`

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

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コマンドを示します。

すべての証明書が同じキーストアに格納されていることを確認してください。

keytool -genkeypair -keystore root.jks -alias root -ext bc:c -keyalg rsa
keytool -genkeypair -keystore ca.jks -alias ca -ext bc:c -keyalg rsa
keytool -genkeypair -keystore server.jks -alias server -keyalg rsa

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 -keyalg rsa -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が提供する組み込みの実装がもう1つあります。 これは、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という名前で、セキュリティ・プロパティ・ディレクトリにあります。

  • 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という証明書ファイルは、セキュリティ・プロパティ・ディレクトリにあります。

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

  • Windows: JAVA_HOME\lib\security

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

keytool -list -cacerts

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

ノート:

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

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

インターネット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 -keyalg rsa

キーワードの短縮形では、大文字と小文字は区別されません。 たとえば、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

Linuxの例:

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

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

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

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

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

証明書応答のインポート

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

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

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

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