Java ARchive (JAR) ファイルの署名を生成し、署名付き JAR ファイルの署名を検証します。
jarsigner [ options ] jar-file alias jarsigner -verify [ options ] jar-file
jarsigner ツールは、次の 2 つの目的で使用します。
- Java ARchive (JAR) ファイルに署名を付ける
- 署名付き JAR ファイルの署名と完全性を検証する
JAR 機能を使うと、クラスファイル、イメージ、サウンド、およびその他のデジタルデータを単一のファイルにパッケージ化できるので、ファイルを迅速かつ容易に配布できます。開発者は、jar という名前のツールを使って JAR ファイルを作成できます。技術的な観点から言えば、すべての ZIP ファイルも JAR ファイルとみなすことができます。ただし、jar によって作成された JAR ファイル、または jarsigner によって処理された JAR ファイルには、META-INF/MANIFEST.MF ファイルが含まれています。
「デジタル署名」は、なんらかのデータ (「署名」の対象となるデータ) と、エンティティ (人、会社など) の非公開鍵とに基づいて計算されるビット列です。手書きの署名同様、デジタル署名には多くの利点があります。
- 署名の生成に使われた非公開鍵と対になる公開鍵を使って計算を行うことで、デジタル署名が本物かどうかを検証できる
- 非公開鍵が他人に知られない限り、デジタル署名の偽造は不可能である
- デジタル署名は、その署名が付いたデータだけを対象とするものであり、ほかのデータの署名として機能することはない
- 署名付きのデータは変更できない。データが変更された場合は、その署名によってデータが本物ではないことが検証される
ファイルに対してエンティティの署名を生成するには、まず、そのエンティティが公開鍵と非公開鍵のペアを持つ必要があります。また、公開鍵を認証する 1 つ以上の証明書も必要です。「証明書」とは、あるエンティティからのデジタル署名付きの文書のことです。証明書には、ほかのあるエンティティの公開鍵が特別な値を持っていることが書かれています。
jarsigner は、「キーストア」に含まれる鍵と証明書情報を使って、JAR ファイルのデジタル署名を生成します。キーストアは、非公開鍵と、非公開鍵に関連付けられた X.509 証明連鎖が収められたデータベースです。証明連鎖は、非公開鍵に対応する公開鍵を認証します。キーストアの作成と管理には、keytool ユーティリティを使います。
jarsigner は、エンティティの非公開鍵を使って署名を生成します。署名付き JAR ファイルには、キーストアからの証明書のコピーが含まれています。これは、JAR ファイルの署名に使われた非公開鍵に対応する公開鍵の証明書のコピーです。jarsigner は、署名付き JAR ファイルのデジタル署名を、ファイル内 (の署名ブロックファイル) に含まれている証明書を使って検証することができます。
現時点では、jarsigner で署名できるのは、JDK の jar ツールで作成された JAR ファイル、または ZIP ファイルだけです。JAR ファイルは ZIP ファイルと同じですが、JAR ファイルには META-INF/MANIFEST.MF ファイルが含まれている点が異なります。META-INF/MANIFEST.MF ファイルは、jarsigner が ZIP ファイルに署名を付けるときに自動的に作成されます。
デフォルトでは、jarsigner は JAR (または ZIP) ファイルに「署名」を付けます。署名付き JAR ファイルを「検証」する場合は、
-verify
オプションを指定します。JDK 1.1 との互換性
keytool ツールと jarsigner ツールは、JDK 1.1 で提供されていた javakey ツールを完全に置き換えるものです。これらの新しいツールは javakey よりも多くの機能を備えており、キーストアと非公開鍵をパスワードで保護する機能や、署名の生成だけでなく署名を検証する機能を持っています。
新しいキーストアアーキテクチャは、javakey が作成して管理していたアイデンティティデータベースに代わるものです。キーストア形式と、JDK 1.1 の javakey が使っていたデータベース形式との間には下位互換性はありません。ただし、次のようなことは可能です。
次の表は、JDK 1.1.x で署名された JAR ファイルが、JDK 1.2 でどのように扱われるかを示しています。
- keytool の
-identitydb
コマンドを使うと、アイデンティティデータベースの情報をキーストアにインポートできます。
- jarsigner は、以前に javakey を使って署名された JAR ファイルに署名を付けることができます。
- jarsigner は、javakey を使って署名された JAR ファイルを検証できます。したがって、jarsigner は、JDK 1.2 のキーストアではなく JDK 1.1 のアイデンティティデータベースからの署名者別名を認識し、これらを対象に処理を行うことができます。
JAR ファイルのタイプ
1.1 データベース内のアイデンティティ
1.1 データベースから 1.2 キーストアにインポートされる信頼できるアイデンティティ (4)
ポリシーファイルがアイデンティティ/別名に特権を与える
与えられる特権
署名付き JAR
×
×
×
すべてのコードに与えられるデフォルトの特権
署名のない JAR
×
×
×
すべてのコードに与えられるデフォルトの特権
署名付き JAR
×
○
×
すべてのコードに与えられるデフォルトの特権
署名付き JAR
○/信頼できない
×
×
すべてのコードに与えられるデフォルトの特権 (3)
署名付き JAR
○/信頼できない
×
○
すべてのコードに与えられるデフォルトの特権 (1,3)
署名付き JAR
×
○
○
すべてのコードに与えられるデフォルトの特権とポリシーファイル内で与えられる特権
署名付き JAR
○/信頼できる
○
○
すべてのコードに与えられるデフォルトの特権とポリシーファイル内で与えられる特権 (2)
署名付き JAR
○/信頼できる
×
×
すべての特権
署名付き JAR
○/信頼できる
○
×
すべての特権 (1)
署名付き JAR
○/信頼できる
×
○
すべての特権 (1)
注:
- ポリシーファイル内にアイデンティティ/別名についての言及がある場合、それをキーストアにインポートして、ポリシーファイルの設定が与えられた特権に反映されるようにする必要があります。
- ポリシーファイル/キーストアの組み合わせは、アイデンティティデータベース内の信頼できるアイデンティティよりも優先されます。
- JDK 1.2 では、信頼できないアイデンティティは無視されます。
- JDK 1.2 キーストアにインポートできるのは、信頼できるアイデンティティだけです。
キーストアの別名
キーストアのすべてのエントリは、一意の「別名」を介してアクセスされます。
jarsigner を使って JAR ファイルに署名を付けるときは、署名の生成に必要な非公開鍵を含むキーストアエントリの別名を指定する必要があります。たとえば、次の例は、working ディレクトリの mystore という名前のキーストアに含まれる別名 duke に関連付けられた非公開鍵を使って、MyJARFile.jar という名前の JAR ファイルに署名を付けます。出力ファイルは指定されていないので、MyJARFile.jar は署名付きの JAR ファイルによって上書きされます。
jarsigner -keystore /working/mystore -storepass myspass -keypass dukekeypasswd MyJARFile.jar dukeキーストアはパスワードで保護されているので、ストアのパスワード (上の例では mypass) を指定する必要があります。コマンド行でストアのパスワードを指定しなかった場合は、パスワードの入力を求められます。同様に、非公開鍵もキーストア内でパスワードによって保護されているので、非公開鍵のパスワード (上の例では dukekeypasswd) を指定する必要があります。コマンド行で非公開鍵のパスワードを指定しておらず、非公開鍵のパスワートがストアのパスワードと違っている場合は、非公開鍵のパスワードの入力を求められます。
キーストアの場所
jarsigner には、使用するキーストアの URL を指定する-keystore
オプションがあります。キーストアは、デフォルトではユーザのホームディレクトリの .keystore という名前のファイルに格納されます。ユーザのホームディレクトリは、user.home システムプロパティによって決まります。Solaris システムの場合、user.home はデフォルトでユーザのホームディレクトリになっています。キーストアの実装
java.security
パッケージで提供されるKeyStore
クラスには、キーストア内の情報に対するアクセスと変更を行うための明確に定義されたインタフェースが用意されています。キーストアの固定実装としては、それぞれが特定の「タイプ」のキーストアを対象とする複数の異なる実装が可能です。現在、キーストアの実装を使用するものとして、keytool と jarsigner の 2 つのコマンド行ツールと、Policy Tool という名前の 1 つの GUI ベースのツールがあります。
KeyStore
クラスは public として使用可能なので、JDK ユーザはKeyStore
を使ってほかのセキュリティアプリケーションも作成できます。キーストアには、Sun が提供する組み込みのデフォルトの実装があります。これは、JKS という名前の独自のキーストアタイプ (形式) を利用するもので、キーストアをファイルとして実装しています。この実装では、個々の非公開鍵は個別のパスワードによって保護され、キーストア全体の完全性も (非公開鍵とは別の) パスワードによって保護されます。
キーストアの実装は、プロバイダベースです。具体的には、
KeyStore
クラスが提供するアプリケーションインタフェースは、Service Provider Interface (SPI) という形で実装されています。つまり、対応するKeystoreSpi
抽象クラス (これもjava.security
パッケージに含まれている) があり、このクラスが Service Provider Interface のメソッドを定義しています。これらのメソッドは、「プロバイダ」が実装しなければなりません。ここで、「プロバイダ」とは、Java Security API によってアクセス可能なサービスのサブセットに対し、その固定実装を提供するパッケージまたはパッケージの集合のことです。したがって、キーストアの実装を提供するには、「Java 暗号化アーキテクチャ用プロバイダの実装方法」で説明しているように、クライアントがプロバイダを実装し、KeystoreSpi サブクラスの実装を提供する必要があります。アプリケーションでは、
KeyStore
クラスが提供する getInstance ファクトリメソッドを使うことで、さまざまなプロバイダから異なる「タイプ」のキーストアの実装を選択できます。キーストアのタイプは、キーストア情報の格納形式とデータ形式、およびキーストア内の非公開鍵とキーストア自体の完全性を保護するために使われるアルゴリズムを定義します。異なるタイプのキーストアの実装には、互いに互換性はありません。keytool、jarsigner、および policytool の各ツールは、KeyStore
が提供する共通のアプリケーションインタフェースだけを使っているので、任意のタイプのキーストアで使用できます。keytool は、ファイルベースのキーストア実装に対して機能します。keytool は、コマンド行で渡されたキーストアの位置をファイル名として扱い、FileInputStream に変換して、そこからキーストア情報をロードします。一方、jarsigner ツールおよび policytool ツールは、URL を使って指定することが可能な任意の位置にあるキーストアを読み取ることができます。
jarsigner と keytool の場合、-storetype オプションを使ってコマンド行でキーストアのタイプを指定できます。Policy Tool の場合は、[Edit] メニューの [Change Keystore] コマンドを使ってキーストアのタイプを指定できます。
キーストアのタイプを明示的に指定しない場合、keytool、jarsigner、および policytool の各ツールは、セキュリティプロパティファイル内で指定された
keystore.type
プロパティの値に基づいてキーストアの実装を選択します。セキュリティプロパティファイルは、java.security という名前で JDK セキュリティプロパティディレクトリjava.home/lib/security
に置かれています。java.home は、JDK のインストール先ディレクトリです。各ツールは、
keystore.type
の値を取得し、この値で指定されたタイプのキーストアを実装しているプロバイダが見つかるまで、現在インストールされているすべてのプロバイダを調べます。目的のプロバイダが見つかると、そのプロバイダからのキーストアの実装を使います。
KeyStore
クラスではgetDefaultType
という名前の static メソッドが定義されており、アプリケーションとアプレットはこのメソッドを使うことでkeystore.type
プロパティの値を取得できます。次のコードは、デフォルトのキーストアタイプ (keystore.type
プロパティで指定されたタイプ) のインスタンスを生成します。KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());デフォルトのキーストアタイプは jks (Sun が提供する独自のタイプのキーストアの実装) です。これは、セキュリティプロパティファイル内の次の行によって指定されています。
keystore.type=jks各ツールでデフォルト以外のキーストアの実装を使用するには、上の行を変更して別のキーストアのタイプを指定します。
たとえば、pkcs12 と呼ばれるタイプのキーストアの実装を提供しているプロバイダパッケージを使用するには、上の行を次のように変更します。
keystore.type=pkcs12注: キーストアのタイプの指定では、大文字と小文字は区別されません。たとえば、JKS と jks は同じものとして扱われます。サポートされるアルゴリズム
現時点では、jarsigner は次のどちらかのアルゴリズムを使って JAR ファイルに署名を付けることができます。
- SHA-1 ダイジェストアルゴリズムを使った DSA (デジタル署名アルゴリズム)
- MD5 ダイジェストアルゴリズムを使った RSA アルゴリズム
具体的には、署名者の公開鍵と非公開鍵が DSA 鍵である場合、jarsigner は SHA1withDSA アルゴリズムを使って JAR ファイルに署名を付けます。署名者の鍵が RSA 鍵である場合、jarsigner は MD5withRSA アルゴリズムを使って JAR ファイルに署名を付けます。ただし、MD5withRSA アルゴリズムを使用できるのは、MD5withRSA アルゴリズムの実装を提供する、静的にインストールされたプロバイダが存在する場合だけです。デフォルトの SUN プロバイダからの SHA1withDSA アルゴリズムは常に使用できます。
署名付き JAR ファイル
jarsigner を使って JAR ファイルに署名を付けた場合、出力される署名付き JAR ファイルは入力 JAR ファイルと同じですが、次の 2 つの追加ファイルが META-INF ディレクトリに置かれる点が異なります。
これら 2 つのファイルのベースファイル名は、
- .SF 拡張子の付いた署名ファイル
- .DSA 拡張子の付いた署名ブロックファイル
-sigFile
オプションの値から作成されます。たとえば、次のようにオプションを指定したとします。-sigFile MKSIGNこの場合、ファイル名はそれぞれ MKSIGN.SF と MKSIGN.DSA になります。コマンド行に
-sigfile
オプションの指定がない場合、.SF ファイルと .DSA ファイルのベースファイル名は、コマンド行で指定された別名の先頭の 8 文字をすべて大文字に変換したものになります。別名が 8 文字未満の場合は、別名がそのまま使われます。別名の中に、署名ファイル名に使用できない文字が含まれている場合は、該当する文字を下線 (_) に置き換えてファイル名が作成されます。使用できる文字は、アルファベット、数字、下線 (_)、ハイフンです。署名 (.SF) ファイル
署名ファイル (.SF ファイル) は、jarsigner で署名を付けた JAR ファイルに常に含まれるマニフェストファイルと似ています。つまり、マニフェストファイル同様、.SF ファイルには、JAR ファイルに含まれているソースファイルごとに、次の 3 つの行があります。マニフェストファイルでは、SHA ダイジェストの値は、ソースファイルのバイナリデータのダイジェスト (ハッシュ) です。一方、.SF ファイルでは、ソースファイルのダイジェストの値は、マニフェストファイル中の該当するソースファイルに対応する 3 行のハッシュです。
- ファイル名
- 使われているダイジェストアルゴリズム (SHA) の名前
- SHA ダイジェストの値
署名ファイルには、デフォルトでマニフェストファイル全体のハッシュも含まれています。後述の「JAR ファイルの検証」で説明するように、このヘッダの存在によって検証の最適化が可能になっています。
署名ブロック (.DSA) ファイル
.SF ファイルには署名が付けられ、署名は .DSA ファイルに置かれます。.DSA ファイルには、キーストアからの証明書または証明連鎖も符号化された形で含まれています。証明書または証明連鎖は、署名に使われた非公開鍵に対応する公開鍵を認証します。JAR ファイルの検証
JAR ファイルの検証が成功するのは、署名が有効であり、かつ署名の生成以後に JAR ファイル内のどのファイルも変更されていない場合です。 JAR ファイルの検証は、次の手順で行われます。
- .SF ファイルそれ自体の署名を検証します。
この手順では、各署名ブロック (.DSA) ファイルに格納されている署名が、実際に、公開鍵に対応する非公開鍵を使って生成されたものであることを確認します。.DSA ファイルには、公開鍵の証明書 (または証明連鎖) も含まれています。また、この手順では、目的の署名が、対応する署名 (.SF) ファイル内の有効な署名であるかどうかを調べ、.SF ファイルが改変されていないことも確認します。
- .SF ファイル内の各エントリのダイジェストをマニフェスト内の対応する各セクションと突き合わせて検証します。
.SF ファイルには、マニフェストファイル全体のハッシュが格納されたヘッダがデフォルトで含まれています。このヘッダが存在する場合は、ヘッダ内のハッシュが実際にマニフェストファイルのハッシュと一致するかどうかを検証することができます。ハッシュが一致する場合は、次の手順に進みます。
ハッシュが一致しない場合は、効率的には劣る方法を使って検証を行います。具体的には、.SF ファイル内の各ソースファイル情報セクションのハッシュが、マニフェストファイル内の対応するセクションのハッシュと一致するかどうかを確認します (「署名 (.SF) ファイル」を参照)。
.SF ファイルのヘッダに格納されたマニフェストファイルのハッシュと、実際のマニフェストファイルのハッシュとが一致しない場合は、署名 (および .SF ファイル) の生成後に、JAR ファイルに 1 つ以上のファイルが追加 (
jar
ツールを使用) された可能性があります。jar
ツールを使ってファイルを追加した場合、マニフェストファイルは変更されますが (新しいファイル用のセクションが追加される)、.SF ファイルは変更されません。この場合、.SF ファイルのヘッダ以外のセクションに格納されたハッシュが、マニフェストファイル内の対応するセクションのハッシュと一致するときは、署名の生成時に JAR ファイル内に存在していたファイルのうち、どのファイルも変更されていないことになり、検証は成功したものとして扱われます。
- JAR ファイル内のファイルのうち、.SF ファイル内にエントリを持つ各ファイルを読み込みます。読み込み中にファイルのダイジェストを計算し、結果をマニフェストセクション内の該当するファイルのダイジェストと比較します。2 つのダイジェストは同じでなければならず、そうでない場合は検証が失敗します。
検証プロセスの途中でなんらかの重大な検証エラーが発生した場合、検証プロセスは中止され、セキュリティ例外がスローされます。スローされたセキュリティ例外は、jarsigner がキャッチして表示します。
1 つの JAR ファイルを対象とする複数の署名
1 つの JAR ファイルに対して jarsigner ツールを複数回実行し、実行のたびに、異なるユーザの別名を指定すれば、JAR ファイルに複数のユーザの署名を付けることができます。たとえば、次のようにします。jarsigner myBundle.jar susan jarsigner myBundle.jar kevinJAR ファイルが複数回署名されている場合、その JAR ファイルには .SF ファイルと .DSA ファイルの対が複数含まれることになります。.SF ファイルと .DSA ファイルの対は、1 回の署名に対して 1 つ作成されます。したがって、上の例で出力される JAR ファイルには、次の名前を持つファイルが含まれます。SUSAN.SF SUSAN.DSA KEVIN.SF KEVIN.DSA注: JAR ファイルでは、JDK 1.1 の javakey ツールで生成された署名と jarsigner で生成された署名が混在できます。つまり、すでに javakey を使って署名が付けられている JAR ファイルに、jarsigner を使って署名を付けることができます。
以下では、jarsigner のオプションについて説明します。オプションを指定するときは、次の点に注意してください。
- どのオプション名にも先頭にマイナス記号 (-) が付く
- オプションは任意の順序で指定できる
- イタリック体の項目の実際の値 (オプションの値) は、ユーザが指定する必要がある
-keystore
、-storepass
、-keypass
、-sigfile
、および-signedjar
の各オプションを使用できるのは、JAR ファイルに署名を付ける場合だけである。これらのオプションは、JAR ファイルを検証する場合には使用できない。同様に、別名をコマンド行で指定するのは、JAR ファイルに署名を付ける場合だけである
-keystore
url- キーストアの場所を示す URL を指定します。デフォルトは、ユーザのホームディレクトリ内のファイル .keystore です。ユーザのホームディレクトリは、user.home システムプロパティによって決まります。
署名するときはキーストアが必要です。このため、デフォルトのキーストアが存在しない場合、あるいはデフォルト以外のほかのキーストアを使用する場合は、キーストアを明示的に指定する必要があります。
検証するときはキーストアは必要ありません。ただし、キーストアが指定されているか、あるいはデフォルトのキーストアが存在していて、さらに
-verbose
オプションも指定されている場合は、JAR ファイルの検証に使われる証明書がキーストアに存在するかどうかについての追加情報が出力されます。注:
-keystore
の引数には、URL の代わりにファイル名 (とパス) を指定できます。ファイル名 (とパス) を指定した場合は、「file:」URL として扱われます。たとえば、次のように指定できます。-keystore filePathAndNameこれは、次の指定と同じものとして扱われます。-keystore file:filePathAndName
-storetype
storetype- インスタンスを生成するキーストアのタイプを指定します。デフォルトのキーストアのタイプは、セキュリティプロパティファイルで keystore.type プロパティの値として指定されたタイプで、
java.security.KeyStore
の staticgetDefaultType
メソッドによって返されます。
-storepass
password- キーストアにアクセスするのに必要なパスワードを指定します。このオプションが必要なのは、JAR ファイルに署名を付けるときだけです (JAR ファイルを検証するときは不要)。署名を付けるときに、コマンド行で
-storepass
オプションを指定しなかった場合は、パスワードの入力を求められます。注: テストを目的とする場合、または安全が保障されたシステムで実行する場合以外は、コマンド行やスクリプトでパスワードを指定しないでください。また、password プロンプトでパスワードを入力すると、入力したパスワードがエコーされ、そのまま画面に表示されます。このため、周囲にほかのユーザがいる場合は、パスワードを見られないように注意してください。
-keypass
password- コマンド行で指定された別名に対応するキーストアエントリの非公開鍵を保護するのに使うパスワードを指定します。jarsigner を使って JAR ファイルに署名を付けるときは、パスワードが必要です。コマンド行でパスワードが指定されておらず、必要なパスワードがストアのパスワードと異なる場合は、パスワードの入力を求められます。
注: テストを目的とする場合、または安全であることがわかっているシステムで実行する場合以外は、コマンド行やスクリプトでパスワードを指定しないでください。また、password プロンプトでパスワードを入力すると、入力したパスワードがエコーされ、そのまま画面に表示されます。このため、周囲にほかのユーザがいる場合は、パスワードを見られないように注意してください。
-sigfile
file- .SF ファイルと .DSA ファイルの生成に使うベースファイル名を指定します。たとえば、file に DUKESIGN を指定すると、生成される .SF ファイルと .DSA ファイルの名前は、それぞれ DUKESIGN.SF と DUKESIGN.DSA になります。これらのファイルは、署名付き JAR ファイルの META-INF ディレクトリに置かれます。
file に使用できる文字は「a-zA-Z0-9_-」です。つまり、文字、数字、下線、およびハイフンだけを使用できます。注: .SF および .DSA のファイル名では、小文字はすべて大文字に変換されます。
コマンド行で
-sigfile
オプションを指定しなかった場合、.SF ファイルと .DSA ファイルのベースファイル名は、コマンド行で指定された別名の先頭の 8 文字をすべて大文字に変換したものになります。別名が 8 文字未満の場合は、別名がそのまま使われます。別名の中に、署名ファイル名に使用できない文字が含まれている場合は、該当する文字を下線 (_) に置き換えてファイル名が作成されます。
-signedjar
file- 署名付き JAR ファイルの名前を指定します。
コマンド行で名前を指定しなかった場合は、入力 JAR ファイル (署名の対象となる JAR ファイル) の名前と同じ名前が使われます。この場合、入力 JAR ファイルは署名付き JAR ファイルによって上書きされます。
-verify
- コマンド行でこのオプションが指定されている場合は、指定された JAR ファイルが検証されます。JAR ファイルへの署名は行われません。検証が成功すると、「jar verified」というメッセージが表示されます。署名されていない JAR ファイル、またはサポートされていないアルゴリズム (RSA プロバイダがインストールされていない場合の RSA など) を使って署名された JAR ファイルを検証しようとすると、「jar is unsigned. (signatures missing or not parsable)」というメッセージが表示されます。
署名付き JAR ファイルは、jarsigner または JDK 1.1 の javakey ツール、あるいはその両方を使って検証できます。
検証についての詳細は、「JAR ファイルの検証」を参照してください。
-certs
- コマンド行で、
-verify
および-verbose
オプションとともにこのオプションが指定されている場合は、JAR ファイルの各署名者の証明書情報も出力されます。証明書情報には次のものが含まれます。
- 署名者の公開鍵を証明する (.DSA ファイルに格納された) 証明書の種類の名前
- 証明書が X.509 証明書 (具体的には
java.security.cert.X509Certificate
のインスタンス) である場合は、署名者の識別名キーストアの確認も行われます。コマンド行でキーストアの値が指定されていない場合、デフォルトのキーストアファイルがあれば、それが確認されます。署名者の公開鍵の証明書がキーストア内のエントリと一致した場合は、次の情報も表示されます。
- 署名者に該当するキーストアエントリの別名。この別名は括弧で囲まれます。ただし、キーストアではなく JDK 1.1 のアイデンティティデータベースに由来する署名者の場合は、括弧ではなく角括弧で囲まれます。
-verbose
- コマンド行でこのオプションが指定されている場合、jarsigner は「冗長」モードで動作し、JAR の署名または検証の進行状況に関する追加情報を出力します。
-internalsf
- 以前は、JAR ファイルの署名時に生成された .DSA (署名ブロック) ファイルの中に、生成された .SF ファイル (署名ファイル) の完全なコピーが符号化された形で含まれていました。この動作は変更になり、現在では、出力 JAR ファイル全体のサイズを小さくするために、デフォルトでは .SF ファイルが .DSA ファイルに含まれないようになっています。ただし、コマンド行で
-internalsf
オプションを指定すると、以前と同じように動作します。このオプションは、テストを行う場合には便利ですが、それ以外には使用しないでください。このオプションを使用すると、有益な最適化が行われなくなります。
-sectionsonly
- コマンド行でこのオプションが指定されている場合、JAR ファイルの署名時に生成される .SF ファイル (署名ファイル) には、マニフェストファイル全体のハッシュを含むヘッダは追加されません。この場合、.SF ファイルに含まれるのは、JAR ファイル内の各ソースファイルに関する情報およびハッシュだけです。詳細は、「署名 (.SF) ファイル」を参照してください。
デフォルトでは、最適化を行うために、マニフェストファイル全体のハッシュを含むヘッダが追加されます。ヘッダが存在する場合は、JAR ファイルの検証時に、まずヘッダ内のハッシュが、マニフェストファイル全体のハッシュと実際に一致するかどうかが確認されます。ハッシュが一致する場合、検証は次の手順に進みます。ハッシュが一致しない場合は、効率的には劣る方法を使って検証を行います。具体的には、.SF ファイル内の各ソースファイル情報セクションのハッシュが、マニフェストファイル内の対応するセクションのハッシュと一致するかどうかを確認します。
詳細は、「JAR ファイルの検証」を参照してください。
このオプションは、テストを行う場合には便利ですが、それ以外には使用しないでください。このオプションを使用すると、有益な最適化が行われなくなります。
-J
javaoption- 指定された javaoption 文字列を Java インタプリタに直接渡します。jarsigner は、実際には Java インタプリタに対する「ラッパー」です。このオプションには、空白を含めることはできません。このオプションは、実行環境またはメモリ使用を調整する場合に便利です。指定できるインタプリタオプションを一覧表示するには、コマンド行で
java -h
またはjava -X
と入力してください。
JAR ファイルの署名
bundle.jar という名前の JAR ファイルがあり、このファイルに、キーストアの別名が jane であるユーザの非公開鍵を使って、署名を付けるとします。キーストアは、mystore という名前で working ディレクトリにあり、キーストアのパスワードは mypass、jane の非公開鍵のパスワードは j638klm とします。この場合、次のコマンドを実行すると、JAR ファイルに署名を付けて sbundle.jar という署名付き JAR ファイルを作成できます。
jarsigner -keystore /working/mystore -storepass myspass -keypass j638klm -signedjar sbundle.jar bundle.jar jane上のコマンドでは
-sigfile
オプションが指定されていないので、署名付き JAR ファイルに格納される .SF ファイルと .DSA ファイルの名前は、別名に基づくデフォルトの名前になり、それぞれJANE.SF
とJANE.DSA
になります。ストアのパスワードと非公開鍵のパスワードをあとで入力する場合は、上のコマンドを短縮して次のように入力できます。
jarsigner -keystore /working/mystore -signedjar sbundle.jar bundle.jar janeデフォルトのキーストア (ホームディレクトリ内の .keystore という名前のキーストア) を使用する場合は、次に示すように、キーストアの指定を省略できます。jarsigner -signedjar sbundle.jar bundle.jar janeまた、署名付き JAR ファイルで入力 JAR ファイル (bundle.jar
) を上書きする場合は、-signedjar
オプションの指定も省略できます。jarsigner bundle.jar jane署名付き JAR ファイルの検証
次に示すのは、署名付き JAR ファイルを検証し、署名が有効で JAR ファイルが改変されていないことを確認するためのコマンド例です。jarsigner -verify sbundle.jar検証が成功すると、次のようなメッセージが表示されます。
jar verified.検証が成功しなかった場合は、エラーメッセージが表示されます。
-verbose
オプションを使うと、より多くの情報が表示されます。次に示すのは、-verbose
オプションを指定した jarsigner の実行例とその出力結果です。jarsigner -verify -verbose sbundle.jar 198 Fri Sep 26 16:14:06 PDT 1997 META-INF/MANIFEST.MF 199 Fri Sep 26 16:22:10 PDT 1997 META-INF/JANE.SF 1013 Fri Sep 26 16:22:10 PDT 1997 META-INF/JANE.DSA smk 2752 Fri Sep 26 16:12:30 PDT 1997 AclEx.class smk 849 Fri Sep 26 16:12:46 PDT 1997 test.class s = signature was verified m = entry is listed in manifest k = at least one certificate was found in keystore jar verified.証明書情報を使った検証
検証時に、-verify
と-verbose
オプションに加えて-certs
オプションを指定した場合は、JAR ファイル内の各署名者の証明書情報も出力されます。これには、証明書のタイプ、署名者の識別名情報 (X.509 証明書の場合)、および、JAR ファイルの公開鍵の証明書がキーストアエントリの公開鍵の証明書と一致する場合には、括弧で囲まれた署名者のキーストア別名が含まれます。たとえば、次のように出力されます。jarsigner -keystore /working/mystore -verify -verbose -certs myTest.jar 198 Fri Sep 26 16:14:06 PDT 1997 META-INF/MANIFEST.MF 199 Fri Sep 26 16:22:10 PDT 1997 META-INF/JANE.SF 1013 Fri Sep 26 16:22:10 PDT 1997 META-INF/JANE.DSA 208 Fri Sep 26 16:23:30 PDT 1997 META-INF/JAVATEST.SF 1087 Fri Sep 26 16:23:30 PDT 1997 META-INF/JAVATEST.DSA smk 2752 Fri Sep 26 16:12:30 PDT 1997 Tst.class X.509, CN=Test Group, OU=Java Software, O=Sun Microsystems, L=CUP, S=CA, C=US (javatest) X.509, CN=Jane Smith, OU=Java Software, O=Sun, L=cup, S=ca, C=us (jane) s = signature was verified m = entry is listed in manifest k = at least one certificate was found in keystore jar verified.署名者の証明書が X.509 証明書でない場合は、識別名情報は表示されず、証明書のタイプと別名だけが表示されます。たとえば、証明書が PGP 証明書で、別名が bob の場合は、次のように表示されます。PGP, (bob)アイデンティティデータベースの署名者を含む JAR ファイルの検証
JAR ファイルが、JDK 1.1 の javakey ツールを使って署名されている場合、署名者はアイデンティティデータベース内の別名です。この場合、検証の出力には i という記号が含まれます。JAR ファイルが、アイデンティティデータベース内の別名とキーストア内の別名の両方によって署名されている場合は、k と i の両方が表示されます。
-certs
オプションを指定した場合、キーストアの別名は括弧で囲まれるのに対し、アイデンティティデータベース内の別名は角括弧で囲まれて表示されます。たとえば、次のように表示されます。jarsigner -keystore /working/mystore -verify -verbose -certs writeFile.jar 198 Fri Sep 26 16:14:06 PDT 1997 META-INF/MANIFEST.MF 199 Fri Sep 26 16:22:10 PDT 1997 META-INF/JANE.SF 1013 Fri Sep 26 16:22:10 PDT 1997 META-INF/JANE.DSA 199 Fri Sep 27 12:22:30 PDT 1997 META-INF/DUKE.SF 1013 Fri Sep 27 12:22:30 PDT 1997 META-INF/DUKE.DSA smki 2752 Fri Sep 26 16:12:30 PDT 1997 writeFile.html X.509, CN=Jane Smith, OU=Java Software, O=Sun, L=cup, S=ca, C=us (jane) X.509, CN=Duke, OU=Java Software, O=Sun, L=cup, S=ca, C=us [duke] s = signature was verified m = entry is listed in manifest k = at least one certificate was found in keystore i = at least one certificate was found in identity scope jar verified.別名 duke は角括弧で囲まれているので、この別名はキーストアの別名ではなく、アイデンティティデータベースの別名です。
- jar ツールのドキュメント
- keytool ツールのドキュメント
- jarsigner ツールの使用法の例については、「Java チュートリアル」の「Security in JDK 1.2」