keytool
keytool
コマンドおよびオプションは、暗号化キー、X.509証明書チェーンおよび信頼できる証明書を含むキーストア(データベース)の管理に使用します。
形式
keytool [commands]
-
commands
-
keytool
のコマンドは次のとおりです。-
-certreq
: 証明書要求を生成します -
-changealias
: エントリの別名を変更します -
-delete
: エントリを削除します -
-exportcert
:証明書をエクスポートします -
-genkeypair
: キー・ペアを生成します -
-genseckey
: 秘密キーを生成します -
-gencert
: 証明書要求から証明書を生成します -
-importcert
: 証明書または証明書チェーンをインポートします -
-importpass
: パスワードをインポートします -
-importkeystore
: 別のキーストアから1つまたはすべてのエントリをインポートします -
-keypasswd
: エントリのキーのパスワードを変更します -
-list
:キーストア内のエントリをリストします -
-printcert
: 証明書の内容を出力します -
-printcertreq
: 証明書要求の内容を出力します -
-printcrl
: 証明書失効リスト(CRL)ファイルの内容を出力します -
-storepasswd
: キーストアのストア・パスワードを変更します
これらのコマンドとそのオプションの説明は、コマンドとオプションを参照してください。
-
説明
keytool
コマンドは、キーと証明書を管理するためのユーティリティです。これを使用すると、ユーザーはデジタル署名を使用して、自己認証(ユーザーが他のユーザーおよびサービスに対して自分自身を認証する)やデータ整合性および認証サービスで使用する自分の公開/秘密キー・ペアと関連する証明書を管理できます。keytool
コマンドでは、通信相手の公開キーを(証明書の形で)キャッシュすることもできます。
証明書とは、あるエンティティ(人、会社など)が発行したデジタル署名付きの文書で、別のエンティティの公開キー(およびその他の情報)が特定の値であることを証明しています。データにデジタル署名が付いている場合は、デジタル署名を検証することで、データの整合性およびデータが本物であることをチェックできます。データの整合性とは、データが変更されたり改変されていないことを意味します。また、データが本物であるとは、そのデータが、データを作成して署名したと称する個人から渡されたデータであることを意味します。
また、keytool
コマンドを使用して、対称暗号化および復号化(データ暗号化規格)で使用される秘密キーとパスフレーズを管理することもできます。
keytool
コマンドは、キーと証明書をキーストアに格納します。
コマンドとオプションに関するノート
次のノートは、コマンドとオプションの説明に適用されます。
-
どのコマンド名およびオプション名にも先頭にハイフン記号(
-
)が付きます。 -
各コマンドのオプションは、任意の順序で指定できます。
-
イタリック体になっていないか、中カッコ({ })か角カッコ([ ])で囲まれているすべての項目は、そのとおりに指定する必要があります。
-
オプションを囲む中カッコは、そのオプションをコマンド行で指定しなかったときに、デフォルト値が使用されることを意味します。中カッコは、
-v
、-rfc
および-J
オプションを囲むためにも使用されますが、これらのオプションはコマンド行で指定された場合にのみ意味を持ちます。これらには、デフォルト値はありません。 -
オプションを囲む角カッコは、そのオプションをコマンド行で指定しなかった場合に、ユーザーが値の入力を求められることを意味します。
-keypass
オプションをコマンド行で指定しなかった場合、keytool
コマンドはまず、キーストアのパスワードを使用して非公開/秘密キーの復元を試みます。この試みが失敗すると、keytool
コマンドはユーザーに対して非公開/秘密キーのパスワードの入力を求めます。 -
イタリック体の項目の実際の値(オプションの値)は、ユーザーが指定する必要がある。たとえば、
-printcert
コマンドの形式は次のとおりであるkeytool -printcert {-file cert_file} {-v}
-printcert
コマンドを指定するときは、cert_file
のかわりに実際のファイル名(例:keytool -printcert -file VScert.cer
)を指定します -
オプションの値に空白(スペース)が含まれている場合は、値を引用符で囲む必要があります。
-
-help
コマンドはデフォルトです。オプションを指定せずにkeytool
を実行することは、keytool -help
の実行と同じです。 -
複数のコマンドを指定した場合、最後のコマンドのみが認識されます。唯一の例外として、
-help
を別のコマンドとともに指定した場合、keytool
コマンドはそのコマンドの詳細なヘルプを出力します。 -
オプションは2種類あります。1つは単一値のオプションで、1回だけ指定します。単一値のオプションを複数回指定した場合は、最後に指定したオプションの値が使用されます。もう1つは複数値のオプションで、これは複数回指定することができ、すべての値が使用されます。現在サポートされている複数値のオプションは
-ext
オプションのみで、これはX.509v3証明書の拡張機能の生成に使用します。
コマンドとオプション
keytoolコマンドとそのオプションは、それらが実行するタスクでグループ化できます。
キーストアに対してデータを作成または追加するためのコマンド:
-
-gencert
-
-genkeypair
-
-genseckey
-
-importcert
-
-importpass
-
-importkeystore
-
-certreq
-
-exportcert
-
-list
-
-printcert
-
-printcertreq
-
-printcrl
-
-storepasswd
-
-keypasswd
-
-delete
-
-changealias
キーストアに対してデータを作成または追加するためのコマンド
-
-gencert
-
-gencert
コマンドで使用可能なオプションは次のとおりです。-
{
-rfc
}: Request For Comment (RFC)スタイルの出力 -
{
-infile infile
}: 入力ファイル名 -
{
-outfile outfile
}: 出力ファイル名 -
{
-alias alias
}: 処理するエントリの別名 -
{
-sigalg sigalg
}: 署名アルゴリズム名 -
{
-dname dname
}: 識別名 -
{
-startdate startdate
}: 証明書の有効開始日時 -
{
-ext ext
}*: X.509拡張 -
{
-validity days
}: 有効日数 -
[
-keypass arg
]: キーのパスワード -
{
-keystore keystore
}: キーストア名 -
[
-storepass arg
]: キーストアのパスワード -
{
-storetype type
}: キーストアのタイプ -
{
-providername name
}: プロバイダ名 -
{
-addprovider name
[-providerarg arg
]}: オプションで構成引数を指定し、名前(SunPKCS11など)でセキュリティ・プロバイダを追加します。セキュリティ・プロバイダの値はモジュールで定義されているセキュリティ・プロバイダの名前です。たとえば、
keytool -addprovider SunPKCS11 -providerarg some.cfg ...
ノート:
SunPKCS11プロバイダとOracleUcryptoプロバイダはモジュールで定義されるようになりましたが、互換性の理由から、引き続き
-providerclass sun.security.pkcs11.SunPKCS11
および-providerclass com.oracle.security.crypto.UcryptoProvider
を使用してロードできます。JDKに含まれているモジュールで構成が必要なものはこれらのみなので、-providerclass
オプションで最もよく使用されます。クラス・パスに配置され、リフレクションによってロードされるレガシー・セキュリティ・プロバイダには、引き続き-providerclass
を使用する必要があります。 - {
-providerclass class
[-providerarg arg
]}: オプションで構成引数を指定し、完全修飾クラス名でセキュリティ・プロバイダを追加します。たとえば、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
という証明書を作成します。次のコマンドでは、
ca
、ca1
、ca2
およびe1
という4つのキー・ペアを作成します。keytool -alias ca -dname CN=CA -genkeypair keytool -alias ca1 -dname CN=CA -genkeypair keytool -alias ca2 -dname CN=CA -genkeypair keytool -alias e1 -dname CN=E1 -genkeypair
次の2つのコマンドでは、署名付き証明書のチェーンを作成します。
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
を作成し、それをca2
によって署名されたe1.cert
ファイルに格納します。この結果、e1
の証明書チェーンにはca
、ca1
、および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拡張 -
{
-validity days
}: 有効日数 -
[
-keypass arg
]: キーのパスワード -
{
-keystore keystore
}: キーストア名 -
[
-storepass arg
]: キーストアのパスワード -
{
-storetype type
}: キーストアのタイプ -
{
-providername name
}: プロバイダ名 -
{
-addprovider name
[-providerarg arg
]}: オプションで構成引数を指定し、名前(SunPKCS11など)でセキュリティ・プロバイダを追加します。 -
{
-providerclass class
[-providerarg arg
]}: オプションで構成引数を指定し、完全修飾クラス名でセキュリティ・プロバイダを追加します。 -
{
-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]
最初の形式では、現在の時間から指定された値だけシフトした時間が発行時間になります。この値は、サブ値のシーケンスを連結したものです。各サブ値の内部では、プラス記号(+)が未来へのシフトを意味し、マイナス記号(-)が過去へのシフトを意味します。シフトする時間は、年、月、日、時、分または秒(それぞれ
y
、m
、d
、H
、M
またはS
の1文字で示される)を単位とするnnn
です。発行時間の正確な値は、左端のサブ値から順にjava.util.GregorianCalendar.add(int field, int amount)
メソッドを使用して計算されます。たとえば、発行時間は次のように指定できます。Calendar c = new GregorianCalendar(); c.add(Calendar.YEAR, -1); c.add(Calendar.MONTH, 1); c.add(Calendar.DATE, -1); return c.getTime()
2番目の形式では、ユーザーが年/月/日と時間:分:秒の2つの部分に正確な発行時間を設定します(ローカル・タイムゾーンを使用)。ユーザーは、一方の部分のみを指定できます。その場合、もう一方の部分は現在の日付(または時間)と同じと見なされます。ユーザーは、形式の定義に示された正確な桁数を指定する必要があります(短い場合は0でパディングします)。日付と時間の両方を指定する場合は、2つの部分の間に空白文字を1つのみ入れます。時間は、常に24時間形式で指定してください。
このオプションを指定しなかった場合、開始日は現在の時間になります。このオプションは1回のみ指定できます。
date
の値には、証明書が有効と見なされる(-startdate
で指定された日付、または-startdate
が指定されていない場合は現在の日付から始まる)日数を指定します。 -
-
-genseckey
-
-genseckey
コマンドで使用可能なオプションは次のとおりです。-
{
-alias alias
}: 処理するエントリの別名 -
[
-keypass arg
] : キーのパスワード -
{
-keyalg alg
}: キー・アルゴリズム名 -
{
-keysize size
}: キーのビット・サイズ -
{
-keystore keystore
}: キーストア名 -
[
-storepass arg
]: キーストアのパスワード -
{
-storetype type
}: キーストアのタイプ -
{
-providername name
}: プロバイダ名 -
{
-addprovider name
[-providerarg arg
]}: オプションで構成引数を指定し、名前(SunPKCS11など)でセキュリティ・プロバイダを追加します。 -
{
-providerclass class
[-providerarg arg
]}: オプションで構成引数を指定し、完全修飾クラス名でセキュリティ・プロバイダを追加します。 -
{
-providerpath list
}: プロバイダのクラス・パス -
{
-v
}: 詳細出力 -
{
-protected
}: 保護されているメカニズムで提供されるパスワード
-genseckey
コマンドを使用して秘密キーを生成し、これをalias
で特定される新しいKeyStore.SecretKeyEntry
に格納します。-keyalg
の値には秘密キーの生成に使用するアルゴリズムを、-keysize
の値には生成するキーのサイズを、それぞれ指定します。-keypass
の値には、秘密キーを保護するパスワードを指定します。パスワードを指定しなかった場合は、ユーザーにその入力が求められます。プロンプトで[Return]キーを押すと、キーのパスワードが-keystore
に使用されているパスワードと同じパスワードに設定されます。-keypass
の値は、6文字以上である必要があります。 -
-
-importcert
-
-importcert
コマンドで使用可能なオプションは次のとおりです。-
{
-noprompt
}: プロンプトを表示しません -
{
-trustcacerts
}: cacertsからの証明書を信頼します -
{
-protected
}: パスワードは保護メカニズムを介して提供されます -
{
-alias alias
}: 処理するエントリの別名 -
{
-file file
}: 入力ファイル名 -
[
-keypass arg
]: キーのパスワード -
{
-keystore keystore
}: キーストア名 -
{
-cacerts
}: cacertsキーストアにアクセスします -
[
-storepass arg
]: キーストアのパスワード -
{
-storetype type
}: キーストアのタイプ -
{
-providername name
}: プロバイダ名 -
{
-addprovider name
[-providerarg arg
]}: オプションで構成引数を指定し、名前(SunPKCS11など)でセキュリティ・プロバイダを追加します。 -
{
-providerclass class
[-providerarg arg
]}: オプションで構成引数を指定し、完全修飾クラス名でセキュリティ・プロバイダを追加します。 -
{
-providerpath list
}: プロバイダのクラス・パス -
{
-v
}: 詳細出力
-importcert
コマンドを使用して、-file file
から証明書または証明書チェーン(証明書チェーンは、PKCS#7形式の応答またはX.509証明書のシーケンスで提供される)を読み取り、-alias
によって特定されるkeystore
エントリに格納します。-file file
が指定されていない場合は、stdin
から証明書または証明書チェーンを読み取ります。keytool
コマンドでは、X.509 v1、v2、v3の証明書、およびPKCS#7タイプの証明書で構成されるPKCS#7形式の証明書チェーンをインポートできます。インポートするデータは、バイナリ・エンコード形式または出力可能エンコード形式(Base64エンコードとも呼ばれる)のどちらかで提供する必要があります。出力可能エンコード形式は、インターネットRFC 1421規格で定義されています。後者の場合、エンコードは-----BEGIN
で始まる文字列で開始され、-----END
で始まる文字列で終了する必要があります。証明書のインポートには2つの目的があります。信頼できる証明書のリストに証明書を追加することと、証明書署名要求(CSR)を認証局(CA)に送信した結果としてそのCAから受け取った証明書応答をインポートすることです。証明書要求を生成するためのコマンドの
-certreq
コマンドを参照してください。インポートのタイプは、
-alias
オプションの値によって指定します。別名がキー・エントリを指していない場合、keytool
コマンドはユーザーが信頼できる証明書エントリを追加しようとしていると見なします。この場合、別名がキーストア内に存在してない必要があります。別名が存在している場合、その別名の信頼できる証明書がすでに存在することになるため、keytool
コマンドはエラーを出力し、証明書をインポートしません。-alias
がキー・エントリを指している場合、keytool
コマンドはユーザーが証明書応答をインポートしようとしていると見なします。 -
-
-importpass
-
-importpass
コマンドで使用可能なオプションは次のとおりです。-
{
-alias alias
}: 処理するエントリの別名 -
[
-keypass arg
]: キーのパスワード -
{
-keyalg alg
}: キー・アルゴリズム名 -
{
-keysize size
}: キーのビット・サイズ -
{
-keystore keystore
}: キーストア名 -
[
-storepass arg
]: キーストアのパスワード -
{
-storetype type
}: キーストアのタイプ -
{
-providername name
}: プロバイダ名 -
{
-addprovider name
[-providerarg arg
]}: オプションで構成引数を指定し、名前(SunPKCS11など)でセキュリティ・プロバイダを追加します。 -
{
-providerclass class
[-providerarg arg
]}: オプションで構成引数を指定し、完全修飾クラス名でセキュリティ・プロバイダを追加します。 -
{
-providerpath list
}: プロバイダのクラス・パス -
{
-v
}: 詳細出力 -
{
-protected
}: 保護されているメカニズムで提供されるパスワード
-importpass
コマンドを使用してパスフレーズをインポートし、これを-alias
で特定される新しいKeyStore.SecretKeyEntry
に格納します。パスフレーズは標準入力ストリームで指定されます。指定されていない場合、ユーザーにその入力が求められます。-keypass
オプションは、インポートされたパスフレーズを保護するためのパスワードを提供します。パスワードを指定しなかった場合は、ユーザーにその入力が求められます。プロンプトで[Return]キーを押すと、キーのパスワードがkeystore
に使用されるパスワードと同じパスワードに設定されます。-keypass
の値は、6文字以上である必要があります。 -
別のキーストアの内容をインポートするためのコマンド
-
-importkeystore
-
-importkeystore
コマンドで使用可能なオプションは次のとおりです。-
{
-srckeystore keystore
}: ソース・キーストア名 -
{
-destkeystore keystore
}: ターゲット・キーストア名 -
{
-srcstoretype type
}: ソース・キーストアのタイプ -
{
-deststoretype type
}: ターゲット・キーストアのタイプ -
[
-srcstorepass arg
]: ソース・キーストアのパスワード -
[
-deststorepass arg
]: ターゲット・キーストアのパスワード -
{
-srcprotected
パスワードで保護されるソース・キーストア -
{
-destprotected
}: パスワードで保護されるターゲット・キーストア -
{
-srcprovidername name
}: ソース・キーストア・プロバイダ名 -
{
-destprovidername name
}: ターゲット・キーストア・プロバイダ名 -
{
-srcalias alias
}: ソース別名 -
{
-destalias alias
}: ターゲット別名 -
[
-srckeypass arg
]: ソースのキーのパスワード -
[
-destkeypass arg
]: ターゲットのキーのパスワード -
{
-noprompt
}: プロンプトを表示しません -
{
-addprovider name
[-providerarg arg
]}: オプションで構成引数を指定し、名前(SunPKCS11など)でセキュリティ・プロバイダを追加します。 -
{
-providerclass class
[-providerarg arg
]}: オプションで構成引数を指定し、完全修飾クラス名でセキュリティ・プロバイダを追加します -
{
-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キーストアのstorepass
とkeypass
を同じにする必要があります。これらのツール用のPKCS#12キーストアを作成するには、常に-deststorepass
と同じ-destkeypass
を指定します。-srcalias
オプションが指定されなかった場合、ソース・キーストア内のすべてのエントリがターゲット・キーストア内にインポートされます。各ターゲット・エントリは対応するソース・エントリの別名の下に格納されます。ソースのエントリがパスワードで保護されていた場合、-srcstorepass
を使用してそのエントリが回復されます。-srcstorepass
が指定されなかったか正しくなかった場合は、ユーザーにパスワードの入力が求められます。ソース・キーストア内のあるエントリ・タイプがターゲット・キーストアでサポートされていない場合や、あるエントリをターゲット・キーストアに格納する際にエラーが発生した場合、ユーザーはそのエントリをスキップして処理を続行するか、あるいは処理を中断するかの選択を求められます。ターゲット・エントリはソース・エントリのパスワードによって保護されます。ターゲット別名がターゲット・キーストア内にすでに存在していた場合、ユーザーは、そのエントリを上書きするか、あるいは異なる別名で新しいエントリを作成するかの選択を求められます。
-noprompt
オプションを指定した場合、ユーザーは新しいターゲット別名の入力を求められません。既存のエントリはそのターゲット別名で上書きされます。インポートできないエントリはスキップされ、警告が表示されます。 -
証明書要求を生成するためのコマンド
-
-certreq
-
-certreq
コマンドで使用可能なオプションは次のとおりです。-
{
-alias alias
}: 処理するエントリの別名 -
{
-sigalg alg
}: 署名アルゴリズム名 -
{
-file file
}: 出力ファイル名 -
[
-keypass arg
]: キーのパスワード -
{
-keystore keystore
}: キーストア名 -
{
-dname name
}: 識別名 -
{
-ext value
}: X.509拡張 -
[
-storepass arg
]: キーストアのパスワード -
{
-storetype type
}: キーストアのタイプ -
{
-providername name
}: プロバイダ名 -
{
-addprovider name
[-providerarg arg
]}: オプションで構成引数を指定し、名前(SunPKCS11など)でセキュリティ・プロバイダを追加します。 -
{
-providerclass class
[-providerarg arg
]}: オプションで構成引数を指定し、完全修飾クラス名でセキュリティ・プロバイダを追加します。 -
{
-providerpath list
}: プロバイダのクラス・パス -
{
-v
}: 詳細出力 -
{
-protected
}: 保護されているメカニズムで提供されるパスワード
-certreq
コマンドを使用して、PKCS #10形式で証明書署名要求(CSR)を生成します。CSRはCAに送信することを目的として作成されます。CAは、証明書要求者を(通常はオフラインで)認証し、証明書または証明書チェーンを送り返します。この証明書または証明書チェーンは、キーストア内の既存の証明書チェーン(最初は自己署名証明書)に置き換わります。
alias
に関連付けられた秘密キーは、PKCS #10証明書要求を作成するために使用されます。秘密キーにアクセスするには、正しいパスワードを指定する必要があります。コマンド行で-keypass
を指定しておらず、キーストアの整合性の保護に使用されるパスワードと異なる場合、そのパスワードの入力を求められます。-dname
が指定された場合は、これがCSR内のサブジェクトとして使用されます。それ以外の場合は、別名に関連付けられたX.500識別名が使われます。-sigalg
の値には、CSRに署名するときに使用するアルゴリズムを指定します。CSRは
-file file
に格納されます。ファイルが指定されていない場合は、-stdout
にCSRが出力されます。CAからの応答をインポートするには、
-importcert
コマンドを使用します。 -
データをエクスポートするためのコマンド
-
-exportcert
-
-exportcert
コマンドで使用可能なオプションは次のとおりです。-
{
-rfc
}: RFCスタイルの出力 -
{
-alias alias
}: 処理するエントリの別名 -
{
-file file
}: 出力ファイル名 -
{
-keystore keystore
}: キーストア名 -
{
-cacerts
}: cacertsキーストアにアクセスします -
[
-storepass arg
]: キーストアのパスワード -
{
-storetype type
}: キーストアのタイプ -
{
-providername name
}: プロバイダ名 -
{
-addprovider name
[-providerarg arg
]}: オプションで構成引数を指定し、名前(SunPKCS11など)でセキュリティ・プロバイダを追加します。 -
{
-providerclass class
[-providerarg arg
]}: オプションで構成引数を指定し、完全修飾クラス名でセキュリティ・プロバイダを追加します。 -
{
-providerpath list
}: プロバイダのクラス・パス -
{
-v
}: 詳細出力 -
{
-protected
}: 保護されているメカニズムで提供されるパスワード
-exportcert
コマンドを使用して、-alias alias
に関連付けられた証明書をキーストアから読み取り、cert_file
ファイルに格納します。ファイルが指定されていない場合は、stdout
に証明書が出力されます。デフォルトでは、バイナリ・エンコードで証明書が出力されます。
-rfc
オプションが指定されている場合は、インターネットRFC 1421証明書エンコード規格で定義されている出力可能エンコード形式で出力されます。-alias
が信頼できる証明書を参照している場合は、その証明書が出力されます。それ以外の場合、-alias
は、関連付けられた証明書チェーンを持つキー・エントリを参照します。この場合は、チェーン内の最初の証明書が返されます。この証明書は、-alias
によって表されるエンティティの公開キーを認証する証明書です。 -
データを表示するためのコマンド
-
-list
-
-list
コマンドで使用可能なオプションは次のとおりです。-
{
-rfc
}: RFCスタイルの出力 -
{
-alias alias
}: 処理するエントリの別名 -
{
-keystore keystore
}: キーストア名 -
{
-cacerts
}: cacertsキーストアにアクセスします -
[
-storepass arg
]: キーストアのパスワード -
{
-storetype type
}: キーストアのタイプ -
{
-providername name
}: プロバイダ名 -
{
-addprovider name
[-providerarg arg
]}: オプションで構成引数を指定し、名前(SunPKCS11など)でセキュリティ・プロバイダを追加します。 -
{
-providerclass class
[-providerarg arg
] }: オプションで構成引数を指定し、完全修飾クラス名でセキュリティ・プロバイダを追加します。 -
{
-providerpath list
}: プロバイダのクラス・パス -
{
-v
}: 詳細出力 -
{
-protected
}: 保護されているメカニズムで提供されるパスワード
-list
コマンドを使用して、-alias
で特定されるキーストア・エントリの内容をstdout
に出力します。-alias alias
が指定されていない場合は、キーストア全体の内容が出力されます。このコマンドは、デフォルトでは証明書のSHA-256フィンガプリントを出力します。
-v
オプションが指定されている場合は、所有者、発行者、シリアル番号、拡張機能などの付加的な情報とともに、人間が読むことのできる形式で証明書が出力されます。-rfc
オプションが指定されている場合は、インターネットRFC 1421証明書エンコード規格で定義されている出力可能エンコード形式で証明書の内容が出力されます。ノート:
同じコマンドで
-v
と-rfc
の両方を指定することはできません。指定しないとエラーがレポートされます。 -
-
-printcert
-
-printcert
コマンドで使用可能なオプションは次のとおりです。-
{
-rfc
}: RFCスタイルの出力 -
{
-file cert_file
}: 入力ファイル名 -
{
-sslserver server[:port]
}: Secure Sockets Layer (SSL)サーバーのホストおよびポート -
{
-jarfile JAR_file
}: 署名付き.jar
ファイル -
{
-v
}: 詳細出力
-printcert
コマンドを使用して、-file cert_file
からの証明書、-sslserver server[:port]
にあるSSLサーバー、または-jarfile JAR_file
で指定された署名付きJARファイルを読み取って出力します。その内容は判読可能な形式で出力されます。ポートが指定されていない場合は、標準のHTTPSポート443が想定されます。ノート:
-sslserver
オプションと-file
オプションは同じコマンドには指定できません。指定しないとエラーがレポートされます。どちらのオプションも指定されていない場合は、stdin
から証明書が読み取られます。-rfc
が指定されている場合、keytool
コマンドはインターネットRFC 1421証明書エンコード規格で定義されているPEMモードで証明書を出力します。証明書がファイルまたは
stdin
から読み取られた場合は、バイナリ・エンコード形式またはインターネットRFC 1421証明書エンコード規格で定義されている出力可能エンコード形式で証明書が出力される可能性があります。SSLサーバーがファイアウォールの背後にある場合は、コマンド行に
-J-Dhttps.proxyHost=proxyhost
および-J-Dhttps.proxyPort=proxyport
オプションを指定してプロキシ・トンネリングを使用できます。ノート:
このオプションはキーストアとは関係なく使用できます。
-
-
-printcertreq
-
-printcertreq
コマンドで使用可能なオプションは次のとおりです。-
{
-file file
}: 入力ファイル名 -
{
-v
}: 詳細出力
-printcertreq
コマンドを使用して、PKCS #10形式の証明書要求の内容を出力します。この要求は、keytool -certreq
コマンドで生成できます。このコマンドは、ファイルから要求を読み取ります。ファイルが存在しない場合は、標準入力から要求が読み取られます。 -
-
-printcrl
-
-printcrl
コマンドで使用可能なオプションは次のとおりです。-
-file crl
: 入力ファイル名 -
{
-v
}: 詳細出力
-printcrl
コマンドを使用して、-file crl
から証明書失効リスト(CRL)を読み取ります。CRLは、発行元のCAによって取り消されたデジタル証明書のリストです。CAによってcrl
ファイルが生成されます。ノート:
このオプションはキーストアとは関係なく使用できます。
-
キーストアを管理するためのコマンド
-
-storepasswd
-
-storepasswd
コマンドで使用可能なオプションは次のとおりです。-
[
-new arg
]: 新規パスワード -
{
-keystore keystore
}: キーストア名 -
{
-cacerts
}: cacertsキーストアにアクセスします -
[
-storepass arg
]: キーストアのパスワード -
{
-storetype type
}: キーストアのタイプ -
{
-providername name
}: プロバイダ名 -
{
-addprovider name
[-providerarg arg
]}: オプションで構成引数を指定し、名前(SunPKCS11など)でセキュリティ・プロバイダを追加します。 -
{
-providerclass class
[-providerarg arg
]}: オプションで構成引数を指定し、完全修飾クラス名でセキュリティ・プロバイダを追加します。 -
{
-providerpath list
}: プロバイダのクラス・パス -
{
-v
}: 詳細出力
-storepasswd
コマンドを使用して、キーストアの内容の整合性を保護するために使用するパスワードを変更します。新しいパスワードは-new arg
で設定しますが、これは6文字以上にする必要があります。 -
-
-keypasswd
-
-keypasswd
コマンドで使用可能なオプションは次のとおりです。-
{
-alias alias
}: 処理するエントリの別名 -
[
-keypass old_keypass
]: キーのパスワード -
[
-new new_keypass
]: 新規パスワード -
{
-keystore keystore
}: キーストア名 -
{
-storepass arg
}: キーストアのパスワード -
{
-storetype type
}: キーストアのタイプ -
{
-providername name
}: プロバイダ名 -
{
-addprovider name
[-providerarg arg
]}: オプションで構成引数を指定し、名前(SunPKCS11など)でセキュリティ・プロバイダを追加します。 -
{
-providerclass class
[-providerarg arg
]}: オプションで構成引数を指定し、完全修飾クラス名でセキュリティ・プロバイダを追加します。 -
{
-providerpath list
}: プロバイダのクラス・パス -
{
-v
}: 詳細出力
-keypasswd
コマンドを使用して、(-alias
によって特定される非公開/秘密キーを保護している)パスワードを-keypass old_keypass
から-new new_keypass
に変更します。パスワードの値は6文字以上にする必要があります。コマンド行で
-keypass
オプションを指定しておらず、-keypass
パスワードがキーストアのパスワード(-storepass arg
)と異なる場合は、ユーザーにパスワードの入力が求められます。コマンド行で
-new
オプションを指定しなかった場合は、新しいパスワードの入力を求められます -
-
-delete
-
-delete
コマンドで使用可能なオプションは次のとおりです。-
[
-alias alias
]: 処理するエントリの別名 -
{
-keystore keystore
}: キーストア名 -
{
-cacerts
}: cacertsキーストアにアクセスします -
[
-storepass arg
]: キーストアのパスワード -
{
-storetype type
}: キーストアのタイプ -
{
-providername name
}: プロバイダ名 -
{
-addprovider name
[-providerarg arg
]}: オプションで構成引数を指定し、名前(SunPKCS11など)でセキュリティ・プロバイダを追加します。 -
{
-providerclass class
[-providerarg arg
]}: オプションで構成引数を指定し、完全修飾クラス名でセキュリティ・プロバイダを追加します。 -
{
-providerpath list
}: プロバイダのクラス・パス -
{
-v
}: 詳細出力 -
{
-protected
}: 保護されているメカニズムで提供されるパスワード
-delete
コマンドを使用して、キーストアから-alias alias
エントリを削除します。コマンド行で指定しなかった場合は、ユーザーにalias
の入力が求められます。 -
-
-changealias
-
-changealias
コマンドで使用可能なオプションは次のとおりです。-
{
-alias alias
}: 処理するエントリの別名 -
[
-destalias alias
]: ターゲット別名 -
[
-keypass arg
]: キーのパスワード -
{
-keystore keystore
}: キーストア名 -
{
-cacerts
}: cacertsキーストアにアクセスします -
[
-storepass arg
]: キーストアのパスワード -
{
-storetype type
}: キーストアのタイプ -
{
-providername name
}: プロバイダ名 -
{
-addprovider name
[-providerarg arg
]}: オプションで構成引数を指定し、名前(SunPKCS11など)でセキュリティ・プロバイダを追加します。 -
{
-providerclass class
[-providerarg arg
]}: オプションで構成引数を指定し、完全修飾クラス名でセキュリティ・プロバイダを追加します。 -
{
-providerpath list
}: プロバイダのクラス・パス -
{
-v
}: 詳細出力 -
{
-protected
}: 保護されているメカニズムで提供されるパスワード
-changealias
コマンドを使用して、既存のキーストア・エントリを-alias alias
から新しい-destalias alias
に移動します。ターゲット別名を指定しなかった場合、このコマンドはユーザーにその入力を求めます。元のエントリがエントリ・パスワードで保護されていた場合、-keypass
オプションでそのパスワードを指定できます。キーのパスワードが指定されなかった場合、-storepass
(指定された場合)がまず試されます。その試みが失敗すると、ユーザーはパスワードの入力を求められます。 -
ヘルプ情報を表示するためのコマンド
--help
を使用してkeytool
コマンドのリストを表示することも、特定のkeytool
コマンドのヘルプ情報を表示することもできます。
-
keytool
コマンドのリストを表示するには、次のように入力します。keytool --help
-
特定の
keytool
コマンドのヘルプ情報を表示するには、次のように入力します。keytool -command --help
一般的なコマンドのオプション
-v
オプションは、--help
コマンドを除くすべてのコマンドで使用できます。-v
オプションを指定した場合、冗長モードになり、詳細な情報が出力されます。
-Joption
引数は、任意のコマンドで使用できます。-Joption
が使用されている場合、指定されたoption
文字列がJavaインタプリタに直接渡されます。このオプションには、空白を含めることはできません。このオプションは、実行環境またはメモリー使用を調整する場合に便利です。指定できるインタプリタ・オプションのリストを表示するには、コマンド行でjava -h
またはjava -X
と入力します。
次のオプションは、キーストアに対する操作を行うすべてのコマンドで指定できます:
-
-addprovider name
-
名前(SunPKCS11など)でセキュリティ・プロバイダを追加する場合に使用されます。
-
-cacerts cacerts
-
cacerts
キーストアに対して作用します。このオプションは、"-keystore path_to_cacerts -storetype type_of_cacerts"
と同等です。-keystore
または-storetype
オプションが-cacerts
オプションとともに使用されると、エラーがレポートされます。 -
-conf file
- 事前構成済のオプション・ファイルを指定します。
-
-ext {name{:critical} {=value}}
-
X.509証明書の拡張機能を示します。このオプションは、生成された証明書に拡張機能を組み込むために
-genkeypair
および-gencert
で、または証明書要求で要求された拡張機能を表示するために-certreq
で使用できます。このオプションは、複数回使用できます。name
引数には、サポートされている拡張機能名(サポートされている名前付き拡張機能を参照)または任意のOID番号を指定できます。value
引数を指定した場合は、拡張機能の引数を示します。value
を省略した場合は、拡張機能のデフォルト値または拡張機能自体に引数は不要です。修飾子:critical
を指定した場合は、拡張機能のisCritical
属性がtrue
であることを意味し、それ以外の場合はfalse
であることを意味します。:critical
のかわりに:c
を使用できます。 -
-keystore keystore
-
キーストアの場所を指定します。
JKS
storetype
が使用され、かつキーストア・ファイルがまだ存在していなかった場合、特定のkeytool
コマンドを実行すると、新しいキーストア・ファイルが作成されます。たとえば、keytool -genkeypair
の呼出し時に-keystore
オプションが指定されなかった場合、.keystore
という名前のデフォルト・キーストア・ファイルがユーザーのホーム・ディレクトリ内にまだ存在していなければ、そこに作成されます。同様に、-keystore ks_file
オプションが指定されたがks_file
が存在しなかった場合は、そのファイルが作成されます。JKSstoretype
の詳細は、「キーストアの別名」のキーストアの実装に関する項を参照してください。-keystore
オプションからの入力ストリームは、KeyStore.load
メソッドに渡されます。URLとしてNONE
が指定されている場合は、nullのストリームがKeyStore.load
メソッドに渡されます。NONE
は、キーストアがファイルベースでない場合に指定します。たとえば、キーストアがハードウェア・トークン・デバイスに置かれている場合などです。 -
-protected=true|false
-
専用PINリーダーなどの保護された認証パスを介してパスワードを指定する必要がある場合は、この値を
true
として指定します。-importkeystore
コマンドには2つのキーストアが関係しているため、2つのオプション(-srcprotected
および-destprotected
)をそれぞれソース・キーストアおよびターゲット・キーストアとして指定します。 -
-providerarg arg
-
-addprovider
または-providerclass
オプションとともに使用し、class
名のコンストラクタに対するオプションの文字列入力引数を表します。 -
-providerclass class
-
暗号化サービス・プロバイダがセキュリティ・プロパティ・ファイルに指定されていないときに、そのマスター・クラス・ファイルの名前を指定する場合に使用されます。
-
-providername name
-
セキュリティ・プロパティ・ファイル内に含まれる暗号化サービス・プロバイダ名を特定するために使用されます。
-
-providerpath list
-
プロバイダのクラス・パスを指定するために使用されます。
-
-storepass [:env | :file ] argument
-
キーストアの整合性を保護するために使うパスワードを指定します。
修飾子
env
またはfile
が指定されていない場合、パスワードの値はargument
です。これは6文字以上である必要があります。それ以外の場合、パスワードは次のように取得されます。-
env
:argument
という名前の環境変数からパスワードを取得します。 -
file
: argumentという名前のファイルからパスワードを取得します。
ノート:
-keypass
、-srckeypass
、-destkeypass
、-srcstorepass
、-deststorepass
など、パスワードが必要な他のすべてのオプションで修飾子env
およびfile
を受け入れます。パスワード・オプションと修飾子は必ずコロン(:)で区切ってください。このパスワードは、キーストアの内容にアクセスするすべてのコマンドで使われます。このようなコマンドでは、コマンド行で
-storepass
オプションを指定しなかった場合、パスワードの入力を求められます。キーストアから情報を取り出す場合、パスワードはオプションです。パスワードを指定しなかった場合は、取得された情報の整合性を検証できないため、警告が表示されます。
-
-
-storetype storetype
-
この修飾子は、インスタンスを生成するキーストアのタイプを指定します。
事前構成済のオプション・ファイル
事前構成済のオプション・ファイルは、-conf
オプションを使用して指定できるJavaプロパティ・ファイルです。各プロパティは、keytool.command_name
をプロパティ名として使用するkeytoolコマンドのデフォルトのオプションを表します。keytool.all
という名前の特別なプロパティは、すべてのコマンドに適用されるデフォルトのオプションを表します。プロパティの値には、関連付けられているシステム・プロパティに拡張される${prop}
を含めることができます。オプション値の内側に空白が含まれている場合は、引用符("または')で囲む必要があります。すべてのプロパティ名は小文字である必要があります。
事前構成済のオプション・ファイルを使用してkeytool
を起動する場合、まずkeytool.all
の値(存在する場合)がkeytoolコマンド行の先頭に付加され、次にコマンド名の値(存在する場合)、最後にコマンド行の既存のオプションが付加されます。単一値オプションの場合、特定のコマンドのプロパティでkeytool.all
値をオーバーライドでき、コマンド行で指定した値で両方をオーバーライドできます。複数値オプションの場合、これらのすべてがkeytool
によって使用されます。後述の「事前構成済のオプション・ファイルの使用例」を参照してください。
オプション値の例
次の例は、各種のオプション値のデフォルトを示しています。
-alias "mykey"
-keyalg
"DSA" (when using -genkeypair)
"DES" (when using -genseckey)
-keysize
2048 (when using -genkeypair and -keyalg is "RSA")
2048 (when using -genkeypair and -keyalg is "DSA")
256 (when using -genkeypair and -keyalg is "EC")
56 (when using -genseckey and -keyalg is "DES")
168 (when using -genseckey and -keyalg is "DESede")
-validity 90
-keystore <the file named .keystore in the user's home directory>
-destkeystore <the file named .keystore in the user's home directory>
-storetype <the value of the "keystore.type" property in the
security properties file, which is returned by the static
getDefaultType method in java.security.KeyStore>
-file
stdin (if reading)
stdout (if writing)
-protected false
証明書または証明書要求の生成中、次のように適切なレベルのセキュリティ強度を提供するために、デフォルトの署名アルゴリズム(-sigalg
オプション)が基礎となる秘密キーのアルゴリズムから導出されます。
keyalg | keysize | デフォルトのsigalg |
---|---|---|
DSA |
任意のサイズ |
SHA256withDSA |
RSA |
<= 3072 <= 7680 > 7680 |
SHA256withRSA SHA384withRSA SHA512withRSA |
EC |
<384 <512 = 512 |
SHA256withECDSA SHA384withECDSA SHA512withECDSA |
ノート:
追加設定なしのセキュリティを向上させるために、デフォルトのキーのサイズおよび署名アルゴリズム名はJDKの各リリースでより強い値に定期的に更新されます。古いJDKのリリースとの相互運用性が重要な場合は、このデフォルトがそれらのリリースでサポートされていることを確認してください。または、-keysize
または-sigalg
オプションを使用して、自己責任でデフォルト値をオーバーライドすることもできます。
サポートされている名前付き拡張機能
keytool
コマンドは、これらの名前付き拡張機能をサポートしています。名前は、大/小文字が区別されません。
-
BC
またはBasicContraints
-
値:
完全な形式である
ca:{true|false}[,pathlen:len]
またはca:true,pathlen:len
の短縮形であるlen
。len
が省略されている場合、結果となる値はca:true
です。 -
KU
またはKeyUsage
-
値:
usage
(,usage
)*usage
には次のいずれかを指定できます。-
digitalSignature
-
nonRepudiation (contentCommitment
) -
keyEncipherment
-
dataEncipherment
-
keyAgreement
-
keyCertSign
-
cRLSign
-
encipherOnly
-
decipherOnly
あいまいさがないかぎり、
usage
引数は、最初の数文字(digitalSignature
の場合はdig
など)に短縮したり、キャメル記法(digitalSignature
の場合は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 -keypass password
-keystore /working/mykeystore
-storepass passwd -validity 180
このコマンドは、作業ディレクトリにmykeystore
という名前のキーストアを作成し(まだ存在していない場合)、作成したキーストアに-keypass
で指定したパスワードを割り当てます。識別名がmyname
、mygroup
、mycompany
および2文字の国コードであるmycountry
のエンティティの公開/秘密キーのペアが生成されます。キーはどちらも2048ビットで、キーの作成にはデフォルトのDSAキー生成アルゴリズムを使用します
このコマンドは、デフォルトのSHA256withDSA署名アルゴリズムを使用して、公開キーと識別名情報を含む自己署名証明書を作成します。証明書は、有効期間が180日で、-alias business
で参照されるキーストア・エントリ内の秘密キーに関連付けられます。秘密キーには、-keypass
で指定したパスワードが割り当てられます。
オプションのデフォルト値を使うと、コマンドが大幅に短くなります。その場合、オプションを指定する必要はありません。指定しなかったオプションにデフォルト値があれば、デフォルト値が使用されます。必要な値については入力を求められます。たとえば、次のように入力することもできます。
keytool -genkeypair
この場合は、mykey
という別名でキーストア・エントリが作成され、新しく生成されたキー・ペア、および90日間有効な証明書がこのエントリに格納されます。このエントリは、.keystore
という名前のキーストア内のホーム・ディレクトリに配置されます。.keystore
がまだ存在しない場合は作成されます。識別名情報、キーストアのパスワードおよび秘密キーのパスワードについては、入力を求められます。
ノート:
以降の例では、オプションを指定しないで-genkeypair
コマンドを実行したものとし、値の入力を求められた場合は、最初の-genkeypair
コマンドに指定した値を入力したものとします。たとえば、識別名をcn=myname
, ou=mygroup
, o=mycompany
, c=mycountry
とします。
CAに対する署名付き証明書の要求
ノート:
キー・ペアの生成により自己署名証明書が作成されました。ただし証明書は、CAの署名が付いていれば他のユーザーから信頼される可能性が高くなります。
CAの署名を取得するには、次の処理を実行します。
-
CSRを生成します。
keytool -certreq -file myname.csr
デフォルトの別名
mykey
によって特定されるエンティティのCSRが作成され、myname.csr
という名前のファイルに要求が配置されます。 -
myname.csr
をDigiCertなどのCAに送信します。
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である会社から
X.cer
ファイルを入手してあり、そのファイルがそのCAの公開キーを認証する自己署名証明書であるとします。信頼できる証明書としてその証明書をインポートする前に、証明書が有効であることを確認する必要があります。-
keytool -printcert
コマンドを使用するか、-noprompt
オプションを指定せずにkeytool -importcert
コマンドを使用して、証明書を表示します。表示された証明書のフィンガプリントが期待されるフィンガプリントと一致していることを確認します。 -
証明書を送信した人に連絡し、表示されたフィンガプリントを、この人が提示した(または安全な公開キーのリポジトリによって提示される)フィンガプリントと比較します。
フィンガプリントが一致した場合にのみ、送信途中に他の何者かの証明書(攻撃者の証明書など)ですり替えられていないことを保証できます。このような攻撃が行われていた場合、チェックを行わずに証明書をインポートすると、攻撃者によって署名されたすべてのものを信頼することになります。
-
-
自己署名証明書を証明書チェーンで置き換えます。証明書チェーンでは、各証明書がチェーン内の前の証明書の署名者の公開キーを認証し、それがルートCAまで続きます。
証明書を有効なものとして信頼する場合は、次のコマンドを入力して証明書をキーストアに追加できます。
keytool -importcert -alias alias -file X.cer
このコマンドは、CA証明書ファイルのデータから、キーストア内に信頼できる証明書エントリを作成し、
alias
の値をそのエントリに割り当てます。
CAからの証明書応答のインポート
証明書署名要求の提出先のCAの公開キーを認証する証明書をインポートした後(または同種の証明書がすでにcacerts
ファイル内に存在している場合は)、証明書応答をインポートし、自己署名証明書を証明書チェーンで置き換えることができます。
-
CAの応答がチェーンの場合、CAから送り返されます。
-
CAの応答が単一の証明書の場合、作成されます。この証明書チェーンは、証明書応答と、応答のインポート先のキーストア内または
cacerts
キーストア・ファイル内で使用可能な信頼できる証明書を使用して構成されます。
たとえば、証明書署名要求をDigiCertに送信した場合は、次のコマンドを入力してその応答をインポートできます。
ノート:
この例の場合、返される証明書の名前はDCmyname.cer
になります。
keytool -importcert -trustcacerts -file DCmyname.cer
公開キーを認証する証明書のエクスポート
ノート:
jarsigner
コマンドを使用してJava Archive (JAR)ファイルに署名した場合、このファイルを使用するクライアントはその署名を認証する必要があります。
クライアントが認証する方法の1つは、署名者の公開キー証明書を信頼できるエントリとしてクライアントのキーストアにインポートすることです。そのために、証明書をエクスポートしてクライアントに提供できます。
たとえば:
-
次のコマンドを入力して、証明書を
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
-srcstorepass passwd
-deststorepass passwd
また、importkeystore
コマンドを使用して、ソース・キーストア内の単一のエントリをターゲット・キーストアにインポートすることもできます。この場合、前の例で使用したオプションに加え、インポート対象の別名を指定する必要があります。-srcalias
オプションを指定すると、次のように必要なターゲット別名、秘密キーまたは秘密キーの保護用パスワード、およびターゲットの保護用パスワードも指定できます。
keytool -importkeystore
-srckeystore key.jks -destkeystore NONE
-srcstoretype JKS -deststoretype PKCS11
-srcstorepass passwd
-deststorepass passwd
-srcalias myprivatekey -destalias myoldprivatekey
-srckeypass passwd
-destkeypass passwd
-noprompt
SSLサーバー用の証明書の生成
次に、次の3つのエンティティのキー・ペアと証明書を生成するために使用するkeytool
コマンドを示します。
-
ルートCA (
root
) -
中間CA (
ca
) -
SSLサーバー(
server
)
すべての証明書が同じキーストアに格納されていることを確認してください。次の例では、キー・アルゴリズムとしてRSAをお薦めします。
keytool -genkeypair -keystore root.jks -alias root -ext bc:c
keytool -genkeypair -keystore ca.jks -alias ca -ext bc:c
keytool -genkeypair -keystore server.jks -alias server
keytool -keystore root.jks -alias root -exportcert -rfc > root.pem
keytool -storepass passwd -keystore ca.jks -certreq -alias ca |
keytool -storepass passwd -keystore root.jks
-gencert -alias root -ext BC=0 -rfc > ca.pem
keytool -keystore ca.jks -importcert -alias ca -file ca.pem
keytool -storepass passwd -keystore server.jks -certreq -alias server |
keytool -storepass passwd -keystore ca.jks -gencert -alias ca
-ext ku:c=dig,kE -rfc > server.pem
cat root.pem ca.pem server.pem |
keytool -keystore server.jks -importcert -alias server
用語
- キーストア
-
キーストアは、暗号化のキーと証明書を格納するための機能です。
- キーストアのエントリ
-
キーストアには様々なタイプのエントリを含めることができます。
keytool
コマンドでもっとも適用範囲の広いエントリ・タイプは、次の2つです。キーのエントリ - 各エントリは、非常に重要な暗号化のキーの情報を保持します。この情報は、未許可のアクセスを防ぐために、保護された形で格納されます。一般に、このタイプのエントリに格納されるキーは、秘密キーか、または対応する公開キーの証明書チェーンを伴う秘密キーです。「証明書チェーン」を参照してください。
keytool
コマンドがこの両方のタイプのエントリを処理できるのに対し、jarsigner
ツールは後者のタイプのエントリ、つまり秘密キーとそれに関連付けられた証明書チェーンのみを処理します。信頼できる証明書のエントリ - 各エントリは、別のパーティに属する公開キー証明書を1つ含んでいます。このエントリは信頼できる証明書と呼ばれます。これは、キーストアの所有者が、証明書内の公開キーが証明書のサブジェクト(所有者)によって識別されたアイデンティティに属することを信頼しているためです。証明書の発行者は、証明書に署名を付けることによって、その内容を保証します。
- キーストアの別名
-
キーストアのすべてのエントリ(キーおよび信頼できる証明書のエントリ)は、一意の別名を介してアクセスされます。
別名を指定するのは、
-genseckey
コマンドを使って秘密キーを生成したり、-genkeypair
コマンドを使ってキー・ペア(公開キーと秘密キー)を生成したり、-importcert
コマンドを使って証明書または証明書チェーンを信頼できる証明書のリストに追加したりするなど、特定のエンティティをキーストアに追加する場合です。これ以後、keytool
コマンドでエンティティを参照する場合は、このときに指定した別名を使用する必要があります。たとえば、
duke
という別名を使って新しい公開キーと秘密キーのペアを生成し、公開キーを自己署名証明書でラップするには、次のコマンドを実行します。「証明書チェーン」を参照してください。keytool -genkeypair -alias duke -keypass passwd
この例では、最初の
passwd
を指定しています。このパスワードは、後続のコマンドで別名duke
に関連付けられた秘密キーにアクセスする際に必要になります。Dukeの秘密キーのパスワードを後で変更する場合は、次のようなコマンドを実行します。keytool -keypasswd -alias duke -keypass passwd -new newpasswd
これは、最初の
passwd
をnewpasswd
に変更しています。テストを目的とする場合、またはセキュアなシステムを使用している場合以外は、コマンド行やスクリプトでパスワードを指定しないでください。必要なパスワードのオプションをコマンド行で指定しなかった場合は、その入力を求められます。 - キーストアの実装
-
java.security
パッケージで提供されるKeyStore
クラスには、キーストア内の情報に対するアクセスと変更を行うための明確に定義されたインタフェースが用意されています。複数の異なる固定実装を生成できます(それぞれ特定の型のキーストアを実装)。現在、
keytool
とjarsigner
の2つのコマンド行ツールでキーストアの実装を使用しています。KeyStore
クラスはpublic
であるため、ユーザーはこのクラスを使用する追加のセキュリティ・アプリケーションを作成できます。JDK 9以降、デフォルトのキーストアの実装は、
PKCS12
です。これは、RSA PKCS12 Personal Information Exchange Syntax Standardに基づくクロス・プラットフォーム・キーストアです。この規格は、ユーザーの秘密キー、証明書、その他の秘密を格納および転送することを主な目的としています。Oracleが提供する別の組込みの実装があります。これは、JKS
という独自のキーストア・タイプ(形式)を使用してキーストアをファイルとして実装します。この実装では、個々の秘密キーは個別のパスワードによって保護され、キーストア全体の整合性も(秘密キーとは別の)パスワードによって保護されます。キーストアの実装は、プロバイダ・ベースです。具体的には、
KeyStore
で提供されるアプリケーション・インタフェースがService Provider Interface (SPI)という形で実装されています。つまり、対応するKeystoreSpi
抽象クラスが(やはりjava.security
パッケージ内に)あり、プロバイダが実装する必要があるService Provider Interfaceメソッドを定義しています。プロバイダとは、Java Security APIによってアクセス可能なサービスのサブセットに対し、その固定実装を提供するパッケージまたはパッケージの集合のことです。キーストアの実装を提供するには、プロバイダを実装して統合するステップに関する項で説明されているように、クライアントがプロバイダを実装し、KeystoreSpi
サブクラスの実装を提供する必要があります。アプリケーションでは、
KeyStore
クラスで提供されるgetInstance
ファクトリ・メソッドを使うことで、様々なプロバイダから異なるタイプのキーストア実装を選択できます。キーストア・タイプは、キーストア情報の格納形式とデータ形式を定義するとともに、キーストア内の非公開/秘密キーとキーストアの整合性を保護するために使われるアルゴリズムを定義します。異なるタイプのキーストアの実装には、互換性はありません。keytool
コマンドは、任意のファイルベース・キーストア実装で動作します。コマンド行で渡されたキーストアの場所をファイル名として扱い、それをFileInputStream
に変換して、そこからキーストア情報をロードします。jarsigner
コマンドは、URLで指定できる任意の場所からキーストアを読み取ることができます。keytool
とjarsigner
の場合は、-storetype
オプションを使ってコマンド行でキーストア・タイプを指定できます。キーストアのタイプを明示的に指定しなかった場合、ツールはセキュリティ・プロパティ・ファイル内で指定された
keystore.type
プロパティの値に基づいてキーストア実装を選択します。セキュリティ・プロパティ・ファイルは、java.security
という名前で、セキュリティ・プロパティ・ディレクトリにあります。-
Oracle Solaris、LinuxおよびmacOS:
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
ノート:
キーストア・タイプの指定では、大文字と小文字は区別されません。たとえば、
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=cName, OU=orgUnit, O=org, C=countryCode
これらはそれぞれサブジェクトの共通名(CN)、組織単位(OU)、組織(O)および国(C)を表します。
-
サブジェクトの公開キー情報: 名前を付けられたエンティティの公開キーとアルゴリズム識別子です。アルゴリズム識別子は、このキーが属する公開キー暗号化システムと、関連するキー・パラメータを指定します。
-
- 証明書チェーン
-
keytool
コマンドでは、秘密キーおよび関連する証明書チェーンを含むキーストアのキー・エントリを作成して管理できます。このようなエントリでは、秘密キーに対応する公開キーは、チェーンの最初の証明書に含まれています。キーを初めて生成すると、自己署名証明書という1つの要素のみを含むチェーンが開始されます。「コマンド」の-genkeypairを参照してください。自己署名証明書は、発行者(署名者)がサブジェクトと同じである証明書のことです。このサブジェクトは、証明書によって公開キーが認証されるエンティティです。
-genkeypair
コマンドを呼び出して新しい公開キーと秘密キーのペアを作成すると、公開キーは常に自己署名証明書でラップされます。その後、
-certreq
コマンドを使って証明書署名要求(CSR)が生成され、証明書発行局(CA)に送信されると、CAからの応答が-importcert
を使ってインポートされ、この自己署名証明書が証明書のチェーンによって置き換えられます。チェーンの最後にあるのは、Subjectの公開キーを認証したCAが発行した証明書(応答)です。チェーン内のその次の証明書は、CAの公開キーを認証する証明書です。多くの場合、これは自己署名証明書(CAが自身の公開キーを認証した証明書)であり、チェーンの最後の証明書です。場合によっては、CAが証明書のチェーンを返すこともあります。この場合、チェーン内の最後の証明書(CAによって署名され、キー・エントリの公開キーを認証する証明書)に変わりはありませんが、チェーン内の2番目の証明書は、別のCAによって署名され、CSRの送信先のCAの公開キーを認証する証明書になります。チェーン内の次の証明書は、2番目のCAのキーを認証する証明書になります。以下同様に、自己署名されたルート証明書に達するまでチェーンが続きます。したがって、チェーン内の(最初の証明書以後の)各証明書では、チェーン内の前の証明書の署名者の公開キーが認証されていることになります。
多くのCAは、チェーンをサポートせずに発行済の証明書のみを返します。特に、中間のCAが存在しないフラットな階層構造の場合は、その傾向が顕著です。このような場合は、キーストアにすでに格納されている信頼できる証明書情報から、証明書チェーンを確立する必要があります。
別の応答形式(PKCS #7標準で定義されている形式)には、発行済の証明書に加え、証明書チェーンのサポートが含まれています。
keytool
コマンドでは、どちらの応答形式も扱うことができます。トップ・レベル(ルート) CAの証明書は、自己署名証明書です。ただし、ルートの公開キーに対する信頼は、ルートの証明書自体から導き出されるものではなく、新聞などの他の情報源に由来するものです。これは、だれでもDigiCertルートCAのような識別名を使用して自己署名証明書を生成できるためです。ルートCAの公開キーは広く知られています。ルートCAの公開キーを証明書に格納する理由は、証明書という形式にすることで多くのツールから利用できるようになるからにすぎません。つまり、この場合の証明書は、ルートCAの公開キーを運ぶ媒体として利用されるだけです。ルートCAの証明書をキーストアに追加するときは、その前に
-printcert
オプションを使って証明書の内容を表示し、表示されたフィンガプリントを新聞やルートCAのWebページなどから入手した既知のフィンガプリントと比較する必要があります。 - cacerts証明書ファイル
-
cacerts
という証明書ファイルは、セキュリティ・プロパティ・ディレクトリにあります。-
Oracle Solaris、LinuxおよびmacOS:
JAVA_HOME/lib/security
-
Windows:
java.home\lib\security
java.home
は、ランタイム環境ディレクトリであり、これはJDKのjre
ディレクトリまたはJava Runtime Environment (JRE)の最上位ディレクトリです。cacerts
ファイルは、CAの証明書を含むシステム全体のキーストアを表します。システム管理者は、キーストア・タイプにjks
を指定することで、keytool
コマンドを使ってこのファイルの構成と管理を行うことができます。cacerts
キーストア・ファイルは、一連のデフォルトのルートCA証明書を含んだ状態で出荷されています。Oracle Solaris、Linux、OS XおよびWindowsでは、次のコマンドを使用してデフォルトの証明書をリストできます。keytool -list -cacerts
システム管理者は、SDKのインストール後、
cacerts
キーストア・ファイルの初期パスワードとデフォルト・アクセス権を変更する必要があります。ノート:
cacerts
ファイルを検証することは重要です。cacerts
ファイル内のCAは、証明書の署名や他のエンティティへの発行を行うエンティティとして信頼されるため、cacerts
ファイルの管理は慎重に行う必要があります。cacerts
ファイルには、信頼するCAの証明書のみが含まれている必要があります。ユーザーは、自身の責任で、cacerts
ファイルにバンドルされている信頼できるルートCA証明書を検証し、信頼性に関する独自の決定を行います。信頼できないCA証明書を
cacerts
ファイルから削除するには、keytool
コマンドの-delete
オプションを使用します。cacerts
ファイルはJREのインストール・ディレクトリにあります。このファイルを編集するアクセス権がない場合は、システム管理者に連絡してください。 -
- インターネットRFC 1421証明書エンコード規格
-
多くの場合、証明書は、バイナリ符号化ではなく、インターネットRFC 1421規格で定義されている出力可能符号化方式を使って格納されます。Base64エンコードとも呼ばれるこの証明書形式では、電子メールやその他のメカニズムを通じて、他のアプリケーションに証明書を容易にエクスポートできます。
-importcert
コマンドと-printcert
コマンドでは、この形式の証明書とバイナリ符号化の証明書を読み込むことができます。-exportcert
コマンドでは、デフォルトでバイナリ・エンコードの証明書が出力されます。ただし、-rfc
オプションを指定した場合は、出力可能エンコード形式の証明書が出力されます。デフォルトでは、
-list
コマンドは証明書のSHA-256フィンガプリントを出力します。-v
オプションを指定すると、人間が読むことのできる形式で証明書が出力されます。-rfc
オプションを指定すると、出力可能エンコード形式で証明書が出力されます。出力可能エンコード形式でエンコードされた証明書の先頭と末尾は、次のテキストで指定されます。
-----BEGIN CERTIFICATE----- encoded certificate goes here. -----END CERTIFICATE-----
- X.500識別名
-
X.500識別名は、エンティティを特定するために使われます。たとえば、X.509証明書の
subject
フィールドとissuer
(署名者)フィールドで指定される名前は、X.500識別名です。keytool
コマンドは、次のサブパートをサポートしています。-
commonName: 人の共通名。
-
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=commonName, OU=organizationUnit, O=organizationName, L=localityName, S=stateName, C=country
このような文字列を使ったコマンドの例を次に示します。
keytool -genkeypair -dname "CN=commonName, OU=organizationUnit, O=organizationName, L=localityName, S=stateName, C=country" -alias mark
キーワードの短縮形では、大文字と小文字は区別されません。たとえば、CN、cnおよびCnはどれも同じものとして扱われます。
一方、キーワードの指定順序には意味があり、各サブコンポーネントは上に示した順序で指定する必要があります。ただし、サブコンポーネントをすべて指定する必要はありません。たとえば、次のように一部のみを指定できます。
CN=commonName, OU=organizationUnit, O=organizationName, C=country
識別名文字列の値にカンマが含まれる場合に、コマンド行で文字列を指定するときには、次のようにカンマをバックスラッシュ(\)文字でエスケープする必要があります。
cn=commonName, ou=organizationUnit\, department, o=organizationName, c=country
識別名文字列をコマンド行で指定する必要はありません。識別名を必要とするコマンドを実行するときに、コマンド行で識別名を指定しなかった場合は、ユーザーが各サブコンポーネントについて入力を求められます。この場合は、カンマをバックスラッシュ(\)でエスケープする必要はありません。
-
警告
信頼できる証明書のインポートに関する警告
重要: 信頼できる証明書としてインポートする前に、証明書の内容を慎重に調べてください。
Windowsの例:
まず、-printcert
コマンドを使用するか、または-noprompt
オプションを指定せずに-importcert
コマンドを使用して、証明書を表示します。表示された証明書のフィンガプリントが期待されるフィンガプリントと一致するかどうかを確認します。たとえば、あるユーザーから電子メールなどで証明書が送られてきて、それを\tmp\cert
という名前のファイルに格納したとします。その場合、信頼できる証明書のリストにこの証明書を追加する前に、次のように-printcert
コマンドを実行してフィンガプリントを表示できます。
keytool -printcert -file \tmp\cert
Owner: CN=ll, OU=ll, O=ll, L=ll, S=ll, C=ll
Issuer: CN=ll, OU=ll, O=ll, L=ll, S=ll, C=ll
Serial Number: 59092b34
Valid from: Thu Jun 24 18:01:13 PDT 2016 until: Wed Jun 23 17:01:13 PST 2016
Certificate Fingerprints:
SHA-1: 20:B6:17:FA:EF:E5:55:8A:D0:71:1F:E8:D6:9D:C0:37:13:0E:5E:FE
SHA-256: 90:7B:70:0A:EA:DC:16:79:92:99:41:FF:8A:FE:EB:90:
17:75:E0:90:B2:24:4D:3A:2A:16:A6:E4:11:0F:67:A4
Oracle Solarisの例:
まず、-printcert
コマンドを使用するか、または-noprompt
オプションを指定せずに-importcert
コマンドを使用して、証明書を表示します。表示された証明書のフィンガプリントが期待されるフィンガプリントと一致するかどうかを確認します。たとえば、あるユーザーから電子メールなどで証明書が送られてきて、それを/tmp/cert
という名前のファイルに格納したとします。その場合、信頼できる証明書のリストにこの証明書を追加する前に、次のように-printcert
コマンドを実行してフィンガプリントを表示できます。
keytool -printcert -file /tmp/cert
Owner: CN=ll, OU=ll, O=ll, L=ll, S=ll, C=ll
Issuer: CN=ll, OU=ll, O=ll, L=ll, S=ll, C=ll
Serial Number: 59092b34
Valid from: Thu Jun 24 18:01:13 PDT 2016 until: Wed Jun 23 17:01:13 PST 2016
Certificate Fingerprints:
SHA-1: 20:B6:17:FA:EF:E5:55:8A:D0:71:1F:E8:D6:9D:C0:37:13:0E:5E:FE
SHA-256: 90:7B:70:0A:EA:DC:16:79:92:99:41:FF:8A:FE:EB:90:
17:75:E0:90:B2:24:4D:3A:2A:16:A6:E4:11:0F:67:A4
次に、証明書を送信した人物に連絡し、この人物が提示したフィンガプリントと、上のコマンドで表示されたフィンガプリントとを比較します。フィンガプリントが一致した場合にのみ、送信途中で他の何者かの証明書(攻撃者の証明書など)ですり替えられていないことを保証できます。このような攻撃が行われていた場合、チェックを行わずに証明書をインポートすると、攻撃者によって署名されたすべてのもの(攻撃的意図を持つクラス・ファイルを含んだJARファイルなど)を信頼することになります。
ノート:
証明書をインポートする前に-printcert
コマンドを実行することは必須ではありません。キーストア内の信頼できる証明書のリストに証明書を追加する前に-importcert
コマンドを実行すると、証明書の情報が出力され、確認を求めるメッセージが表示されます。インポート操作は、この時点で中止できます。ただし、これが可能なのは、-noprompt
オプションを指定せずに-importcert
コマンドを呼び出した場合のみです。-noprompt
オプションを指定した場合、ユーザーとの対話は行われません。
パスワードに関する警告
キーストアに対する操作を行うほとんどのコマンドでは、ストアのパスワードが必要です。また、一部のコマンドでは、非公開/秘密キーのパスワードが必要になることがあります。パスワードは、コマンド行の-storepass
および-keypass
オプションで指定できます。ただし、テストを目的とする場合、またはセキュアなシステムを使用している場合以外は、コマンド行やスクリプトでパスワードを指定しないでください。必要なパスワードのオプションをコマンド行で指定しなかった場合は、その入力を求められます。
証明書の適合性に関する警告
インターネットX.509公開キー・インフラストラクチャ証明書および証明書失効リスト(CRL)プロファイルでは、適合するX.509証明書に関するプロファイルを定義しており、これには、証明書のフィールドや拡張機能で有効な値や値の組合せが含まれています。
keytool
コマンドでは、これらの規則がすべて適用されているわけではないので、内部テスト目的で使用する自己署名証明書など、標準に準拠しない証明書が生成される可能性があります。標準に準拠しない証明書は、JREやその他のアプリケーションで拒否されることがあります。ユーザーは、-dname
や-ext
などに必ず正しいオプションを指定するようにしてください。
新しい信頼できる証明書のインポート
キーストアに証明書を追加する前に、keytool
コマンドはその証明書を検証するため、キーストア内にすでに存在する信頼できる証明書を使って、追加する証明書から(ルートCAに属する)自己署名証明書までの信頼チェーンの構築を試みます。
-trustcacerts
オプションを指定した場合、追加する証明書は信頼チェーン(つまり、cacerts
という名前のファイルに含まれる証明書)と見なされます。
keytool
コマンドが、インポートする証明書から自己署名証明書(キーストアまたはcacerts
ファイルに含まれている自己署名証明書)までの信頼パスの構築に失敗した場合は、インポートする証明書の情報が出力され、ユーザーは確認を求められます。この場合は、表示された証明書のフィンガプリントを、他のなんらかの(信頼できる)情報源(証明書の所有者本人など)から入手したフィンガプリントと比較します。信頼できる証明書として証明書をインポートするときは、証明書が有効であることを慎重に確認する必要があります。ユーザーは、この時点でインポート操作を中止できます。-noprompt
オプションを指定した場合、ユーザーとの対話は行われません。
証明書応答のインポート
証明書応答をインポートするときに、キーストア内の信頼できる証明書、および(-trustcacerts
オプションが指定されている場合は) cacerts
キーストア・ファイルに構成された証明書を使用して、証明書応答が検証されます。
証明書応答が信頼できるかどうかを判定する方法は次のとおりです。
-
証明書応答が単一のX.509証明書である場合、
keytool
コマンドは証明書応答から(ルートCAに属する)自己署名証明書までの信頼チェーンの確立を試みます。証明書応答と証明書の階層構造は、別名の新しい証明書チェーンからの証明書応答を認証するために使われます。信頼チェーンが確立されない場合、証明書応答はインポートされません。この場合、keytool
コマンドは証明書を出力せず、ユーザーに確認を求めます。これは、証明書応答が本物かどうかをユーザーが判定するのは非常に難しいためです。 -
証明書応答がPKCS #7形式の証明書チェーンまたはX.509証明書のシーケンスである場合は、ユーザー証明書が最初で、次に0個以上のCA証明書が続くようにチェーンが並べ替えられます。チェーンが自己署名のルートCA証明書で終わり、
-trustcacerts
オプションが指定されている場合、keytool
コマンドは、その証明書と、キーストア内またはcacerts
キーストア・ファイル内の信頼できるすべての証明書を照合しようとします。チェーンの最後がルートCAの自己署名証明書ではなく、-trustcacerts
オプションが指定された場合、keytool
コマンドは、キーストア内またはcacerts
キーストア・ファイル内の信頼できる証明書からルートCAの自己署名証明書を見つけ、チェーンの最後に追加しようとします。証明書が見つからず、-noprompt
オプションが指定されてない場合は、チェーンの最後の証明書に関する情報が出力され、ユーザーはそれを確認するように求められます。
証明書応答内の公開キーがalias
にすでに格納されているユーザーの公開キーと一致した場合、古い証明書チェーンが応答内の新しい証明書チェーンで置き換えられます。古いチェーンを置き換えることができるのは、有効なkeypass
、つまり該当するエントリの秘密キーを保護するためのパスワードを指定した場合のみです。パスワードを指定しておらず、秘密キーのパスワードがキーストアのパスワードと異なる場合は、秘密キーのパスワードの入力を求められます。
このコマンドは、以前のリリースでは-import
という名前でした。この古い名前は、このリリースでも引き続きサポートされています。新しい名前である-importcert
を使用することをお薦めします。
事前構成済のオプション・ファイルの使用例
事前構成済のオプション・ファイルとして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 me -keyalg ec