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