暗号化鍵、X.509 証明書チェーン、および信頼できる証明書を含むキーストア (データベース) を管理します。
keytool [ commands ]
Java SE 6 で keytool のコマンドインタフェースが変更されました。詳細は、「変更点」のセクションを参照してください。以前に定義されたコマンドも引き続きサポートされています。
証明書とは、あるエンティティー (人物、会社など) からのデジタル署名付きの文書のことです。証明書には、ほかのあるエンティティーの公開鍵 (およびその他の情報) が特別な値を持っていることが書かれています。(「証明書」を参照)。データにデジタル署名が付いている場合は、デジタル署名を検証することで、データの整合性およびデータが本物であることをチェックできます。データの整合性とは、データが変更されたり、改変されたりしていないことを意味します。また、データが本物であるとは、そのデータが、データを作成して署名したと称する人物から実際に渡されたデータであることを意味します。
また、keytool を使えば、DES などの対称暗号化/復号化で使用される秘密鍵を管理することもできます。
keytool は、鍵と証明書をキーストアに格納します。
以下では、コマンドとそのオプションについて説明します。注:
-v
、-rfc
、および -J
オプションを囲むのにも使われるが、これらのオプションはコマンド行で指定された場合にのみ意味を持つ (つまり、これらのオプションには、オプション自体を指定しないこと以外に「デフォルト値」は存在しない)-keypass
オプションをコマンド行で指定しなかった場合は、keytool がキーストアのパスワードから非公開/秘密鍵の復元を試みる。ユーザーは、この試みが失敗した場合に非公開/秘密鍵の入力を求められる)-printcert
コマンドの形式は次のとおりである
keytool -printcert {-file cert_file} {-v}
-printcert
コマンドを指定するときは、cert_file の代わりに実際のファイル名を指定する。次に例を示す
keytool -printcert -file VScert.cer
-help
コマンドはデフォルトのコマンドである。たとえば、次のようにコマンド行を指定したとする
keytool
これは、次のように指定することと同じです。
keytool -help
オプションのデフォルト値は、次のとおりです。
-alias "mykey" -keyalg "DSA" (when using -genkeypair) "DES" (when using -genseckey) -keysize 2048 (when using -genkeypair and -keyalg is "RSA") 1024 (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 -storetype the value of the "keystore.type" property in the security properties file, which is returned by the staticgetDefaultType
method injava.security.KeyStore
-file stdin if reading, stdout if writing -protected false
公開/非公開鍵ペアの生成では、署名アルゴリズム (-sigalg オプション) は基になる非公開鍵のアルゴリズムから派生します。
選択可能な -keyalg および -sigalg の完全な一覧については、「Java 暗号化アーキテクチャー API 仕様 & リファレンス」を参照してください。
-v
オプションは、-help
コマンドを除くすべてのコマンドで使用できます。このオプションを指定した場合、コマンドは「冗長」モードで実行され、詳細な証明書情報が出力されます。
また、-Jjavaoption
オプションも、任意のコマンドで使用できます。このオプションを指定した場合、指定された javaoption 文字列が Java インタプリタに直接渡されます。このオプションには、空白を含めることはできません。このオプションは、実行環境またはメモリー使用を調整する場合に便利です。指定できるインタプリタオプションを一覧表示するには、コマンド行で java -h
または java -X
と入力してください。
次のオプションは、キーストアに対する操作を行うすべてのコマンドで指定できます。
-storetype storetype
この修飾子は、インスタンスを生成するキーストアのタイプを指定します。
-keystore keystore
キーストアの場所を指定します。
特定の keytool コマンドを実行する際に、JKS ストアタイプが使用され、かつキーストアファイルがまだ存在していなかった場合、新しいキーストアファイルが作成されます。たとえば、keytool -genkeypair
の実行時に -keystore
オプションが指定されなかった場合、.keystore
という名前のデフォルトキーストアファイルがユーザーのホームディレクトリ内にまだ存在していなければ、そこに作成されます。同様に、-keystore ks_file
というオプションが指定されてもその ks_file が存在しなかった場合、そのファイルが作成されます。
-keystore
オプションからの入力ストリームは、KeyStore.load
メソッドに渡されます。URL として NONE
が指定されている場合は、null のストリームが KeyStore.load
メソッドに渡されます。NONE
は、KeyStore
がファイルベースではなく、たとえば、ハードウェアトークンデバイスに置かれている場合に指定します。
-storepass
[:env
|:file
] argumentキーストアの整合性を保護するために使うパスワードを指定します。
修飾子 env
または file
が指定されていない場合、パスワードの値は argument です。argument は、6 文字以上でなければなりません。それ以外の場合、パスワードは次のように取得されます。
env
: argument という名前の環境変数からパスワードを取得しますfile
: argument という名前のファイルからパスワードを取得します注:-keypass
、-srckeypass
、-destkeypass
、-srcstorepass
、-deststorepass
など、パスワードが必要なほかのすべてのオプションは修飾子 env
および file
を受け入れます。(パスワードオプションと修飾子は必ずコロン (:
) で区切ってください。)
このパスワードは、キーストアの内容にアクセスするすべてのコマンドで使われます。この種のコマンドを実行するときに、コマンド行で -storepass
オプションを指定しなかった場合は、パスワードの入力を求められます。
キーストアから情報を取り出す場合は、パスワードを省略できます。パスワードを省略すると、取り出す情報の整合性をチェックできないので、警告が表示されます。
-providerName provider_name
セキュリティープロパティーファイル内に含まれる暗号化サービスプロバイダ名を特定するために使用されます。
-providerClass provider_class_name
暗号化サービスプロバイダがセキュリティープロパティーファイルに指定されていないときは、そのマスタークラスファイルの名前を指定するときに使われます。
-providerArg provider_arg
-providerClass
と一緒に使う。provider_class_name のコンストラクタに対する省略可能な文字列入力引数を表します。
-protected
true
または false
。専用 PIN リーダーなどの保護された認証パスを介してパスワードを指定する必要がある場合には、この値に true
を指定してください。
注:-importkeystore
コマンドには 2 つのキーストアが関係しているため、ソースキーストアとターゲットキーストアを示す 2 つのオプション (つまり、-srcprotected
と -destprotected
) を指定します。
-ext {name{:critical}{=value}}
X.509 証明書の拡張機能を示します。このオプションは、-genkeypair および -gencert で、生成された証明書に拡張機能を組み込むため、または -certreq
で、証明書要求で要求された拡張機能を表示するために使用できます。このオプションは、複数回使用できます。name には、サポートされているエクステンション名 (下記を参照) または任意の OID 番号を指定できます。value を指定した場合は、エクステンションのパラメータを示します。省略した場合は、エクステンションのデフォルト値 (定義されている場合) を示すか、またはエクステンションにパラメータは必要ありません。修飾子 :critical
を指定した場合は、拡張機能の isCritical 属性が true であることを意味し、それ以外の場合は false を意味します。:critical
の代わりに :c
を使用できます。
現在、keytool はこれらの名前付き拡張機能をサポートしています (大文字と小文字を区別しない)。
名前 | 値 |
---|---|
BC または BasicConstraints | 完全な形式:「ca:{true|false}[,pathlen:<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) で指定したりできる。大文字と小文字を区別して使用してください。 |
EKU または ExtendedkeyUsage | usage(,usage)*、usage は anyExtendedKeyUsage、 serverAuth、clientAuth、codeSigning、emailProtection、 timeStamping、OCSPSigning、任意の OID 文字列のいずれか。 指定する usage は、あいまいさがないかぎり、 最初の数文字に短縮したり、 キャメル記法で指定したりできる。大文字と小文字を区別して使用してください。 |
SAN または SubjectAlternativeName | type:value(,type:value)*、type は EMAIL、URI、DNS、IP、または OID。value はタイプを表す文字列形式の値。 |
IAN または IssuerAlternativeName | 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 | SubjectInfoAccess と同じです。method には、「ocsp」、「caIssuers」、または任意の OID を指定できます。 |
name を OID で指定した場合、value は OCTET STRING の type および length バイトを除く拡張機能の extnValue の 16 進数でダンプされた DER エンコーディングです。16 進文字列では、標準の 16 進数 (0-9、a-f、A-F) 以外の余分な文字は無視されます。したがって、"01:02:03:04"
と "01020304"
はどちらも同じ値として受け入れられます。値がない場合は、拡張機能に空の値のフィールドが含まれます。
特別な名前である 'honored'
は、-gencert
でのみ使用され、証明書要求に含まれる拡張機能をどのように受け付けるかを示します。この名前の value は、"all"
(要求されたすべての拡張機能を受け付ける)、"name{:[critical|non-critical]}"
(指定された拡張機能を受け付けるが、異なる isCritical 属性を使用する)、および "-name"
(all とともに使用し、例外を示す) のカンマ区切りリストです。要求された拡張機能は、デフォルトでは受け付けられません。
honored による -ext オプションとは別に、名前または OID による -ext オプションを指定すると、すでに受け付けられた拡張機能にその拡張機能が追加されます。ただし、この名前 (または OID) が受け付けられた値に含まれる場合は、その値とクリティカルの程度が要求内の設定をオーバーライドします。
subjectKeyIdentifier 拡張機能は常に作成されます。自己署名でない証明書の場合は、authorityKeyIdentifier が常に作成されます。
注:ユーザーは、拡張機能 (および証明書のほかのフィールド) の組み合わせによってはインターネット標準に準拠しない場合があることに注意してください。詳細は、「証明書の適合性に関する注意事項」を参照してください。
-gencert {-rfc} {-infile infile} {-outfile outfile} {-alias alias} {-sigalg sigalg} {-dname dname} {-startdate startdate {-ext ext}* {-validity valDays} [-keypass keypass] {-keystore keystore} [-storepass storepass] {-storetype storetype} {-providername provider_name} {-providerClass provider_class_name {-providerArg provider_arg}} {-v} {-protected} {-Jjavaoption}
証明書要求ファイル (keytool -certreq
コマンドで作成可能) に対する応答として、証明書を生成します。このコマンドは、infile (省略された場合は標準入力) から要求を読み取り、別名の非公開鍵を使って要求に署名し、X.509 証明書を outfile (省略された場合は標準出力) に出力します。-rfc
が指定された場合の出力形式は、Base64 でエンコードされた PEM です。それ以外の場合は、バイナリ DER が作成されます。
sigalg には、証明書に署名を付けるときに使用するアルゴリズムを指定します。 startdate は、証明書が有効になる開始時刻/日付です。 valDays には、証明書の有効日数を指定します。
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 signs ca2
、これらのすべてが自己発行されます。
keytool -alias ca1 -certreq | keytool -alias ca -gencert -ext san=dns:ca1 | keytool -alias ca1 -importcert keytool -alias ca2 -certreq | $KT -alias ca1 -gencert -ext san=dns:ca2 | $KT -alias ca2 -importcert
次のコマンドでは、証明書 e1
を作成し、それを ca2
によって署名された e1.cert
ファイルに格納します。この結果、e1
の証明書チェーンには ca
、ca1
、および ca2
が含まれることになります。
keytool -alias e1 -certreq | keytool -alias ca2 -gencert > e1.cert
-genkeypair {-alias alias} {-keyalg keyalg} {-keysize keysize} {-sigalg sigalg} [-dname dname] [-keypass keypass] {-startdate value} {-ext ext}* {-validity valDays} {-storetype storetype} {-keystore keystore} [-storepass storepass] {-providerClass provider_class_name {-providerArg provider_arg}} {-v} {-protected} {-Jjavaoption}
鍵のペア (公開鍵および関連する非公開鍵) を生成します。公開鍵は X.509 v3 自己署名証明書でラップされます。証明書は、単一の要素を持つ証明書チェーンとして格納されます。この証明書チェーンと非公開鍵は、alias で特定される新しいキーストアエントリに格納されます。
keyalg には、鍵のペアを生成するのに使うアルゴリズムを指定し、keysize には、生成する各鍵のサイズを指定します。sigalg には、自己署名証明書に署名を付けるときに使うアルゴリズムを指定します。このアルゴリズムは、keyalg と互換性のあるものでなければなりません。
dname には、alias に関連付け、自己署名証明書の issuer
フィールドと subject
フィールドとして使う X.500 識別名を指定します。コマンド行で識別名を指定しなかった場合は、識別名の入力を求められます。
keypass には、生成される鍵のペアのうち、非公開鍵を保護するのに使うパスワードを指定します。パスワードを指定しなかった場合、ユーザーはその入力を求められます。プロンプトで Return キーを押すと、キーストアに使用されるものと同じパスワードが鍵のパスワードに設定されます。keypass は、6 文字以上でなければいけません。
startdate には、証明書の発行時間を指定します。これは、X.509 証明書の Validity フィールドの「Not Before」値としても知られています。
このオプションの値は、次のいずれかの形式で設定できます。
最初の形式では、現在の時間から指定された値だけシフトした時間が発行時間になります。この値は、サブ値のシーケンスを連結したものです。各サブ値の内部では、プラス記号 (+) が未来へのシフトを意味し、マイナス記号 (-) が過去へのシフトを意味します。シフトする時間は、年、月、日、時、分、または秒 (それぞれ「y」、「m」、「d」、「H」、「M」、または「S」の 1 文字で示される) を単位とする nnn です。発行時間の正確な値は、左端のサブ値から順に java.util.GregorianCalendar.add(int field, int amount)
メソッドを使用して計算されます。たとえば、"-startdate -1y+1m-1d"
を指定すると、発行時間は次のようになります。
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 回しか指定できません。
valDays には、証明書が有効と見なされる日数 (開始日は -startdate
で指定された日付か、-startdate
が指定されていない場合は現在の日付) を指定します。
このコマンドは、以前のリリースでは -genkey という名前でした。この古い名前は、このリリースでも引き続きサポートされており、今後のリリースでもサポートされる予定です。ただし、今後はわかりやすいように、新しい名前 -genkeypair を使用することをお勧めします。
-genseckey {-alias alias} {-keyalg keyalg} {-keysize keysize} [-keypass keypass] {-storetype storetype} {-keystore keystore} [-storepass storepass] {-providerClass provider_class_name {-providerArg provider_arg}} {-v} {-protected} {-Jjavaoption}
秘密鍵を生成し、それを alias で特定される新しい KeyStore.SecretKeyEntry
内に格納します。
keyalg には秘密鍵の生成に使用するアルゴリズムを、keysize には生成する鍵のサイズを、それぞれ指定します。keypass は秘密鍵の保護に使用するパスワードです。パスワードを指定しなかった場合、ユーザーはその入力を求められます。プロンプトで Return キーを押すと、キーストアに使用されるものと同じパスワードが鍵のパスワードに設定されます。keypass は、6 文字以上でなければいけません。
-importcert {-alias alias} {-file cert_file} [-keypass keypass] {-noprompt} {-trustcacerts} {-storetype storetype} {-keystore keystore} [-storepass storepass] {-providerName provider_name} {-providerClass provider_class_name {-providerArg provider_arg}} {-v} {-protected} {-Jjavaoption}
ファイル cert_file から証明書または証明書チェーン (証明書チェーンの場合は、PKCS#7 形式の応答または X.509 証明書のシーケンスで提供されるもの) を読み取り、alias によって特定されるキーストアエントリに格納します。ファイルが指定されていない場合は、標準入力から証明書または証明書チェーンを読み取ります。
keytool では、X.509 v1、v2、v3 の証明書、および、PKCS#7 形式の証明書から構成されている PKCS#7 形式の証明書チェーンをインポートできます。インポートするデータは、バイナリ符号化方式、または出力可能符号化方式 (Base64 符号化とも呼ばれる) のどちらかで提供する必要があります。出力可能符号化方式は、インターネット RFC 1421 規格で定義されています。この符号化方式の場合、証明書は「-----BEGIN」で始まる文字列で開始され、「-----END」で始まる文字列で終了しなければなりません。
証明書のインポートには、次の 2 つの目的があります。
どちらの種類のインポートを行うかは、-alias
オプションの値によって指定します。
keytool は、キーストアに証明書を追加する前に、キーストア内にすでに存在する信頼できる証明書を使って、インポートする証明書から (ルート CA の) 自己署名証明書に至るまでの信頼のチェーンの構築を試みます。
-trustcacerts
オプションを指定した場合、追加の証明書は信頼のチェーン、つまり「cacerts」という名前のファイルに含まれる証明書と見なされます。
keytool が、インポートする証明書から自己署名証明書 (キーストアまたは cacerts ファイルに含まれている自己署名証明書) に至るまでの信頼のパスの構築に失敗した場合は、インポートする証明書の情報を出力し、ユーザーに確認を求めます。この場合は、表示された証明書のフィンガープリントと、ほかのなんらかの (信頼できる) 情報源 (証明書の所有者本人など) から入手したフィンガープリントとを比較します。「信頼できる証明書」として証明書をインポートするときは、証明書が有効であることを慎重に確認する必要があります。詳細は、「信頼できる証明書のインポートに関する注意事項」を参照してください。インポート操作は、証明書を確認する時点で中止できます。ただし、-noprompt
オプションが指定されている場合、ユーザーとの対話は行われません。
証明書応答をインポートするときは、キーストア内の信頼できる証明書、および (-trustcacerts
オプションが指定されている場合は) cacerts キーストアファイルで構成された証明書を使って証明書応答が検証されます。
証明応答が信頼できるかどうかを決定する方法は次のとおりです。
-trustcacerts
オプションが指定された場合、keytool は、ルート CA の自己署名証明書とキーストア内または「cacerts」キーストアファイル内の信頼できる証明書を比較し、一致するものがあるかどうかを調べます。チェーンの最後がルート CA の自己署名証明書ではなく、-trustcacerts
オプションが指定された場合、keytool は、キーストア内または「cacerts」キーストアファイル内の信頼できる証明書からルート CA の自己署名証明書を見つけ、チェーンの最後に追加しようとします。証明書が見つからず、-noprompt
オプションが指定されてない場合は、チェーンの最後の証明書に関する情報が出力され、ユーザーはそれを確認するように求められます。証明書応答内の公開鍵が alias の下にすでに格納されているユーザーの公開鍵に一致した場合、古い証明書チェーンが応答内の新しい証明書チェーンで置き換えられます。以前の証明書チェーンを新しい証明書チェーンで置き換えることができるのは、有効な keypass、つまり該当するエントリの非公開鍵を保護するためのパスワードを指定した場合だけです。パスワードを指定しておらず、非公開鍵のパスワードがキーストアのパスワードと異なる場合は、非公開鍵のパスワードの入力を求められます。
このコマンドは、以前のリリースでは -import という名前でした。この古い名前は、このリリースでも引き続きサポートされており、今後のリリースでもサポートされる予定です。ただし、今後はわかりやすいように、新しい名前 -importcert を使用することをお勧めします。
-importkeystore -srckeystore srckeystore -destkeystore destkeystore {-srcstoretype srcstoretype} {-deststoretype deststoretype} [-srcstorepass srcstorepass] [-deststorepass deststorepass] {-srcprotected} {-destprotected} {-srcalias srcalias {-destalias destalias} [-srckeypass srckeypass] [-destkeypass destkeypass] } {-noprompt} {-srcProviderName src_provider_name} {-destProviderName dest_provider_name} {-providerClass provider_class_name {-providerArg provider_arg}} {-v} {-protected} {-Jjavaoption}
ソースキーストアからターゲットキーストアへ、単一のエントリまたはすべてのエントリをインポートします。
srcalias オプションが指定された場合、このコマンドは、その別名で特定される単一のエントリをターゲットキーストアにインポートします。destalias 経由でターゲット別名が指定されなかった場合、srcalias がターゲット別名として使用されます。ソースのエントリがパスワードで保護されていた場合、srckeypass を使ってそのエントリが回復されます。srckeypass が指定されなかった場合、keytool は srcstorepass を使ってそのエントリを回復しようとします。srcstorepass が指定されなかったか正しくなかった場合、ユーザーはパスワードの入力を求められます。ターゲットエントリは destkeypass によって保護されます。destkeypass が指定されなかった場合、ターゲットエントリはソースエントリのパスワードによって保護されます。
srcalias オプションが指定されなかった場合、ソースキーストア内のすべてのエントリがターゲットキーストア内にインポートされます。各ターゲットエントリは対応するソースエントリの別名の下に格納されます。ソースのエントリがパスワードで保護されていた場合、srcstorepass を使ってそのエントリが回復されます。srcstorepass が指定されなかったか正しくなかった場合、ユーザーはパスワードの入力を求められます。ソースキーストア内のあるエントリタイプがターゲットキーストアでサポートされていない場合や、あるエントリをターゲットキーストアに格納する際にエラーが発生した場合、ユーザーはそのエントリをスキップして処理を続行するか、あるいは処理を中断するかの選択を求められます。ターゲットエントリはソースエントリのパスワードによって保護されます。
ターゲット別名がターゲットキーストア内にすでに存在していた場合、ユーザーは、そのエントリを上書きするか、あるいは異なる別名の下で新しいエントリを作成するかの選択を求められます。
-noprompt
を指定した場合、ユーザーは新しいターゲット別名の入力を求められません。既存のエントリはそのターゲット別名で自動的に上書きされます。最後に、インポートできないエントリは自動的にスキップされ、警告が出力されます。
-printcertreq {-file file}
keytool -certreq コマンドで生成できる PKCS#10 形式の証明書要求の内容を出力します。このコマンドは、ファイル (省略されている場合は標準入力) から要求を読み取ります。
-certreq {-alias alias} {-dname dname} {-sigalg sigalg} {-file certreq_file} [-keypass keypass] {-storetype storetype} {-keystore keystore} [-storepass storepass] {-providerName provider_name} {-providerClass provider_class_name {-providerArg provider_arg}} {-v} {-protected} {-Jjavaoption}
PKCS#10 形式を使って証明書署名要求 (CSR) を生成します。
CSR は、証明書発行局 (CA) に送信することを目的としたものです。CA は、証明書要求者を (通常はオフラインで) 認証し、証明書または証明書チェーンを送り返します。この証明書または証明書チェーンは、キーストア内の既存の証明書チェーン (最初は 1 つの自己署名証明書から構成される) に置き換えて使います。
alias に関連付けられた非公開鍵は、PKCS#10 証明書要求を作成するのに使われます。非公開鍵はキーストア内ではパスワードによって保護されているので、非公開鍵にアクセスするには、適切なパスワードを提供する必要があります。コマンド行で keypass を指定しておらず、非公開鍵のパスワードがキーストアのパスワードと異なる場合は、非公開鍵のパスワードの入力を求められます。dname が指定された場合は、CSR 内のサブジェクトとして使われます。それ以外の場合は、別名に関連付けられた X.500 識別名が使われます。
sigalg には、CSR に署名を付けるときに使うアルゴリズムを指定します。
CSR は、ファイル certreq_file に格納されます。ファイルが指定されていない場合は、標準出力に CSR が出力されます。
CA からの応答をインポートするには、importcert コマンドを使います。
-exportcert {-alias alias} {-file cert_file} {-storetype storetype} {-keystore keystore} [-storepass storepass] {-providerName provider_name} {-providerClass provider_class_name {-providerArg provider_arg}} {-rfc} {-v} {-protected} {-Jjavaoption}
alias に関連付けられた証明書を (キーストアから) 読み取り、ファイル cert_file に格納します。
ファイルが指定されていない場合は、標準出力に証明書が出力されます。
デフォルトでは、バイナリ符号化方式の証明書が出力されます。ただし、-rfc
オプションを指定した場合は、出力可能符号化方式の証明書が出力されます。出力可能符号化方式は、インターネット RFC 1421 規格で定義されています。
alias が、信頼できる証明書を参照している場合は、該当する証明書が出力されます。それ以外の場合、alias は、関連付けられた証明書チェーンを持つ鍵エントリを参照します。この場合は、チェーン内の最初の証明書が返されます。この証明書は、alias によって表されるエンティティーの公開鍵を認証する証明書です。
このコマンドは、以前のリリースでは -export という名前でした。この古い名前は、このリリースでも引き続きサポートされており、今後のリリースでもサポートされる予定です。ただし、今後はわかりやすいように、新しい名前 -exportcert を使用することをお勧めします。
-list {-alias alias} {-storetype storetype} {-keystore keystore} [-storepass storepass] {-providerName provider_name} {-providerClass provider_class_name {-providerArg provider_arg}} {-v | -rfc} {-protected} {-Jjavaoption}
alias で特定されるキーストアエントリの内容を (標準出力に) 出力します。別名が指定されていない場合は、キーストア全体の内容が表示されます。
このコマンドは、デフォルトでは証明書の SHA1 フィンガープリントを出力します。-v
オプションが指定されている場合は、所有者、発行者、シリアル番号、拡張機能などの付加的な情報とともに、人間が読むことのできる形式で証明書が出力されます。-rfc
オプションが指定されている場合は、出力可能符号化方式で証明書の内容が出力されます。出力可能符号化方式は、インターネット RFC 1421 規格で定義されています。
-v
オプションと -rfc
オプションを同時に指定することはできません。
-printcert {-file cert_file | -sslserver host[:port]} {-jarfile JAR_file {-rfc} {-v} {-Jjavaoption}
ファイル cert_file、host:port にある SSL サーバー、または署名付き JAR ファイル JAR_file (-jarfile
オプションを使用) から証明書を読み取り、人間が読むことのできる形式で証明書の内容を出力します。ポートが指定されなかった場合は、標準の HTTPS ポート 443 が使用されます。-sslserver
オプションと -file
オプションを同時に指定することはできません。従わない場合は、エラーが報告されます。どちらのオプションも指定されていない場合は、標準入力から証明書が読み取られます。
-rfc
が指定されている場合、keytool はインターネット RFC 1421 規格で定義されている PEM モードで証明書を出力します。
証明書がファイルまたは標準入力から読み取られた場合は、バイナリ符号化方式またはインターネット RFC 1421 規格で定義されている出力可能符号化方式で証明書を表示できます。
SSL サーバーがファイアウォールの背後にある場合は、コマンド行に -J-Dhttps.proxyHost=proxyhost
および -J-Dhttps.proxyPort=proxyport
を指定してプロキシトンネリングを使用できます。詳細は、「JSSE リファレンスガイド」を参照してください。
注:このコマンドはキーストアとは関係なく動作します。
-printcrl -file crl_ {-v}
ファイル crl_file から証明書の取り消しリスト (CRL) を読み取ります。
証明書の取り消しリスト (CRL) は、発行元の証明書発行局 (CA) によって取り消されたデジタル証明書のリストです。CA は crl_file を生成します。
注:このコマンドはキーストアとは関係なく動作します。
-storepasswd [-new new_storepass] {-storetype storetype} {-keystore keystore} [-storepass storepass] {-providerName provider_name} {-providerClass provider_class_name {-providerArg provider_arg}} {-v} {-Jjavaoption}
キーストアの内容の整合性を保護するために使うパスワードを変更します。new_storepass には、新しいパスワードを指定します。new_storepass は、6 文字以上でなければなりません。
-keypasswd {-alias alias} [-keypass old_keypass] [-new new_keypass] {-storetype storetype} {-keystore keystore} [-storepass storepass] {-providerName provider_name} {-providerClass provider_class_name {-providerArg provider_arg}} {-v} {-Jjavaoption}
alias によって特定される非公開/秘密鍵を保護するためのパスワードを、old_keypass から new_keypass に変更します。new_keypass は、6 文字以上でなければなりません。
コマンド行で -keypass
オプションを指定しておらず、鍵のパスワードがキーストアのパスワードと異なる場合は、鍵のパスワードの入力を求められます。
コマンド行で -new
オプションを指定しなかった場合は、新しいパスワードの入力を求められます。
-delete [-alias alias] {-storetype storetype} {-keystore keystore} [-storepass storepass] {-providerName provider_name} {-providerClass provider_class_name {-providerArg provider_arg}} {-v} {-protected} {-Jjavaoption}
alias によって特定されるエントリをキーストアから削除します。コマンド行で別名を指定しなかった場合は、別名の入力を求められます。
-changealias {-alias alias} [-destalias destalias] [-keypass keypass] {-storetype storetype} {-keystore keystore} [-storepass storepass] {-providerName provider_name} {-providerClass provider_class_name {-providerArg provider_arg}} {-v} {-protected} {-Jjavaoption}
既存のキーストアエントリを指定された alias から新しい別名 destalias に移動します。ターゲット別名が指定されなかった場合、このコマンドはその入力を求めます。元のエントリがエントリパスワードで保護されていた場合、「-keypass」オプション経由でそのパスワードを指定できます。鍵パスワードが指定されなかった場合、storepass (指定された場合) がまず試みられます。その試みが失敗すると、ユーザーはパスワードの入力を求められます。
-help
基本的なコマンドとそのオプションの一覧を表示します。
特定のコマンドの詳細については、次を入力します。command_name
はコマンドの名前です。
keytool -command_name -help
ここでは、自分の鍵のペアおよび信頼できるエンティティーからの証明書を管理するためのキーストアを作成する場合を例として示します。
まず、キーストアを作成して鍵のペアを生成する必要があります。次に示すのは、実行するコマンドの例です。
keytool -genkeypair -dname "cn=Mark Jones, ou=Java, o=Oracle, c=US" -alias business -keypass <new password for private key> -keystore /working/mykeystore -storepass <new password for keystore> -validity 180
注:このコマンドは 1 行に入力しなければなりません。例で複数行に入力しているのは読みやすくするためです。
この例では、working ディレクトリに mykeystore という名前のキーストアを作成し (キーストアはまだ存在していないと仮定する)、作成したキーストアに <new password for keystore> で指定されたパスワードを割り当てます。生成する公開鍵と非公開鍵のペアに対応するエンティティーの「識別名」は、通称が「Mark Jones」、組織単位が「Java」、組織が「Oracle」、2 文字の国番号が「US」です。公開鍵と非公開鍵のサイズはどちらも 1024 ビットで、鍵の作成にはデフォルトの DSA 鍵生成アルゴリズムを使用します。
このコマンドは、公開鍵と識別名情報を含む自己署名証明書 (デフォルトの SHA1withDSA 署名アルゴリズムを使用) を作成します。証明書の有効期間は 180 日です。証明書は、別名「business」で特定されるキーストアエントリ内の非公開鍵に関連付けられます。非公開鍵には、<new password for private key> で指定されたパスワードが割り当てられます。
オプションのデフォルト値を使う場合は、上に示したコマンドを大幅に短くすることができます。実際には、オプションを 1 つも指定せずにコマンドを実行することも可能です。デフォルト値を持つオプションでは、オプションを指定しなければデフォルト値が使われ、必要な値については入力を求められます。たとえば、単に次のように入力することもできます。
keytool -genkeypair
この場合は、mykey という別名でキーストアエントリが作成され、新しく生成された鍵のペア、および 90 日間有効な証明書がこのエントリに格納されます。このエントリは、ホームディレクトリ内の .keystore という名前のキーストアに置かれます。このキーストアがまだ存在していない場合は、作成されます。識別名情報、キーストアのパスワード、および非公開鍵のパスワードについては、入力を求められます。
以下では、オプションを指定しないで -genkeypair
コマンドを実行したものとして例を示します。情報の入力を求められた場合は、最初に示した -genkeypair
コマンドの値 (たとえば、「cn=Mark Jones, ou=Java, o=Oracle, c=US」という識別名) を入力したものとします。
現時点で手元にあるのは、1 通の自己署名証明書だけです。証明書に証明書発行局 (CA) の署名が付いていれば、ほかのユーザーから証明書が信頼できる可能性も高くなります。CA の署名を取得するには、まず、証明書署名要求 (CSR) を生成します。たとえば、次のようにします。
keytool -certreq -file MarkJ.csr
CSR (デフォルト別名「mykey」によって特定されるエンティティーの CSR) が作成され、MarkJ.csr という名前のファイルに置かれます。このファイルは、VeriSign などの CA に提出します。CA は要求者を (通常はオフラインで) 認証し、要求者の公開鍵を認証した署名付きの証明書を送り返します。場合によっては、CA が証明書のチェーンを返すこともあります。証明書のチェーンでは、各証明書がチェーン内のその前の署名者の公開鍵を認証します。
作成した自己署名証明書は、証明書チェーンで置き換える必要があります。証明書チェーンでは、各証明書が、「ルート」CA を起点とするチェーン内の次の証明書の署名者の公開鍵を認証します。
CA からの証明書応答をインポートするには、キーストアか、(importcert コマンドで説明しているように) cacerts
キーストアファイル内に 1 つ以上の「信頼できる証明書」がある必要があります。
cacerts キーストアファイルは、複数の VeriSign ルート CA 証明書を含んだ状態で出荷されているので、VeriSign の証明書を、信頼できる証明書としてキーストア内にインポートする必要はない可能性があります。ただし、ほかの CA に対して署名付き証明書を要求していて、この CA の公開鍵を認証する証明書が、cacerts にまだ追加されていない場合は、該当する CA からの証明書を、「信頼できる証明書」としてインポートする必要があります。
通常、CA からの証明書は、自己署名証明書、またはほかの CA によって署名された証明書です (後者の場合は、該当するほかの CA の公開鍵を認証する証明書も必要)。たとえば、ABC という企業が CA だとします。このとき、この CA の公開鍵を認証する自己署名証明書と考えられる ABCCA.cer という名前のファイルを、ABC から入手したとします。
「信頼できる証明書」として証明書をインポートするときは、証明書が有効であることを慎重に確認する必要があります。まず、証明書の内容を表示して (keytool -printcert
コマンドを使用するか、または -noprompt
オプションを指定しないで keytool -importcert
コマンドを使用)、表示された証明書のフィンガープリントが期待されるフィンガープリントと一致するかどうかを確認します。証明書を送信した人物に連絡し、この人物が提示した (または安全な公開鍵のリポジトリによって提示される) フィンガープリントと、上のコマンドで表示されたフィンガープリントとを比較します。フィンガープリントが一致すれば、送信途中でほかの何者か (攻撃者など) による証明書のすり替えが行われていないことを確認できます。送信途中でこの種の攻撃が行われていた場合、チェックを行わずに証明書をインポートすると、攻撃者によって署名されたすべてのものを信頼することになります。
ABCCA.cer を有効な証明書として信頼する場合は、証明書をキーストアに追加できます。たとえば、次のようにします。
keytool -importcert -alias abc -file ABCCA.cer
ABCCA.cer ファイルのデータを含む「信頼できる証明書」のエントリがキーストア内に作成され、該当するエントリに abc という別名が割り当てられます。
証明書署名要求の提出先の CA の公開鍵を認証する証明書をインポートしたあとは (または同種の証明書がすでに cacerts ファイル内に存在している場合は)、証明書応答をインポートし、自己署名証明書を証明書チェーンで置き換えることができます。この証明書チェーンは、CA の応答がチェーンの場合、証明書署名要求に対する応答として CA から送り返された証明書チェーンです。また、CA の応答が単一の証明書の場合は、この証明応答と、インポート先のキーストア内または cacerts キーストアファイル内にすでに存在する信頼できる証明書とを使って構築した証明書チェーンです。
たとえば、証明書署名要求を VeriSign に送信したとします。送り返された証明書の名前が VSMarkJ.cer だとすると、次のようにして応答をインポートできます。
keytool -importcert -trustcacerts -file VSMarkJ.cer
たとえば、jarsigner ツールを使って Java ARchive (JAR) ファイルに署名を付けたとします。この JAR ファイルはクライアントによって使われますが、クライアント側では署名を認証したいと考えています。
クライアントが署名を認証する方法の 1 つに、まず自分の公開鍵の証明書を「信頼できる」エントリとしてクライアントのキーストアにインポートする方法があります。そのためには、証明書をエクスポートして、クライアントに提供します。たとえば、次のようにして、証明書を MJ.cer
という名前のファイルにコピーします。このエントリには「mykey」という別名が使われているとします。
keytool -exportcert -alias mykey -file MJ.cer
証明書と署名付き JAR ファイルを入手したクライアントは、jarsigner ツールを使って署名を認証できます。
コマンド「importkeystore」を使えば、あるキーストアの全体を別のキーストア内にインポートできます。これは、鍵や証明書といったソースキーストア内のすべてのエントリが、単一のコマンドを使ってターゲットキーストア内にインポートされることを意味します。このコマンドを使えば、異なるタイプのキーストア内に含まれるエントリをインポートすることができます。インポート時には、ターゲットキーストア内の新しいエントリはすべて、元と同じ別名および (秘密鍵や非公開鍵の場合は) 保護用パスワードを持ちます。ソースキーストア内の非公開鍵や秘密鍵の回復時に問題が発生した場合、keytool はユーザーにパスワードの入力を求めます。このコマンドは、別名の重複を検出すると、ユーザーに新しい別名の入力を求めます。ユーザーは、新しい別名を指定することも、単純に既存の別名の上書きを keytool に許可することもできます。
たとえば、通常の JKS タイプのキーストア key.jks 内のエントリを PKCS #11 タイプのハードウェアベースのキーストア内にインポートするには、次のコマンドを使用できます。
keytool -importkeystore -srckeystore key.jks -destkeystore NONE -srcstoretype JKS -deststoretype PKCS11 -srcstorepass <source keystore password> -deststorepass <destination keystore password>
また、importkeystore コマンドを使えば、あるソースキーストア内の単一のエントリをターゲットキーストアにインポートすることもできます。この場合、上記の例で示したオプションに加え、インポート対象となる別名を指定する必要があります。srcalias オプションを指定する場合には、ターゲット別名もコマンド行から指定できるほか、秘密/非公開鍵の保護用パスワードやターゲット保護用パスワードも指定できます。その方法を示すコマンドを次に示します。
keytool -importkeystore -srckeystore key.jks -destkeystore NONE -srcstoretype JKS -deststoretype PKCS11 -srcstorepass <source keystore password> -deststorepass <destination keystore password> -srcalias myprivatekey -destalias myoldprivatekey -srckeypass <source entry password> -destkeypass <destination entry password> -noprompt
3 つのエンティティー、つまり、ルート CA (root)、中間 CA (ca)、および SSL サーバー (server) 用の鍵ペアと証明書を生成する keytool コマンドを次に示します。すべての証明書が同じキーストアに格納されていることを確認してください。これらの例では、鍵アルゴリズムとして 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 <storepass> -keystore ca.jks -certreq -alias ca | keytool -storepass <storepass> -keystore root.jks -gencert -alias root -ext BC=0 -rfc > ca.pem keytool -keystore ca.jks -importcert -alias ca -file ca.pem keytool -storepass <storepass> -keystore server.jks -certreq -alias server | keytool -storepass <storepass> -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 つです。
キーストアのすべてのエントリ (鍵および信頼できる証明書) は、一意の別名を介してアクセスされます。
別名を指定するのは、-genseckey コマンドを使って秘密鍵を生成したり、-genkeypair コマンドを使って鍵ペア (公開鍵と非公開鍵) を生成したり、-importcert コマンドを使って証明書または証明書チェーンを信頼できる証明書のリストに追加したりするなど、特定のエンティティーをキーストアに追加する場合です。これ以後、keytool コマンドでエンティティーを参照する場合は、このときに指定した別名を使用する必要があります。
たとえば、duke という別名を使って新しい公開鍵と非公開鍵のペアを生成し、公開鍵を自己署名証明書 (「証明書チェーン」を参照) でラップするとします。この場合は、次のコマンドを実行します。
keytool -genkeypair -alias duke -keypass dukekeypasswd
ここでは、初期パスワードとして dukekeypasswd を指定しています。以後、別名 duke
に関連付けられた非公開鍵にアクセスするコマンドを実行するときは、このパスワードが必要になります。duke の非公開鍵のパスワードをあとから変更するには、次のコマンドを実行します。
keytool -keypasswd -alias duke -keypass dukekeypasswd -new newpass
パスワードが、dukekeypasswd から newpass に変更されます。
注: テストを目的とする場合、または安全であることがわかっているシステムで実行する場合以外は、コマンド行やスクリプトでパスワードを指定しないでください。必要なパスワードのオプションをコマンド行で指定しなかった場合は、パスワードの入力を求められます。
java.security
パッケージで提供される KeyStore
クラスには、キーストア内の情報に対するアクセスと変更を行うための明確に定義されたインタフェースが用意されています。複数の異なる固定実装を生成できます (それぞれ特定の型のキーストアを実装)。
現在、keytool と jarsigner の 2 つのコマンド行ツールと、Policy Tool という GUI ベースのツールが、キーストアの実装を使用しています。KeyStore
は public として使用可能なので、ユーザーは KeyStore を使ったほかのセキュリティーアプリケーションも作成できます。
キーストアには、Oracle が提供する組み込みのデフォルトの実装があります。これは、JKS という名前の独自のキーストアタイプ (形式) を利用するもので、キーストアをファイルとして実装しています。この実装では、個々の非公開鍵は個別のパスワードによって保護され、キーストア全体の整合性も (非公開鍵とは別の) パスワードによって保護されます。
キーストアの実装は、プロバイダベースです。具体的には、KeyStore
が提供するアプリケーションインタフェースは、Service Provider Interface (SPI) という形で実装されています。つまり、対応する KeystoreSpi
抽象クラス (これも java.security
パッケージ内) があり、Service Provider Interface メソッド (「プロバイダ」が実装する必要がある) を定義しています。ここで、「プロバイダ」とは、Java Security API によってアクセス可能なサービスのサブセットに対し、その固定実装を提供するパッケージまたはパッケージの集合のことです。したがって、キーストアの実装を提供するには、「Java 暗号化アーキテクチャー用プロバイダの実装方法」で説明しているように、クライアントが「プロバイダ」を実装し、KeystoreSpi サブクラスの実装を提供する必要があります。
アプリケーションでは、KeyStore
クラスが提供する getInstance ファクトリメソッドを使うことで、さまざまなプロバイダから異なる型のキーストア実装を選択できます。キーストアのタイプは、キーストア情報の格納形式とデータ形式を定義するとともに、キーストア内の非公開/秘密鍵とキーストア自体の整合性を保護するために使われるアルゴリズムを定義します。異なる型のキーストアの実装には、互換性はありません。
keytool は、任意のファイルベースキーストア実装で動作します。(コマンド行で渡されたキーストアの場所をファイル名として扱い、これを FileInputStream に変換して、そこからキーストア情報をロードします。)一方、jarsigner および policytool ツールは、URL を使って指定可能な任意の場所からキーストアを読み取ることができます。
keytool と jarsigner の場合は、-storetype オプションを使ってコマンド行でキーストアのタイプを指定できます。Policy Tool の場合は、「キーストア」メニューによってキーストアのタイプを指定できます。
キーストア型を明示的に指定しない場合、ツールはセキュリティープロパティーファイル内で指定された keystore.type
プロパティーの値に基づいてキーストア実装を選択します。セキュリティープロパティーファイルは、java.security という名前でセキュリティープロパティーディレクトリ java.home/lib/security
に置かれています。java.home は、実行環境のディレクトリ (SDK の jre ディレクトリ、または Java 2 Runtime Environment の最上位のディレクトリ) です。
各ツールは、keystore.type
値を取得してから、現在インストールされているすべてのプロバイダを調べてその型のキーストアを実装しているものを見つけます。目的のプロバイダが見つかると、そのプロバイダからのキーストアの実装を使います。
KeyStore
クラスには、アプリケーションとアプレットが keystore.type
プロパティーの値を取得するための getDefaultType
という名前の static メソッドが定義されています。次のコード行は、デフォルトキーストア型 (keystore.type
プロパティーで指定されたもの) のインスタンスを生成します。
KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
デフォルトのキーストアタイプは JKS (Oracle が提供する独自のタイプのキーストアの実装) です。これは、セキュリティープロパティーファイル内の次の行によって指定されています。
keystore.type=jks
各ツールでデフォルト以外のキーストアの実装を使用するには、上の行を変更して別のキーストアのタイプを指定します。
たとえば、pkcs12 と呼ばれるタイプのキーストアの実装を提供しているプロバイダパッケージを使用するには、上の行を次のように変更します。
keystore.type=pkcs12
注:キーストアのタイプの指定では、大文字と小文字は区別されません。たとえば、JKS と jks は同じものとして扱われます。
公開鍵は、特定のエンティティーに関連付けられた数です。公開鍵は、該当するエンティティーとの間に信頼できる関係を持つ必要があるすべての人に対して公開することを意図したものです。公開鍵は、署名を検証するのに使われます。
データがデジタル署名されると、そのデータは、エンティティーの「アイデンティティー」と、そのエンティティーがデータの内容について知っていることを証明する署名とともに格納されます。エンティティーの非公開鍵を使ってデータに署名を付けると、データの偽造は不可能になります。
エンティティーを特定するための既知の方法です。システムによっては、公開鍵をアイデンティティーにするものがあります。公開鍵のほかにも、Unix UID や電子メールアドレス、X.509 識別名など、さまざまなものをアイデンティティーとすることができます。
署名は、なんらかのデータを基にエンティティー (署名者。証明書に関しては発行者とも呼ばれる) の非公開鍵を使って計算されます。
非公開鍵は特定のエンティティーだけが知っている数のことで、この数のことを、そのエンティティーの非公開鍵といいます。非公開鍵は、ほかに知られないように秘密にしておくことが前提になっています。非公開鍵は、ほかに知られないように秘密にしておくことが前提になっています。非公開鍵と公開鍵は、すべての公開鍵暗号化システムで対になって存在しています。DSA などの典型的な公開鍵暗号化システムの場合、1 つの非公開鍵は正確に 1 つの公開鍵に対応します。非公開鍵は、署名を計算するのに使われます。
エンテンティーは、人、組織、プログラム、コンピュータ、企業、銀行など、一定の度合いで信頼の対象となるさまざまなものを指します。
公開鍵暗号化では、その性質上、ユーザーの公開鍵にアクセスする必要があります。大規模なネットワーク環境では、互いに通信しているエンティティー間で以前の関係が引き続き確立されていると仮定したり、使われているすべての公開鍵を収めた信頼できるリポジトリが存在すると仮定したりすることは不可能です。このような公開鍵の配布に関する問題を解決するために証明書が考案されました。現在では、証明書発行局 (CA) が信頼できる第三者として機能します。CA は、ほかのエンティティーの証明書に署名する (発行する) 行為を、信頼して任されているエンティティー (企業など) です。CA は法律上の契約に拘束されるので、有効かつ信頼できる証明書だけを作成するものとして扱われます。VeriSign、Thawte、Entrust を始め、多くの公開 CA が存在します。Microsoft の認証サーバーや Entrust の CA 製品などを所属組織内で利用すれば、独自の証明書発行局を運営することも可能です。
keytool を使うと、証明書の表示、インポート、およびエクスポートを行うことができます。また、自己署名証明書を生成することもできます。
現在、keytool は X.509 証明書を対象にしています。
X.509 規格では、証明書に含める情報が定義されており、この情報を証明書に書き込む方法 (データ形式) についても記述されています。証明書のすべてのデータは、ASN.1/DER と呼ばれる 2 つの関連規格を使ってエンコードされます。Abstract Syntax Notation 1 はデータについて記述しています。Definite Encoding Rules は、データの保存および転送の方法について記述しています。
すべての X.509 証明書は、署名のほかに次のデータを含んでいます。
証明書に適用される X.509 規格のバージョンを特定します。証明書に指定できる情報は、バージョンによって異なります。これまでに、3 つのバージョンが定義されています。keytool では、v1、v2、および v3 の証明書のインポートとエクスポートが可能です。keytool が生成するのは、v3 の証明書です。
X.509 Version 1 は、1988 年から利用されて広く普及しており、もっとも一般的です。
X.509 Version 2 では、サブジェクトや発行者の名前をあとで再利用できるようにするために、サブジェクトと発行者の一意識別子の概念が導入されました。ほとんどの証明書プロファイル文書では、名前を再使用しないことと、証明書で一意な識別子を使わないことが、強く推奨されています。Version 2 の証明書は、広くは使われていません。
X.509 Version 3 はもっとも新しい (1996 年) 規格で、拡張機能の概念をサポートしています。拡張機能は、だれでも定義でき、証明書に含めることができます。現在使われている一般的なエクステンションとしては、現在使われている一般的な拡張機能としては、KeyUsage (「署名専用」など、鍵の使用を特定の目的に制限する)、AlternativeNames (DNS 名、電子メールアドレス、IP アドレスなど、ほかのアイデンティティーを公開鍵に関連付けることができる) などがあります。拡張機能には、critical というマークを付けて、その拡張機能のチェックと使用を義務付けることができます。たとえば、critical とマークされ、KeyCertSign が設定された KeyUsage エクステンションが証明書に含まれている場合、この証明書を 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
これらはそれぞれサブジェクトの通称、組織単位、組織、国を表します。
名前を付けられたエンティティーの公開鍵とアルゴリズム識別子です。アルゴリズム識別子では、公開鍵に対して使われている公開鍵暗号化システムおよび関連する鍵パラメータが指定されています。
keytool では、非公開鍵および関連する証明書「チェーン」を含むキーストアの「鍵」エントリを作成して管理できます。このようなエントリでは、非公開鍵に対応する公開鍵は、チェーンの最初の証明書に含まれています。
鍵をはじめて作成すると (-genkeypair コマンドを参照)、自己署名証明書という 1 つの要素だけを含むチェーンが開始されます。自己署名証明書は、発行者 (署名者) が主体 (証明書で認証されている公開鍵の持ち主) と同じである証明書のことです。-genkeypair
コマンドを呼び出して新しい公開鍵と非公開鍵のペアを作成すると、公開鍵は常に自己署名証明書でラップされます。
このあと、証明書署名要求 (CSR) が生成されて (-certreq コマンドを参照)、CSR が証明書発行局 (CA) に送信されると、CA からの応答がインポートされ (-importcert コマンドを参照)、元の自己署名証明書は証明書チェーンによって置き換えられます。チェーンの最後にあるのは、Subject の公開鍵を認証した CA が発行した証明書 (応答) です。チェーン内のその前の証明書は、CA の公開鍵を認証する証明書です。
CA の公開鍵を認証する証明書は、多くの場合、自己署名証明書 (つまり CA が自身の公開鍵を認証した証明書) であり、これはチェーンの最初の証明書になります。場合によっては、CA が証明書のチェーンを返すこともあります。この場合、チェーン内の最後の証明書 (CA によって署名され、鍵エントリの公開鍵を認証する証明書) に変わりはありませんが、チェーン内のその前の証明書は、CSR の送信先の CA とは別の CA によって署名され、CSR の送信先の CA の公開鍵を認証する証明書になります。さらに、チェーン内のその前の証明書は、次の CA の鍵を認証する証明書になります。以下同様に、自己署名された「ルート」証明書に達するまでチェーンが続きます。したがって、チェーン内の (最初の証明書以後の) 各証明書では、チェーン内の次の証明書の署名者の公開鍵が認証されていることになります。
多くの CA は、チェーンをサポートせずに発行済みの証明書だけを返します。特に、中間の CA が存在しないフラットな階層構造の場合は、その傾向が顕著です。このような場合は、キーストアにすでに格納されている信頼できる証明書情報から、証明書チェーンを確立する必要があります。
別の応答形式 (PKCS#7 で定義されている形式) でも、発行済み証明書に加え、証明書チェーンのサポートが含まれています。keytool では、どちらの応答形式も扱うことができます。
トップレベル (ルート) CA の証明書は、自己署名証明書です。ただし、ルートの公開鍵に対する信頼は、ルートの証明書自体から導き出されるものではなく (たとえば、VeriSign ルート CA のような有名な識別名を使った自己署名証明書を作成すること自体は誰でも可能)、新聞などのほかの情報源に由来するものです。ルート CA の公開鍵は広く知られています。ルート CA の公開鍵を証明書に格納する理由は、証明書という形式にすることで多くのツールから利用できるようになるからにすぎません。つまり、証明書は、ルート CA の公開鍵を運ぶ「媒体」として利用されるだけです。ルート CA の証明書をキーストアに追加するときは、その前に証明書の内容を表示し (-printcert
オプションを使用)、表示されたフィンガープリントと、新聞やルート CA の Web ページなどから入手した既知のフィンガープリントとを比較する必要があります。
「cacerts」証明書ファイルは、セキュリティープロパティーディレクトリ java.home/lib/security
に置かれています。java.home は、実行環境のディレクトリ (SDK の jre ディレクトリ、または Java 2 Runtime Environment の最上位のディレクトリ) です。
cacerts ファイルは、CA の証明書を含む、システム全体のキーストアです。システム管理者は、キーストアタイプに jks を指定することで、keytool を使ってこのファイルの構成と管理を行うことができます。「cacerts」キーストアファイルは、一連のデフォルトのルート CA 証明書を含んだ状態で出荷されています。これらの一覧を表示するには、次のコマンドを使用します。
keytool -list -keystore java.home/lib/security/cacerts
cacerts キーストアファイルの初期パスワードは、changeit です。システム管理者は、SDK のインストール後、このファイルのパスワードとデフォルトアクセス権を変更する必要があります。
重要: cacerts
ファイルを確認してください。cacerts
ファイル内の CA は、証明書の署名やほかのエンティティーへの発行を行うエンティティーとして信頼されるため、cacerts
ファイルの管理は慎重に行う必要があります。cacerts
ファイルには、信頼する CA の証明書だけが含まれていなければなりません。ユーザーは、自身の責任で、cacerts
ファイルにバンドルされている信頼できるルート CA 証明書を検証し、信頼性に関する独自の決定を行います。信頼できない CA 証明書を cacerts
ファイルから削除するには、keytool
コマンドの削除オプションを使用します。cacerts
ファイルは JRE のインストールディレクトリにあります。このファイルを編集するアクセス権がない場合は、システム管理者に連絡してください。
多くの場合、証明書は、バイナリ符号化ではなく、インターネット RFC 1421 規格で定義されている出力可能符号化方式を使って格納されます。「Base 64 符号化」とも呼ばれるこの証明書形式では、電子メールやその他のメカニズムを通じて、ほかのアプリケーションに証明書を容易にエクスポートできます。
-importcert
コマンドと -printcert
コマンドでは、この形式の証明書とバイナリ符号化の証明書を読み込むことができます。
-exportcert
コマンドでは、デフォルトでバイナリ符号化の証明書が出力されます。ただし、-rfc
オプションを指定した場合は、出力可能符号化方式の証明書が出力されます。
-list
コマンドでは、デフォルトで証明書の SHA1 フィンガープリントが出力されます。-v
オプションを指定すると、人間が読むことのできる形式で証明書が出力されます。一方、-rfc
オプションを指定すると、出力可能符号化方式で証明書が出力されます。
出力可能符号化方式で符号化された証明書は、次の行で始まります。
-----BEGIN CERTIFICATE-----
最後は、次の行で終わります。
-----END CERTIFICATE-----
X.500 識別名は、エンティティーを特定するために使われます。たとえば、X.509 証明書の subject
フィールドと issuer
(署名者) フィールドで指定される名前は、X.500 識別名です。keytool は、次のサブパートをサポートしています。
-genkeypair
コマンドの -dname
オプションの値として識別名文字列を指定する場合は、次の形式で指定する必要があります。
CN=cName, OU=orgUnit, O=org, L=city, S=state, C=countryCode
イタリック体の項目は、実際に指定する値を表します。短縮形のキーワードの意味は、次のとおりです。
CN=commonName OU=organizationUnit O=organizationName L=localityName S=stateName C=country
次に示すのは、識別名文字列の例です。
CN=Mark Smith, OU=Java, O=Oracle, L=Cupertino, S=California, C=US
次は、この文字列を使ったコマンドの例です。
keytool -genkeypair -dname "CN=Mark Smith, OU=Java, O=Oracle, L=Cupertino, S=California, C=US" -alias mark
キーワードの短縮形では、大文字と小文字は区別されません。たとえば、CN、cn、および Cn は、どれも同じものとして扱われます。
一方、キーワードの指定順序には意味があり、各サブコンポーネントは上に示した順序で指定する必要があります。ただし、サブコンポーネントをすべて指定する必要はありません。たとえば、次のように一部のサブコンポーネントだけを指定できます。
CN=Steve Meier, OU=Java, O=Oracle, C=US
識別名文字列の値にコンマが含まれる場合に、コマンド行で文字列を指定するときには、次のようにコンマを文字 \ でエスケープする必要があります。
cn=Peter Schuster, ou=Java\, Product Development, o=Oracle, c=US
識別名文字列をコマンド行で指定する必要はありません。識別名を必要とするコマンドを実行するときに、コマンド行で識別名を指定しなかった場合は、各サブコンポーネントの入力を求められます。この場合は、コンマを文字 \ でエスケープする必要はありません。
重要:信頼できる証明書として証明書をインポートする前に、証明書の内容を慎重に調べてください。
まず、証明書の内容を表示して (-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 Sep 25 18:01:13 PDT 1997 until: Wed Dec 24 17:01:13 PST 1997 Certificate Fingerprints: MD5: 11:81:AD:92:C8:E5:0E:A2:01:2E:D4:7A:D7:5F:07:6F SHA1: 20:B6:17:FA:EF:E5:55:8A:D0:71:1F:E8:D6:9D:C0:37:13:0E:5E:FE SHA256: 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
コマンドを実行すると、証明書の情報が出力され、確認を求めるメッセージが表示されます。インポート操作は、この時点で中止できます。ただし、確認メッセージが表示されるのは、-importcert
コマンドを -noprompt
オプションを指定せずに実行した場合だけです。-noprompt
オプションが指定されている場合、ユーザーとの対話は行われません。
キーストアに対する操作を行うほとんどのコマンドでは、ストアのパスワードが必要です。また、一部のコマンドでは、非公開/秘密鍵のパスワードが必要になることがあります。
パスワードはコマンド行で指定できます (ストアのパスワードには -storepass
オプション、非公開鍵のパスワードには -keypass
オプションを使用)。ただし、テストを目的とする場合、または安全であることがわかっているシステムで実行する場合以外は、コマンド行やスクリプトでパスワードを指定しないでください。
必要なパスワードのオプションをコマンド行で指定しなかった場合は、パスワードの入力を求められます。
インターネット標準の RFC 5280 では、X.509 証明書が準拠するプロファイルを定義しています。このプロファイルには、証明書のフィールドやエクステンションで有効な値や値の組合せが含まれています。 keytool では、これらのすべての規則が適用されているわけではないので、標準に準拠しない証明書が生成される可能性があり、そのような証明書は JRE やその他のアプリケーションで拒否されることがあります。ユーザーは、-dname
や -ext
などに正しいオプションを指定するようにしてください。
Java SE 6 で keytool のコマンドインタフェースが変更されました。
keytool は、ユーザーがパスワードを入力する際にその入力内容を表示しなくなりました。ユーザーはパスワード入力時にその入力内容を確認できなくなったため、初期キーストアパスワードを設定したり鍵パスワードを変更したりするなど、パスワードの設定や変更を行うたびにパスワードの再入力を求められます。
変更されたコマンドの中には、名前が変更されただけのものもあれば、廃止されてこのドキュメントに記載されなくなったものもあります。以前のすべてのコマンド (名前が変更されたものと廃止されたものの両方) は、このリリースでも引き続きサポートされており、今後のリリースでもサポートされる予定です。keytool のコマンドインタフェースに加えられたすべての変更点の概要を、次に示します。
名前が変更されたコマンド:
-export
、次に名前変更 -exportcert
-genkey
、次に名前変更 -genkeypair
-import
、次に名前変更 -importcert
廃止されてドキュメントに記載されなくなったコマンド: