名前
keytool - キーおよび証明書管理ユーティリティ
シノプシス
keytool [commands]
- commands
- 
keytoolのコマンドには次のものがあります:- -certreq: 証明書リクエストを生成
- -changealias: エントリの別名を変更
- -delete: エントリを削除
- -exportcert: 証明書をエクスポート
- -genkeypair: キー・ペアを生成
- -genseckey: 秘密キーを生成
- -gencert: 証明書リクエストから証明書を生成
- -importcert: 証明書または証明書チェーンをインポート
- -importpass: パスワードをインポート
- -importkeystore: 別のキーストアから1つまたはすべてのエントリをインポート
- -keypasswd: エントリのキー・パスワードを変更
- -list: キーストア内のエントリをリスト
- -printcert: 証明書の内容を出力
- -printcertreq: 証明書リクエストの内容を出力
- -printcrl: 証明書失効リスト(CRL)ファイルのコンテンツを出力
- -storepasswd: キーストアのストア・パスワードを変更
- -showinfo: セキュリティ関連情報を表示
- -version: プログラム・バージョンを印刷
 これらのコマンドとそのオプションの説明は、コマンドとオプションを参照してください。 
説明
keytoolコマンドは、キーと証明書を管理するためのユーティリティです。 これを使用すると、ユーザーはデジタル署名を使用して、自己認証(ユーザーが他のユーザーおよびサービスに対して自分自身を認証する)やデータ整合性および認証サービスで使用する自分の公開/秘密キー・ペアと関連する証明書を管理できます。 keytoolコマンドでは、通信相手の公開キーを(証明書の形で)キャッシュすることもできます。 
証明書とは、あるエンティティ(人、会社など)が発行したデジタル署名付きの文書で、別のエンティティの公開キー(およびその他の情報)が特定の値であることを証明しています。 データにデジタル署名が付いている場合は、デジタル署名を検証することで、データの整合性およびデータが本物であることをチェックできます。 データの整合性とは、データが変更されたり改変されていないことを意味します。また、データが本物であるとは、そのデータが、データを作成して署名したと称する個人から渡されたデータであることを意味します。
keytoolコマンドを使用すると、ユーザーは対称暗号化および復号化(データ暗号化Standard)で使用される秘密キーおよびパスフレーズを管理することもできます。 他のセキュリティ関連情報も表示されます。 
keytoolコマンドは、キーと証明書をキーストアに格納します。
keytoolコマンドは、jdk.certpath.disabledAlgorithmsおよびjdk.security.legacyAlgorithmsセキュリティ・プロパティを使用して、セキュリティ・リスクとみなされるアルゴリズムを決定します。 無効化されたアルゴリズムまたはレガシー・アルゴリズムが使用されている場合は、警告が表示されます。 jdk.certpath.disabledAlgorithmsおよびjdk.security.legacyAlgorithmsのセキュリティ・プロパティは、java.securityファイル(JDK $JAVA_HOME/conf/securityディレクトリにあります)で定義されます。 
コマンドとオプションに関するノート
次のノートは、コマンドとオプションの説明に適用されます。
- すべてのコマンド名およびオプション名の前にハイフン( - -)が付きます。
- 指定できるコマンドは1つのみです 
- 各コマンドのオプションは、任意の順序で指定できます。 
- オプションには2種類あり、1つは単一値のオプションで、1回だけ指定します。 単一値のオプションを複数回指定した場合は、最後に指定したオプションの値が使用されます。 もう1つは複数値のタイプで、これは複数回指定でき、すべての値が使用されます。 現在サポートされているマルチ・バリュー・オプションは、X.509v3証明書拡張の生成に使用される - -extオプションだけです。
- イタリック体になっていないか、中カッコ({ })か角カッコ([ ])で囲まれているすべての項目は、そのとおりに指定する必要があります。 
- オプションを囲む中カッコは、そのオプションをコマンド行で指定しなかったときに、デフォルト値が使用されることを意味します。 中括弧は、 - -v、- -rfc、および- -Jオプションの周りでも使用されます。これらのオプションは、コマンド行に表示されている場合にのみ意味を持ちます。 これらには、デフォルト値はありません。
- オプションを囲む角カッコは、そのオプションをコマンド行で指定しなかった場合に、ユーザーが値の入力を求められることを意味します。 - -keypassオプションの場合、コマンドラインでオプションを指定しない場合、- keytoolコマンドはまずキーストア・パスワードを使用して秘密/秘密キーのリカバリを試みます。 この試みが失敗すると、- keytoolコマンドはユーザーに対して非公開/秘密キーのパスワードの入力を求めます。
- イタリック体の項目の実際の値(オプションの値)は、ユーザーが指定する必要がある。 たとえば、 - -printcertコマンドの形式は次のとおりである- keytool -printcert{- -filecert_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
- -showinfo
- -version
キーストアに対してデータを作成または追加するためのコマンド
- -gencert
- 
-gencertコマンドで使用可能なオプションは、次のとおりです:- { - -rfc}: Request For Comment (RFC)スタイルの出力
- { - -infileinfile}: 入力ファイル名
- { - -outfileoutfile}: 出力ファイル名
- { - -aliasalias}: 処理するエントリの別名
- { - -sigalgsigalg}: シグネチャ・アルゴリズム名
- { - -dnamedname}: 識別名
- { - -startdatestartdate}: 証明書妥当性の開始日時
- { - -extext}*: X.509 extension
- { - -validitydays}: 有効日数
- [ - -keypassarg]: キー・パスワード
- { - -keystorekeystore}: キーストア名
- [ - -storepassarg]: キーストア・パスワード
- { - -storetypetype}: キーストア・タイプ
- { - -providernamename}: プロバイダ名
- { - -addprovidername [- -providerargarg]}: オプションのconfigure引数を使用して、セキュリティ・プロバイダをname (例SunPKCS11)で追加します。 セキュリティ・プロバイダの値はモジュールで定義されているセキュリティ・プロバイダの名前です。- たとえば、 - keytool -addprovider SunPKCS11 -providerarg some.cfg ...- ノート: - 互換性の理由から、SunPKCS11プロバイダは、モジュールで定義されている場合でも、 - -providerclass sun.security.pkcs11.SunPKCS11を使用してロードできます。 これは、構成が必要なJDKに含まれている唯一のモジュールであるため、- -providerclassオプションで最も広く使用されています。 クラスパスにあり、リフレクションによってロードされるレガシー・セキュリティ・プロバイダの場合、- -providerclassを引き続き使用する必要があります。
- { - -providerclassclass [- -providerargarg]}: オプションのconfigure引数を使用して、完全修飾クラス名でセキュリティ・プロバイダを追加します。- たとえば、 - MyProviderがリフレクションを介してロードされるレガシー・プロバイダの場合、- keytool -providerclass com.example.MyProvider ...
- { - -providerpathlist}: プロバイダ・クラスパス
- { - -v}: 詳細出力
- { - -protected}: 保護されているメカニズムで提供されるパスワード
 -gencertコマンドを使用して、証明書リクエスト・ファイル(keytool -certreqコマンドで作成できる)へのレスポンスとして証明書を生成します。 このコマンドは、infileまたは省略されている場合は、このリクエストを標準入力から読み取り、別名秘密キーを使用して署名し、X.509証明書をoutfileまたは省略されている場合はどちらかの標準出力に出力します。-rfcが指定された場合の出力形式は、Base64でエンコードされたPEMです。それ以外の場合は、バイナリDERが作成されます。-sigalg値は、証明書の署名に使用するアルゴリズムを指定します。 startdate引数は、証明書の有効開始日時です。 days引数は、証明書が有効と見なされる日数を示します。dnameを指定すると、生成される証明書の主体として使用されます。 そうでない場合は、証明書要求の名前が使われます。 -ext値は、証明書に埋め込まれるX.509拡張機能を示します。-extの文法については、「共通コマンド・オプション」を参照してください。-gencertオプションを使用して、証明書チェーンを作成できます。 次の例では、証明書チェーンに3つの証明書を含むe1という証明書を作成します。次のコマンドでは、 ca、ca1、ca2、および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つのコマンドでは、署名付き証明書のチェーンを作成します。 caがca1に署名し、ca1がca2に署名し、これらのすべてが自己発行されます。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を作成し、e1.certファイルに格納します。このファイルは、ca2によって署名されます。 この結果、e1の証明書チェーンにはca、ca1、およびca2が含まれることになります。keytool -alias e1 -certreq | keytool -alias ca2 -gencert > e1.cert
- -genkeypair
- 
-genkeypairコマンドで使用可能なオプションは、次のとおりです:- { - -aliasalias}: 処理するエントリの別名
- -keyalgalg: キー・アルゴリズム名
- { - -keysizesize}: キー・ビット・サイズ
- { - -groupnamename}: グループ名。 たとえば、楕円曲線名です。
- { - -sigalgalg}: シグネチャ・アルゴリズム名
- { - -signeralias}: 署名者別名
- [ - -signerkeypassarg]: 署名者キー・パスワード
- [ - -dnamename]: 識別名
- { - -startdatedate}: 証明書妥当性の開始日時
- { - -extvalue}*: X.509 extension
- { - -validitydays}: 有効日数
- [ - -keypassarg]: キー・パスワード
- { - -keystorekeystore}: キーストア名
- [ - -storepassarg]: キーストア・パスワード
- { - -storetypetype}: キーストア・タイプ
- { - -providernamename}: プロバイダ名
- { - -addprovidername [- -providerargarg]}: オプションのconfigure引数を使用して、名前(例SunPKCS11)でセキュリティ・プロバイダを追加します。
- { - -providerclassclass [- -providerargarg] }: オプションのconfigure引数を使用して、完全修飾クラス名でセキュリティ・プロバイダを追加します。
- { - -providerpathlist}: プロバイダ・クラスパス
- { - -v}: 詳細出力
- { - -protected}: 保護されているメカニズムで提供されるパスワード
 -genkeypairコマンドを使用して、キー・ペア(公開キーおよび関連する秘密キー)を生成します。-signerオプションを指定しない場合、公開キーはX.509 v3自己署名付き証明書にラップされ、単一要素証明書チェーンとして格納されます。-signerオプションを指定すると、指定された署名者が新しい証明書を生成して署名し、複数要素の証明書チェーン (生成された証明書自体と署名者の証明書チェーンを含む)として保存します。 証明書チェーンと非公開キーは、その別名で識別される新しいキーストア・エントリに格納されます。-keyalg値は、キー・ペアの生成に使用するアルゴリズムを指定します。-keysize値は、生成される各キーのサイズを指定します。-groupname値は、生成されるキーの名前付きグループ(たとえば、楕円曲線の標準または事前定義済の名前)を指定します。-keysize値を指定すると、initialize(int keysize)メソッドを使用してKeyPairGeneratorオブジェクトを初期化するために使用されます。-groupname値を指定すると、paramsがnew NamedParameterSpec(groupname)であるinitialize(AlgorithmParameterSpec params)メソッドを使用してKeyPairGeneratorオブジェクトを初期化するために使用されます。-groupnameと-keysizeのいずれか1つだけを指定できます。 アルゴリズムに同じキー・サイズを持つ複数の名前付きグループがある場合は、通常、-groupnameオプションを使用する必要があります。 この場合、-keysizeを指定すると、キー・ペアの生成時にどの名前付きグループが選択されるかは、セキュリティ・プロバイダによって決まります。-sigalg値は、証明書の署名に使用するアルゴリズムを指定します。 このアルゴリズムは、-keyalg値と互換性がある必要があります。-signer値は、キーストアにすでに存在する署名者のPrivateKeyEntryの別名を指定します。 このオプションは、署名者の秘密キーで証明書に署名するために使用されます。 これは、キー契約アルゴリズム(つまり、-keyalg値はXDH,X25519,X448またはDHです)で特に役立ちます。これらのキーはデジタル・シグネチャに使用できないため、自己シグネチャ証明書を作成できません。-signerkeypass値は、署名者の秘密キーのパスワードを指定します。 署名者エントリの秘密キーがストア・パスワードとは異なるパスワードで保護されている場合に指定できます。-dname値は、-aliasの値に関連付けるX.500識別名を指定します。-signerオプションが指定されていない場合、自己署名証明書の発行者およびサブジェクト・フィールドには、指定された識別名が設定されます。-signerオプションが指定されている場合、証明書のサブジェクト・フィールドには指定された識別名が表示され、発行者フィールドには署名者の証明書のサブジェクト・フィールドが移入されます。 コマンド行で識別名を指定しなかった場合、ユーザーに識別名の入力が求められます。-keypassの値は、生成されたキー・ペアの秘密キーを保護するために使用されるパスワードです。 パスワードを指定しなかった場合は、ユーザーにその入力が求められます。 プロンプトで[Return]キーを押すと、キーのパスワードがキーストアのパスワードと同じパスワードに設定されます。-keypass値には6文字以上が必要です。-startdateの値は、X.509証明書の有効性フィールドの"前にない"値とも呼ばれる、証明書の問題時間を指定します。このオプションの値は、次のいずれかの形式で設定できます。 ([ +-]nnn[ymdHMS])+[yyyy /mm/dd] [HH:MM:SS]最初の形式では、現在の時間から指定された値だけシフトした時間が発行時間になります。 この値は、サブ値のシーケンスを連結したものです。 各サブ値の内部では、プラス記号(+)が未来へのシフトを意味し、マイナス記号(-)が過去へのシフトを意味します。 シフトする時間は、年、月、日、時間、分または秒のnnn単位です。(それぞれ y,m,d,H,MまたはSの1文字で表されます)。 問題時間の正確な値は、各サブ値の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コマンドで使用可能なオプションは、次のとおりです:- { - -aliasalias}: 処理するエントリの別名
- [ - -keypassarg]: キー・パスワード
- -keyalgalg: キー・アルゴリズム名
- { - -keysizesize}: キー・ビット・サイズ
- { - -keystorekeystore}: キーストア名
- [ - -storepassarg]: キーストア・パスワード
- { - -storetypetype}: キーストア・タイプ
- { - -providernamename}: プロバイダ名
- { - -addprovidername [- -providerargarg]}: オプションのconfigure引数を使用して、名前(例SunPKCS11)でセキュリティ・プロバイダを追加します。
- { - -providerclassclass [- -providerargarg]}: オプションのconfigure引数を使用して、完全修飾クラス名でセキュリティ・プロバイダを追加します。
- { - -providerpathlist}: プロバイダ・クラスパス
- { - -v}: 詳細出力
- { - -protected}: 保護されているメカニズムで提供されるパスワード
 -genseckeyコマンドを使用して、秘密キーを生成し、aliasで識別される新しいKeyStore.SecretKeyEntryに格納します。-keyalgの値は、秘密キーの生成に使用されるアルゴリズムを指定し、-keysizeの値は、生成されるキーのサイズを指定します。-keypass値は、秘密キーを保護するパスワードです。 パスワードを指定しなかった場合は、ユーザーにその入力が求められます。 プロンプトで「戻る」キーを押すと、キー・パスワードは-keystoreに使用されているものと同じパスワードに設定されます。-keypass値には6文字以上が含まれている必要があります。
- -importcert
- 
-importcertコマンドで使用可能なオプションは、次のとおりです:- { - -noprompt}: プロンプトを表示しません
- { - -trustcacerts}: cacertsからの証明書を信頼します
- { - -protected}: パスワードは保護メカニズムを介して提供されます
- { - -aliasalias}: 処理するエントリの別名
- { - -filefile}: 入力ファイル名
- [ - -keypassarg]: キー・パスワード
- { - -keystorekeystore}: キーストア名
- { - -cacerts}: cacertsキーストアへのアクセス
- [ - -storepassarg]: キーストア・パスワード
- { - -storetypetype}: キーストア・タイプ
- { - -providernamename}: プロバイダ名
- { - -addprovidername [- -providerargarg]}: オプションのconfigure引数を使用して、名前(例SunPKCS11)でセキュリティ・プロバイダを追加します。
- { - -providerclassclass [- -providerargarg]}: オプションのconfigure引数を使用して、完全修飾クラス名でセキュリティ・プロバイダを追加します。
- { - -providerpathlist}: プロバイダ・クラスパス
- { - -v}: 詳細出力
 -importcertコマンドを使用して証明書または証明書チェーン(後者がPKCS#7形式の返信またはX.509証明書のシーケンスで提供されます。)を-filefileから読み取り、-aliasで識別されるkeystoreエントリに格納します。-filefileが指定されていない場合、証明書または証明書チェーンは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コマンドで使用可能なオプションは、次のとおりです:- { - -aliasalias}: 処理するエントリの別名
- [ - -keypassarg]: キー・パスワード
- { - -keyalgalg}: キー・アルゴリズム名
- { - -keysizesize}: キー・ビット・サイズ
- { - -keystorekeystore}: キーストア名
- [ - -storepassarg]: キーストア・パスワード
- { - -storetypetype}: キーストア・タイプ
- { - -providernamename}: プロバイダ名
- { - -addprovidername [- -providerargarg]}: オプションのconfigure引数を使用して、名前(例SunPKCS11)でセキュリティ・プロバイダを追加します。
- { - -providerclassclass [- -providerargarg]}: オプションのconfigure引数を使用して、完全修飾クラス名でセキュリティ・プロバイダを追加します。
- { - -providerpathlist}: プロバイダ・クラスパス
- { - -v}: 詳細出力
- { - -protected}: 保護されているメカニズムで提供されるパスワード
 -importpassコマンドを使用して、パスフレーズをインポートし、-aliasで識別される新しいKeyStore.SecretKeyEntryに格納します。 パスフレーズは標準入力ストリームで指定されます。指定されていない場合、ユーザーにその入力が求められます。-keypassオプションは、インポートされたパスフレーズを保護するためのパスワードを提供します。 パスワードを指定しなかった場合は、ユーザーにその入力が求められます。 プロンプトで「戻る」キーを押すと、キー・パスワードはkeystoreに使用したものと同じパスワードに設定されます。-keypass値には6文字以上が含まれている必要があります。
別のキーストアの内容をインポートするためのコマンド
- -importkeystore
- 
-importkeystoreコマンドで使用可能なオプションは、次のとおりです:- -srckeystorekeystore: ソース・キーストア名
- { - -destkeystorekeystore}: 宛先キーストア名
- { - -srcstoretypetype}: ソース・キーストアのタイプ
- { - -deststoretypetype}: 宛先キーストアのタイプ
- [ - -srcstorepassarg]: ソース・キーストアのパスワード
- [ - -deststorepassarg]: 宛先キーストアのパスワード
- { - -srcprotected}: ソース・キーストアのパスワード保護
- { - -destprotected}: パスワードで保護されるターゲット・キーストア
- { - -srcprovidernamename}: ソース・キーストア・プロバイダ名
- { - -destprovidernamename}: 宛先キーストア・プロバイダ名
- { - -srcaliasalias}: ソース別名
- { - -destaliasalias}: 宛先の別名
- [ - -srckeypassarg]: ソース・キーのパスワード
- [ - -destkeypassarg]: 宛先キーのパスワード
- { - -noprompt}: プロンプトを表示しません
- { - -addprovidername [- -providerargarg]: オプションのconfigure引数を使用して、名前(例SunPKCS11)でセキュリティ・プロバイダを追加します。
- { - -providerclassclass [- -providerargarg]}: オプションのconfigure引数を使用して、完全修飾クラス名でセキュリティ・プロバイダを追加
- { - -providerpathlist}: プロバイダ・クラスパス
- { - -v}: 詳細出力
 ノート: 次の行はすべてのオプションの1行目に指定します。 -srckeystorekeystore-destkeystorekeystore-importkeystoreコマンドを使用して、ソース・キーストアから宛先キーストアに単一のエントリまたはすべてのエントリをインポートします。ノート: keytool -importkeystoreコマンドの使用時に-destkeystoreを指定しない場合、使用されるデフォルトのキーストアは$HOME/.keystoreです。-srcaliasオプションが指定された場合、このコマンドは、その別名で特定される単一のエントリをターゲット・キーストアにインポートします。 宛先の別名が-destaliasで指定されていない場合、-srcaliasが宛先の別名として使用されます。 ソース・エントリがパスワードで保護されている場合、-srckeypassを使用してエントリがリカバリされます。-srckeypassが指定されていない場合、keytoolコマンドは-srcstorepassを使用してエントリをリカバリしようとします。-srcstorepassが指定されていないか、正しくない場合、ユーザーはパスワードの入力を求められます。 宛先エントリは-destkeypassで保護されます。-destkeypassが指定されていない場合、宛先エントリはソース・エントリ・パスワードで保護されます。 たとえば、ほとんどのサード・パーティ製ツールでは、PKCS #12キーストアのstorepassとkeypassを同じにする必要があります。 これらのツールのPKCS#12キーストアを作成するには、常に-deststorepassと同じ-destkeypassを指定します。-srcaliasオプションが指定されていない場合、ソース・キーストア内のすべてのエントリが宛先キーストアにインポートされます。 各ターゲット・エントリは対応するソース・エントリの別名の下に格納されます。 ソース・エントリがパスワードで保護されている場合、-srcstorepassを使用してエントリがリカバリされます。-srcstorepassが指定されていないか、正しくない場合、ユーザーはパスワードの入力を求められます。 ソース・キーストア内のあるエントリ・タイプがターゲット・キーストアでサポートされていない場合や、あるエントリをターゲット・キーストアに格納する際にエラーが発生した場合、ユーザーはそのエントリをスキップして処理を続行するか、あるいは処理を中断するかの選択を求められます。 ターゲット・エントリはソース・エントリのパスワードによって保護されます。ターゲット別名がターゲット・キーストア内にすでに存在していた場合、ユーザーは、そのエントリを上書きするか、あるいは異なる別名で新しいエントリを作成するかの選択を求められます。 -nopromptオプションが指定されている場合、ユーザーは新しい宛先別名の入力を求められません。 既存のエントリはそのターゲット別名で上書きされます。 インポートできないエントリはスキップされ、警告が表示されます。
証明書要求を生成するためのコマンド
- -certreq
- 
-certreqコマンドで使用可能なオプションは、次のとおりです:- { - -aliasalias}: 処理するエントリの別名
- { - -sigalgalg}: シグネチャ・アルゴリズム名
- { - -filefile}: 出力ファイル名
- [ - -keypassarg]: キー・パスワード
- { - -keystorekeystore}: キーストア名
- { - -dnamename}: 識別名
- { - -extvalue}: X.509 extension
- [ - -storepassarg]: キーストア・パスワード
- { - -storetypetype}: キーストア・タイプ
- { - -providernamename}: プロバイダ名
- { - -addprovidername [- -providerargarg]}: オプションのconfigure引数を使用して、名前(例SunPKCS11)でセキュリティ・プロバイダを追加します。
- { - -providerclassclass [- -providerargarg]}: オプションのconfigure引数を使用して、完全修飾クラス名でセキュリティ・プロバイダを追加します。
- { - -providerpathlist}: プロバイダ・クラスパス
- { - -v}: 詳細出力
- { - -protected}: 保護されているメカニズムで提供されるパスワード
 -certreqコマンドを使用して、PKCS #10形式を使用して証明書署名リクエスト(CSR)を生成します。CSRはCAに送信することを目的として作成されます。 CAは、証明書要求者を(通常はオフラインで)認証し、証明書または証明書チェーンを送り返します。この証明書または証明書チェーンは、キーストア内の既存の証明書チェーン(最初は自己署名証明書)に置き換わります。 aliasに関連付けられた秘密キーは、PKCS #10証明書リクエストを作成するのに使用されます。 秘密キーにアクセスするには、正しいパスワードを指定する必要があります。 コマンドラインで -keypassが指定されておらず、キーストアの整合性を保護するために使用されるパスワードと異なる場合、ユーザーはその入力を求められます。-dnameが指定されている場合は、CSRのサブジェクトとして使用されます。 それ以外の場合は、別名に関連付けられたX.500識別名が使われます。-sigalg値は、CSRの署名に使用するアルゴリズムを指定します。CSRは、 -filefileに格納されます。 ファイルが指定されていない場合、CSRは-stdoutに出力されます。-importcertコマンドを使用して、CAからレスポンスをインポートします。
データをエクスポートするためのコマンド
- -exportcert
- 
-exportcertコマンドで使用可能なオプションは、次のとおりです:- { - -rfc}: RFCスタイルの出力
- { - -aliasalias}: 処理するエントリの別名
- { - -filefile}: 出力ファイル名
- { - -keystorekeystore}: キーストア名
- { - -cacerts}: cacertsキーストアへのアクセス
- [ - -storepassarg]: キーストア・パスワード
- { - -storetypetype}: キーストア・タイプ
- { - -providernamename}: プロバイダ名
- { - -addprovidername [- -providerargarg]}: オプションのconfigure引数を使用して、名前(例SunPKCS11)でセキュリティ・プロバイダを追加します。
- { - -providerclassclass [- -providerargarg] }: オプションのconfigure引数を使用して、完全修飾クラス名でセキュリティ・プロバイダを追加します。
- { - -providerpathlist}: プロバイダ・クラスパス
- { - -v}: 詳細出力
- { - -protected}: 保護されているメカニズムで提供されるパスワード
 -exportcertコマンドを使用して、-aliasaliasに関連付けられたキーストアから証明書を読み取り、-filefileに格納します。 ファイルが指定されていない場合、証明書はstdoutに出力されます。デフォルトでは、バイナリ・エンコードで証明書が出力されます。 -rfcオプションが指定されている場合は、インターネットRFC 1421証明書エンコード規格で定義されている出力可能エンコード形式で出力されます。-aliasが信頼できる証明書を参照する場合、その証明書が出力されます。 それ以外の場合、-aliasは、関連付けられた証明書チェーンを持つキー・エントリを参照します。 この場合は、チェーン内の最初の証明書が返されます。 この証明書は、-alias宛てのエンティティの公開キーを認証します。
データを表示するためのコマンド
- -list
- 
-listコマンドで使用可能なオプションは、次のとおりです:- { - -rfc}: RFCスタイルの出力
- { - -aliasalias}: 処理するエントリの別名
- { - -keystorekeystore}: キーストア名
- { - -cacerts}: cacertsキーストアへのアクセス
- [ - -storepassarg]: キーストア・パスワード
- { - -storetypetype}: キーストア・タイプ
- { - -providernamename}: プロバイダ名
- { - -addprovidername [- -providerargarg]}: オプションのconfigure引数を使用して、名前(例SunPKCS11)でセキュリティ・プロバイダを追加します。
- { - -providerclassclass [- -providerargarg] }: オプションのconfigure引数を使用して、完全修飾クラス名でセキュリティ・プロバイダを追加します。
- { - -providerpathlist}: プロバイダ・クラスパス
- { - -v}: 詳細出力
- { - -protected}: 保護されているメカニズムで提供されるパスワード
 -listコマンドを使用して、-aliasで識別されるキーストア・エントリの内容をstdoutに出力します。-aliasaliasが指定されていない場合は、キーストア全体の内容が出力されます。このコマンドは、デフォルトでは証明書のSHA-256フィンガプリントを出力します。 -vオプションが指定されている場合は、所有者、発行者、シリアル番号、拡張機能などの付加的な情報とともに、人間が読むことのできる形式で証明書が出力されます。-rfcオプションが指定されている場合、証明書の内容は、Internet RFC 1421 Certificate Encoding Standardで定義されている印刷可能なエンコーディング形式を使用して出力されます。ノート: -vと-rfcの両方を同じコマンドに指定することはできません。 そうでない場合は、エラーが報告されます。
- -printcert
- 
-printcertコマンドで使用可能なオプションは、次のとおりです:- { - -rfc}: RFCスタイルの出力
- { - -filecert_file}: 入力ファイル名
- { - -sslserverserver[- :port]}:: Secure Sockets Layer (SSL)サーバーのホストとポート
- { - -jarfileJAR_file}: 署名付き- .jarファイル
- { - -keystorekeystore}: キーストア名
- { - -trustcacerts}: cacertsからの証明書を信頼します
- [ - -storepassarg]: キーストア・パスワード
- { - -storetypetype}: キーストア・タイプ
- { - -providernamename}: プロバイダ名
- { - -addprovidername [- -providerargarg]}: オプションのconfigure引数を使用して、名前(例SunPKCS11)でセキュリティ・プロバイダを追加します。
- { - -providerclassclass [- -providerargarg]}: オプションのconfigure引数を使用して、完全修飾クラス名でセキュリティ・プロバイダを追加します。
- { - -providerpathlist}: プロバイダ・クラスパス
- { - -protected}: パスワードは保護メカニズムを介して提供されます
- { - -v}: 詳細出力
 -printcertコマンドを使用して、-filecert_file (-sslserverserver [: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コマンドで使用可能なオプションは、次のとおりです:- { - -filefile}: 入力ファイル名
- { - -v}: 詳細出力
 -printcertreqコマンドを使用して、keytool -certreqコマンドで生成できるPKCS #10形式の証明書リクエストの内容を出力します。 このコマンドは、ファイルから要求を読み取ります。 ファイルが存在しない場合は、標準入力から要求が読み取られます。
- -printcrl
- 
-printcrlコマンドで使用可能なオプションは、次のとおりです:- { - -file crl}: 入力ファイル名
- { - -keystorekeystore}: キーストア名
- { - -trustcacerts}: cacertsからの証明書を信頼します
- [ - -storepassarg]: キーストア・パスワード
- { - -storetypetype}: キーストア・タイプ
- { - -providernamename}: プロバイダ名
- { - -addprovidername [- -providerargarg]}: オプションのconfigure引数を使用して、名前(例SunPKCS11)でセキュリティ・プロバイダを追加します。
- { - -providerclassclass [- -providerargarg]}: オプションのconfigure引数を使用して、完全修飾クラス名でセキュリティ・プロバイダを追加します。
- { - -providerpathlist}: プロバイダ・クラスパス
- { - -protected}: パスワードは保護メカニズムを介して提供されます
- { - -v}: 詳細出力
 -printcrlコマンドを使用して、証明書失効リスト(CRL)を-file crlから読み取ります。 CRLは、発行元のCAによって取り消されたデジタル証明書のリストです。 CAはcrlファイルを生成します。ノート: このコマンドは、キーストアとは別に使用できます。 このコマンドは、ユーザー・キーストア( -keystoreで指定)またはcacertsキーストア(-trustcacertsを指定した場合)の証明書を使用してCRLを検証しようとし、検証できない場合は警告を出力します。
キーストアを管理するためのコマンド
- -storepasswd
- 
-storepasswdコマンドで使用可能なオプションは、次のとおりです:- [ - -newarg]: 新パスワード
- { - -keystorekeystore}: キーストア名
- { - -cacerts}: cacertsキーストアへのアクセス
- [ - -storepassarg]: キーストア・パスワード
- { - -storetypetype}: キーストア・タイプ
- { - -providernamename}: プロバイダ名
- { - -addprovidername [- -providerargarg]}: オプションのconfigure引数を使用して、名前(例SunPKCS11)でセキュリティ・プロバイダを追加します。
- { - -providerclassclass [- -providerargarg]}: オプションのconfigure引数を使用して、完全修飾クラス名でセキュリティ・プロバイダを追加します。
- { - -providerpathlist}: プロバイダ・クラスパス
- { - -v}: 詳細出力
 -storepasswdコマンドを使用して、キーストアのコンテンツの整合性を保護するために使用されるパスワードを変更します。 新しいパスワードは、-newargによって設定され、6文字以上である必要があります。
- -keypasswd
- 
-keypasswdコマンドで使用可能なオプションは、次のとおりです:- { - -aliasalias}: 処理するエントリの別名
- [ - -keypassold_keypass]: キー・パスワード
- [ - -newnew_keypass]: 新パスワード
- { - -keystorekeystore}: キーストア名
- { - -storepassarg}: キーストア・パスワード
- { - -storetypetype}: キーストア・タイプ
- { - -providernamename}: プロバイダ名
- { - -addprovidername [- -providerargarg]}: オプションのconfigure引数を使用して、名前(例SunPKCS11)でセキュリティ・プロバイダを追加します。
- { - -providerclassclass [- -providerargarg]}: オプションのconfigure引数を使用して、完全修飾クラス名でセキュリティ・プロバイダを追加します。
- { - -providerpathlist}: プロバイダ・クラスパス
- { - -v}: 詳細出力
 -keypasswdコマンドを使用して、(-aliasで識別される秘密キーを保護する秘密キー)を-keypassold_keypassから-newnew_keypassに変更します。 パスワードの値は6文字以上にする必要があります。コマンドラインで -keypassオプションが指定されておらず、-keypassパスワードがキーストア・パスワード(-storepassarg)と異なる場合は、ユーザーに対して入力を求められます。コマンド行で -newオプションが指定されていない場合は、ユーザーにそのオプションの入力を求められます。
- -delete
- 
-deleteコマンドで使用可能なオプションは、次のとおりです:- [ - -aliasalias]: 処理するエントリの別名
- { - -keystorekeystore}: キーストア名
- { - -cacerts}: cacertsキーストアへのアクセス
- [ - -storepassarg]: キーストア・パスワード
- { - -storetypetype}: キーストア・タイプ
- { - -providernamename}: プロバイダ名
- { - -addprovidername [- -providerargarg]}: オプションのconfigure引数を使用して、名前(例SunPKCS11)でセキュリティ・プロバイダを追加します。
- { - -providerclassclass [- -providerargarg]}: オプションのconfigure引数を使用して、完全修飾クラス名でセキュリティ・プロバイダを追加します。
- { - -providerpathlist}: プロバイダ・クラスパス
- { - -v}: 詳細出力
- { - -protected}: 保護されているメカニズムで提供されるパスワード
 -deleteコマンドを使用して、-aliasaliasエントリをキーストアから削除します。 コマンドラインで指定しない場合、ユーザーはaliasの入力を求められます。
- -changealias
- 
-changealiasコマンドで使用可能なオプションは、次のとおりです:- { - -aliasalias}: 処理するエントリの別名
- [ - -destaliasalias]: 宛先の別名
- [ - -keypassarg]: キー・パスワード
- { - -keystorekeystore}: キーストア名
- { - -cacerts}: cacertsキーストアへのアクセス
- [ - -storepassarg]: キーストア・パスワード
- { - -storetypetype}: キーストア・タイプ
- { - -providernamename}: プロバイダ名
- { - -addprovidername [- -providerargarg]}: オプションのconfigure引数を使用して、名前(例SunPKCS11)でセキュリティ・プロバイダを追加します。
- { - -providerclassclass [- -providerargarg]}: オプションのconfigure引数を使用して、完全修飾クラス名でセキュリティ・プロバイダを追加します。
- { - -providerpathlist}: プロバイダ・クラスパス
- { - -v}: 詳細出力
- { - -protected}: 保護されているメカニズムで提供されるパスワード
 -changealiasコマンドを使用して、既存のキーストア・エントリを-aliasaliasから新しい-destaliasaliasに移動します。 ターゲット別名を指定しなかった場合、このコマンドはユーザーにその入力を求めます。 元のエントリがエントリ・パスワードで保護されていた場合、-keypassオプションでそのパスワードを指定できます。 キー・パスワードが指定されていない場合、-storepass(提供されている場合)が最初に試行されます。 その試みが失敗すると、ユーザーはパスワードの入力を求められます。
セキュリティ関連情報を表示するためのコマンド
- -showinfo
- 
-showinfoコマンドで使用可能なオプションは、次のとおりです:- { - -tls}: TLS構成情報を表示
- { - -v}: 詳細出力
 -showinfoコマンドを使用すると、様々なセキュリティ関連情報を表示できます。-tlsオプションには、有効なプロトコルや暗号スイートのリストなど、TLS構成が表示されます。
プログラム・バージョンを表示するコマンド
-versionを使用して、プログラム・バージョンのkeytoolを印刷できます。
ヘルプ情報を表示するためのコマンド
--helpを使用して、keytoolコマンドのリストを表示したり、特定のkeytoolコマンドに関するヘルプ情報を表示できます。
- keytoolコマンドのリストを表示するには、次のように入力します:- keytool --help
- 特定の - keytoolコマンドに関するヘルプ情報を表示するには、次のように入力します:- keytool -<command> --help
一般的なコマンドのオプション
-vオプションは、--helpを除くすべてのコマンドに対して指定できます。 -vオプションを指定した場合、冗長モードになり、詳細な情報が出力されます。 
-J option引数は、任意のコマンドに使用できます。 -J optionを使用する場合、指定したoption文字列がJavaインタプリタに直接渡されます。 このオプションには、空白を含めることはできません。 このオプションは、実行環境またはメモリー使用を調整する場合に便利です。 可能なインタプリタ・オプションのリストについては、コマンドラインでjava -hまたはjava -Xと入力します。 
これらのオプションは、キーストアに対する操作を行うすべてのコマンドで指定できます。
- -storetypestoretype
- この修飾子は、インスタンスを生成するキーストアのタイプを指定します。
- -keystorekeystore
- 
キーストアの場所を指定します。 JKS storetypeが使用され、キーストア・ファイルがまだ存在しない場合、特定のkeytoolコマンドによって新しいキーストア・ファイルが作成される可能性があります。 たとえば、keytool -genkeypairが呼び出され、-keystoreオプションが指定されていない場合、デフォルトのキーストア・ファイル.keystoreがユーザー・ホーム・ディレクトリに作成されます(まだ存在しない場合)。 同様に、-keystore ks_fileオプションが指定されているが、ks_fileが存在しない場合は、作成されます。 JKSstoretypeの詳細は、「キーストアの別名」のキーストアの実装に関する項を参照してください。-keystoreオプションからの入力ストリームは、KeyStore.loadメソッドに渡されます。 URLとしてNONEが指定されている場合は、nullのストリームがKeyStore.loadメソッドに渡されます。 キーストアがファイルベースでない場合は、NONEを指定する必要があります。 たとえば、キーストアがハードウェア・トークン・デバイスに置かれている場合などです。
- -cacertscacerts
- 
cacertsキーストアで動作します。 このオプションは、-keystorepath_to_cacerts-storetypetype_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オプションが指定されていない場合は、ユーザーにそのオプションの入力を求められます。キーストアから情報を取り出す場合、パスワードはオプションです。 パスワードを指定しなかった場合は、取得された情報の整合性を検証できないため、警告が表示されます。 
- -providernamename
- セキュリティ・プロパティ・ファイル内に含まれる暗号化サービス・プロバイダ名を特定するために使用されます。
- -addprovidername
- 名前(SunPKCS11など)でセキュリティ・プロバイダを追加する場合に使用されます。
- -providerclassclass
- セキュリティ・プロパティ・ファイルにサービス・プロバイダが表示されていない場合に、暗号サービス・プロバイダ・マスター・クラス・ファイルの名前を指定するために使用されます。
- -providerpathlist
- プロバイダのクラス・パスを指定するために使用されます。
- -providerargarg
- 
class名のコンストラクタのオプションの文字列入力引数を表すために、-addproviderまたは-providerclassオプションとともに使用されます。
- -protected=true|- false
- 
専用PINリーダーなど、保護された認証パスを使用してパスワードを指定する必要がある場合は、この値をtrueと指定します。-importkeystoreコマンドには2つのキーストアが関係しているため、ソース・キーストアと宛先キーストアには、それぞれ-srcprotectedと-destprotectedの2つのオプションが用意されています。
- -ext{name{- :critical} {- =value}}
- 
X.509証明書の拡張機能を示します。 このオプションは、生成された証明書に拡張子を埋め込むために-genkeypairおよび-gencertで使用することも、証明書リクエストでリクエストされる拡張を表示するために-certreqで使用することもできます。 このオプションは、複数回使用できます。 name引数は、サポートされている拡張名(「サポートされている名前付き拡張」を参照してください)または任意のOID番号です。 指定されている場合、value引数はエクステンションの引数を指します。 valueを省略すると、拡張子または拡張子自体のデフォルト値は引数を必要としません。 修飾子:criticalを指定した場合は、拡張機能のisCritical属性がtrueであることを意味し、それ以外の場合はfalseであることを意味します。:criticalのかわりに:cを使用できます。
- -conffile
- 事前構成済のオプション・ファイルを指定します。
事前構成済のオプション・ファイル
事前構成済みのオプション・ファイルは、-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 rsakeytool -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 "DSA")
    3072 (when using -genkeypair and -keyalg is "RSA", "RSASSA-PSS", or "DH")
    384 (when using -genkeypair and -keyalg is "EC")
    56 (when using -genseckey and -keyalg is "DES")
    168 (when using -genseckey and -keyalg is "DESede")
-groupname
    ed25519 (when using -genkeypair and -keyalg is "EdDSA", key size is 255)
    x25519 (when using -genkeypair and -keyalg is "XDH", key size is 255)
-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 | キー・サイズ | デフォルトのsigalg | 
|---|---|---|
| DSA | 任意のサイズ | SHA256withDSA | 
| RSA | < 624 | SHA256withRSA (SHA-384を使用するにはキー・サイズが小さすぎます) | 
| <= 7680 | SHA384withRSA | |
| > 7680 | SHA512withRSA | |
| EC | < 512 | SHA384withECDSA | 
| >= 512 | SHA512withECDSA | |
| RSASSA-PSS | < 624 | RSASSA-PSS (SHA-256、キー・サイズが小さすぎます | 
| SHA-384を使用) | ||
| <= 7680 | RSASSA-PSS (SHA-384を使用) | |
| > 7680 | RSASSA-PSS (SHA-512を使用) | |
| EdDSA | 255 | Ed25519 | 
| 448 | Ed448 | |
| Ed25519 | 255 | Ed25519 | 
| Ed448 | 448 | Ed448 | 
- キー・サイズはビット単位で測定され、秘密キーのサイズに対応します。 このサイズは、 - -keysizeまたは- -groupnameオプションの値、またはデフォルト設定から導出された値によって決まります。
- RSASSA-PSSシグネチャ・アルゴリズムは、ハッシュ・アルゴリズムおよびMGF1アルゴリズムとして - MessageDigestアルゴリズムを使用します。
- デフォルトの - -keysizeまたは- -groupnameのいずれもアルゴリズムに定義されていない場合、セキュリティ・プロバイダはデフォルト設定を選択します。
ノート:
即時利用可能なセキュリティを向上させるために、デフォルトのキー・サイズ、グループ名、およびシグネチャ・アルゴリズム名は、JDKの各リリースでより強力な値に定期的に更新されます。 古いJDKのリリースとの相互運用性が重要な場合は、このデフォルトがそれらのリリースでサポートされていることを確認してください。 または、-keysize、-groupname、または-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の場合はdS、cRLSignの場合は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 -keypasspassword-keystore /working/mykeystore -storepass password -validity 180
このコマンドは、mykeystoreという名前のキーストアを作業ディレクトリ(存在しない場合)に作成し、-keypassで指定されたパスワードを割り当てます。 識別名がmyname、mygroup、mycompany、およびmycountryの2文字の国コードのエンティティに対して、公開キーと秘密キーのペアが生成されます。 RSAキー生成アルゴリズムを使用してキーを作成します。どちらも3072ビットです。 
このコマンドは、デフォルトのSHA384withRSAシグネチャ・アルゴリズムを使用して、公開キーおよび識別名情報を含む自己シグネチャ証明書を作成します。 この証明書は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の署名を取得するには、次の処理を実行します。
- CSRを生成します。 - keytool -certreq -file myname.csr- これにより、デフォルトの別名 - mykeyで識別されるエンティティのCSRが作成され、- myname.csrという名前のファイルにリクエストが格納されます。
- myname.csrをCA (DigiCertなど)に送信します。
CAは要求者を(通常はオフラインで)認証し、要求者の公開キーを認証した署名付きの証明書を送り返します。 場合によっては、CAが証明書のチェーンを返すこともあります。証明書のチェーンでは、各証明書がチェーン内の前の署名者の公開キーを認証します。
CAからの証明書のインポート
CAの証明書をインポートするには、次の処理を実行します。
- CAから証明書返信をインポートする前に、キーストアまたは - cacertsキーストア・ファイルのいずれかで1つ以上の信頼できる証明書が必要です。 「コマンド」の- -importcertを参照してください。- 証明書応答が証明書チェーンの場合は、チェーンのトップの証明書が必要です。 そのCAの公開キーを認証するルートCAの証明書です。 
- 証明書応答が単一の証明書の場合は、(その証明書に署名した)発行元CAの証明書が必要です。 その証明書が自己署名されていない場合は、その署名者の証明書が必要となり、このようにして自己署名付きのルートCA証明書まで必要になります。 
 - cacertsキーストアには、「Oracle Javaルート証明書プログラム」のCAによって発行されたルート証明書のセットが同梱されています。 CAから署名証明書をリクエストし、CAの公開キーを認証する証明書が- cacertsに追加されていない場合は、そのCAから証明書を信頼できる証明書としてインポートする必要があります。- 通常、CAからの証明書は、自己署名付きの証明書か別のCAによって署名された証明書です。 別のCAによって署名されている場合は、そのCAの公開キーを認証する証明書が必要です。 - たとえば、CAであり、ファイルはCA公開キーを認証する自己署名証明書であると想定されている、X - .cerファイルを会社から取得したとします。 信頼できる証明書としてその証明書をインポートする前に、証明書が有効であることを確認する必要があります。- -nopromptオプションを使用せずに- keytool -printcertコマンドまたは- keytool -importcertコマンドで表示します。 表示された証明書のフィンガプリントが期待されるフィンガプリントと一致していることを確認します。
- 証明書を送信した人に連絡し、表示されたフィンガプリントを、この人が提示した(または安全な公開キーのリポジトリによって提示される)フィンガプリントと比較します。 
 - フィンガープリントが等しい場合のみ、証明書がなんらかの形の証明書(攻撃者証明書など)を使用して移動中に置換されていないことが保証されます。 このような攻撃が行われていた場合、チェックを行わずに証明書をインポートすると、攻撃者によって署名されたすべてのものを信頼することになります。 
- 自己署名証明書を証明書チェーンで置き換えます。証明書チェーンでは、各証明書がチェーン内の前の証明書の署名者の公開キーを認証し、それがルートCAまで続きます。 - 証明書を有効なものとして信頼する場合は、次のコマンドを入力して証明書をキーストアに追加できます。 - keytool -importcert -aliasalias- -file *X*.cer`- このコマンドは、CA証明書ファイルのデータからキーストアに信頼できる証明書エントリを作成し、aliasの値をエントリに割り当てます。 
CAからの証明書応答のインポート
証明書署名リクエストを(または、そのような証明書がcacertsファイルにすでに存在)に送信したCAの公開キーを認証する証明書をインポートした後、証明書の返信をインポートし、自己署名証明書を証明書チェーンに置き換えることができます。
証明書チェーンは次のいずれかです。
- CAの応答がチェーンの場合、CAから送り返されます。 
- CAの応答が単一の証明書の場合、作成されます。 この証明書チェーンは、証明書応答と、応答をインポートするキーストアまたは - cacertsキーストア・ファイルで使用可能な信頼できる証明書を使用して構築されます。
たとえば、証明書署名要求をDigiCertに送信した場合は、次のコマンドを入力してその応答をインポートできます。
ノート:
この例では、返された証明書の名前はDCmyname.cerです。
keytool -importcert -trustcacerts -file DCmyname.cer
公開キーを認証する証明書のエクスポート
ノート:
jarsignerコマンドを使用してJava Archive (JAR)ファイルにシグネチャした場合、そのファイルを使用するクライアントはシグネチャを認証する必要があります。
クライアントが認証する方法の1つは、署名者の公開キー証明書を信頼できるエントリとしてクライアントのキーストアにインポートすることです。 そのために、証明書をエクスポートしてクライアントに提供できます。
たとえば:
- 次のコマンドを入力して、証明書を - myname.cerという名前のファイルにコピーします:- ノート: - この例では、エントリの別名が - mykeyです。- keytool -exportcert -alias mykey -file myname.cer
- 証明書と署名付きJARファイルを入手したクライアントは、 - jarsignerコマンドを使って署名を認証できます。
キーストアのインポート
importkeystoreコマンドを使用して、キーストア全体を別のキーストアにインポートします。 キーおよび証明書を含むソース・キーストアのすべてのエントリが、1つのコマンドでターゲット・キーストアにインポートされます。 このコマンドを使えば、異なるタイプのキーストア内に含まれるエントリをインポートできます。 インポート時には、ターゲット・キーストア内の新しいエントリはすべて、同じ別名および(秘密キーや秘密キーの場合は)保護用パスワードを持ちます。 keytoolコマンドでソース・キーストアから秘密キーまたは秘密キーをリカバリできない場合は、パスワードの入力を求められます。 このコマンドは、別名の重複を検出すると、ユーザーに新しい別名の入力を求めます。ユーザーは、新しい別名を指定することも、既存の別名の上書きをkeytoolコマンドに許可することもできます。 
たとえば、次のコマンドを入力して、一般的なJKSタイプのキーストアkey.jksからPKCS #11タイプのハードウェア・ベースのキーストアにエントリをインポートします:
keytool -importkeystore -srckeystore key.jks -destkeystore NONE -srcstoretype JKS -deststoretype PKCS11 -srcstorepasspassword-deststorepasspassword
また、importkeystoreコマンドを使用して、ソース・キーストア内の単一のエントリをターゲット・キーストアにインポートすることもできます。 この場合、前の例で使用したオプションに加え、インポート対象の別名を指定する必要があります。 -srcaliasオプションを指定した場合、宛先の別名、秘密キーまたは非公開キーの保護パスワード、および必要な宛先保護パスワードを次のように指定することもできます: 
keytool -importkeystore -srckeystore key.jks -destkeystore NONE -srcstoretype JKS -deststoretype PKCS11 -srcstorepasspassword-deststorepasspassword-srcalias myprivatekey -destalias myoldprivatekey -srckeypasspassword-destkeypasspassword-noprompt
SSLサーバー用の証明書の生成
次に、3つのエンティティのキー・ペアと証明書を生成するために使用するkeytoolコマンドを示します:
- ルートCA ( - root)
- 中間CA ( - ca)
- SSLサーバー( - server)
すべての証明書が同じキーストアに格納されていることを確認してください。
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 -keypasspasswdこの例では、以降のコマンドで別名 dukeに関連付けられた秘密キーにアクセスするために必要な初期passwdを指定します。 Dukeの秘密キーのパスワードを後で変更する場合は、次のようなコマンドを実行します。keytool -keypasswd -alias duke -keypasspasswd-newnewpasswdこれにより、最初のpasswdがnewpasswdに変更されます。 テストを目的とする場合、またはセキュアなシステムを使用している場合以外は、コマンド行やスクリプトでパスワードを指定しないでください。 必要なパスワードのオプションをコマンド行で指定しなかった場合は、その入力を求められます。 
- キーストアの実装
- 
java.securityパッケージで提供されるKeyStoreクラスには、キーストア内の情報に対するアクセスと変更を行うための明確に定義されたインタフェースが用意されています。 複数の異なる固定実装を生成できます(それぞれ特定の型のキーストアを実装)。現在、2つのコマンドライン・ツール( keytoolおよびjarsigner)がキーストアの実装を使用します。KeyStoreクラスはpublicであるため、ユーザーはこのクラスを使用する追加のセキュリティ・アプリケーションを作成できます。JDK 9以降では、デフォルトのキーストア実装は PKCS12です。 これは、RSA PKCS12 Personal Information Exchange Syntax Standardに基づくクロス・プラットフォーム・キーストアです。 この規格は、ユーザーの秘密キー、証明書、その他の秘密を格納および転送することを主な目的としています。 Oracleが提供する組み込みの実装がもう1つあります。 キーストアを、独自のキーストア・タイプ(format)がJKSという名前のファイルとして実装します。 この実装では、個々の秘密キーは個別のパスワードによって保護され、キーストア全体の整合性も(秘密キーとは別の)パスワードによって保護されます。キーストアの実装は、プロバイダ・ベースです。 具体的には、 KeyStoreで提供されるアプリケーション・インタフェースがService Provider Interface (SPI)という形で実装されています。 つまり、対応するKeystoreSpi抽象クラスが(やはりjava.securityパッケージ内に)あり、プロバイダが実装する必要があるService Provider Interfaceメソッドを定義しています。 プロバイダとは、Java Security APIによってアクセス可能なサービスのサブセットに対し、その固定実装を提供するパッケージまたはパッケージの集合のことです。 キーストアの実装を提供するには、プロバイダを実装し、プロバイダを実装および統合するステップの説明に従って、KeystoreSpiサブクラスの実装を提供する必要があります。アプリケーションでは、 KeyStoreクラスで提供されるgetInstanceファクトリ・メソッドを使うことで、様々なプロバイダから異なるタイプのキーストア実装を選択できます。 キーストア・タイプは、キーストア情報の格納形式とデータ形式を定義するとともに、キーストア内の非公開/秘密キーとキーストアの整合性を保護するために使われるアルゴリズムを定義します。 異なるタイプのキーストアの実装には、互換性はありません。keytoolコマンドは、任意のファイルベース・キーストア実装で動作します。 コマンドラインで渡されたキーストアのロケーションをファイル名として扱い、キーストア情報をロードするFileInputStreamに変換します。jarsignerコマンドでは、URLで指定できる任意のロケーションからキーストアを読み取ることができます。keytoolとjarsignerの場合は、-storetypeオプションを使ってコマンド行でキーストア・タイプを指定できます。キーストア・タイプを明示的に指定しない場合、ツールは、セキュリティ・プロパティ・ファイルで指定されている keystore.typeプロパティの値に基づいてキーストアの実装を選択します。 セキュリティ・プロパティ・ファイルはjava.securityと呼ばれ、セキュリティ・プロパティ・ディレクトリにあります:- LinuxおよびmacOS: - java.home/lib/security
- Windows: - java.home\lib\security
 各ツールは、 keystore.type値を取得してから、現在インストールされているすべてのプロバイダを調べて、そのタイプのキーストアを実装しているものを見つけます。 次に、そのプロバイダのキーストア実装を使用します。KeyStoreクラスは、アプリケーションがkeystore.typeプロパティの値を取得できるようにするgetDefaultTypeという名前の静的メソッドを定義します。 次のコード行は、keystore.typeプロパティで指定されたデフォルトのキーストア・タイプのインスタンスを生成します。KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());デフォルトのキーストア・タイプは pkcs12です。これは、RSA PKCS12 Personal Information Exchange Syntax Standardに基づくクロス・プラットフォーム・キーストアです。 これは、セキュリティ・プロパティ・ファイル内の次の行によって指定されています。keystore.type=pkcs12各ツールでデフォルト以外のキーストアの実装を使用するには、上の行を変更して別のキーストアのタイプを指定します。 たとえば、Oracleの jksキーストア実装を使用する場合は、行を次のように変更します:keystore.type=jksノート: キーストア・タイプの指定では、大文字と小文字は区別されません。 たとえば、 JKSはjksと同じとみなされます。
- 証明書
- 
証明書(または公開キー証明書)とは、あるエンティティ(発行者)からのデジタル署名付きの文書のことです。証明書には、他のあるエンティティ(サブジェクト)の公開キーおよびその他の情報が特定の値を持っていることが書かれています。 証明書に関連する用語は次のとおりです。 - 公開キー: 特定のエンティティに関連付けられた数値であり、そのエンティティとの間に信頼できる関係を持つ必要があるすべての人に対して公開することを意図したものです。 公開キーは、署名を検証するのに使われます。 
- デジタル署名: データがデジタル署名されると、そのデータは、エンティティのアイデンティティと、そのエンティティがデータの内容について知っていることを証明する署名とともに格納されます。 エンティティの秘密キーを使ってデータに署名を付けると、データの偽造は不可能になります。 
- アイデンティティ: エンティティを特定するための既知の方法です。 システムによっては、公開キーをアイデンティティにするものがあります。他にも、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コマンドでは、非公開キーおよび関連する証明書チェーンを含むキーストアのキー・エントリを作成して管理できます。 このようなエントリでは、秘密キーに対応する公開キーは、チェーンの最初の証明書に含まれています。キーが最初に生成されるとき、チェーンは通常、単一の要素(自己署名証明書)を含むものから開始します。 「コマンド」の-genkeypairを参照してください。 自己署名証明書は、発行者(署名者)がサブジェクトと同じである証明書のことです。 このサブジェクトは、証明書によって公開キーが認証されるエンティティです。 -genkeypairコマンドが呼び出されて新しい公開/秘密キーのペアが生成されると、公開キーも自己署名証明書(-signerオプションが指定されない)にラップします。その後、 -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およびmacOS: JAVA_HOME - /lib/security
- Windows: JAVA_HOME - \lib\security
 cacertsファイルは、CAの証明書を含むシステム全体のキーストアを表します。 システム管理者は、キーストア・タイプにjksを指定することで、keytoolコマンドを使ってこのファイルの構成と管理を行うことができます。cacertsキーストア・ファイルは、一連のデフォルトのルートCA証明書を含んだ状態で出荷されています。 Linux、macOSおよびWindowsの場合、次のコマンドを使用してデフォルトの証明書をリストできます:keytool -list -cacertscacertsキーストア・ファイルの初期パスワードは、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:A4Linuxの例:
まず、-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キーストア・ファイルで構成された証明書が検証されます。
証明書応答が信頼できるかどうかを判定する方法は次のとおりです。
- 証明書応答が単一のX.509証明書である場合、 - keytoolコマンドは証明書応答から(ルートCAに属する)自己署名証明書までの信頼チェーンの確立を試みます。 証明書応答と証明書の階層構造は、別名の新しい証明書チェーンからの証明書応答を認証するために使われます。 信頼チェーンが確立されない場合、証明書応答はインポートされません。 この場合、- keytoolコマンドは証明書を出力せず、ユーザーが証明書応答の信頼性を判断することは非常に難しいため、ユーザーに証明書の確認を求めません。
- 証明書応答がPKCS #7形式の証明書チェーンまたはX.509証明書のシーケンスである場合は、ユーザー証明書が最初で、次に0個以上のCA証明書が続くようにチェーンが並べ替えられます。 チェーンが自己署名ルートCA証明書で終了し、 - -trustcacertsオプションが指定されていた場合、- keytoolコマンドは、キーストアまたは- cacertsキーストア・ファイル内の信頼できる証明書との照合を試みます。 チェーンが自己署名ルートCA証明書で終了せず、- -trustcacertsオプションが指定されていた場合、- keytoolコマンドは、キーストア内の信頼できる証明書または- cacertsキーストア・ファイルからの証明書を検索して、チェーンの末尾に追加しようとします。 証明書が見つからず、- -nopromptオプションが指定されていない場合は、チェーン内の最後の証明書の情報が出力され、ユーザーはその証明書を確認するよう求められます。
証明書応答内の公開キーがaliasにすでに格納されているユーザーの公開キーと一致した場合、古い証明書チェーンが応答内の新しい証明書チェーンで置き換えられます。 古いチェーンを置き換えることができるのは、有効なkeypass、つまり該当するエントリの非公開キーを保護するためのパスワードを指定した場合のみです。 パスワードを指定しておらず、秘密キーのパスワードがキーストアのパスワードと異なる場合は、秘密キーのパスワードの入力を求められます。 
このコマンドは、以前のリリースでは-importという名前でした。 この古い名前は、このリリースでも引き続きサポートされています。 新しい名前-importcertが優先されます。