jarsigner - JAR 署名および検証ツール

Java ARchive (JAR) ファイルの署名を生成し、署名付き JAR ファイルの署名を検証します。

形式

jarsigner [ options ] jar-file alias
jarsigner -verify [ options ] jar-file 

説明

jarsigner ツールは、次の 2 つの目的で使用します。
  1. Java ARchive (JAR) ファイルに署名を付ける
  2. 署名付き JAR ファイルの署名と整合性を検証する

JAR 機能を使うと、クラスファイル、イメージ、サウンド、およびその他のデジタルデータを単一のファイルにパッケージ化できるので、ファイルを迅速かつ容易に配布できます。開発者は、jar という名前のツールを使って JAR ファイルを作成できます。技術的な観点から言えば、すべての ZIP ファイルも JAR ファイルとみなすことができます。 ただし、jar によって作成された JAR ファイル、または jarsigner によって処理された JAR ファイルには、META-INF/MANIFEST.MF ファイルが含まれています。

「デジタル署名」は、なんらかのデータ (「署名」の対象となるデータ) と、エンティティー (人、会社など) の非公開鍵とに基づいて計算されるビット列です。手書きの署名同様、デジタル署名には多くの利点があります。

ファイルに対してエンティティーの署名を生成するには、まず、エンティティーは、そのエンティティーに関連する公開鍵と非公開鍵のペアを持つ必要があります。また、公開鍵を認証する 1 つまたは複数の証明書も必要です。「証明書」とは、あるエンティティーが発行したデジタル署名付きの文書で、別なエンティティーの公開鍵が特定の値であることを証明しています。

jarsigner は、「キーストア」に含まれる鍵と証明書情報を使って、JAR ファイルのデジタル署名を生成します。キーストアは、非公開鍵と、非公開鍵に関連付けられた X.509 証明書チェーンが収められたデータベースです。キーストアの作成と管理には、keytool ユーティリティーを使います。

jarsigner は、エンティティーの非公開鍵を使って署名を生成します。署名付き JAR ファイルには、ファイルの署名に使用する非公開鍵に対応する公開鍵を保存するキーストアからとった証明書のコピーも含まれています。 jarsigner は、署名付き JAR ファイルのデジタル署名を、ファイル内 (の署名ブロックファイル) に含まれている証明書を使って検証することができます。

5.0 以降では、jarsigner はタイムスタンプを含む署名を生成するので、システムやデプロイヤ (Java Plug-in を含む) はJAR ファイルが署名証明書の有効期間中に署名されたかどうかをチェックできます。さらに、5.0 で追加された API を使用して、アプリケーションはタイムスタンプ情報を取得できます。

現時点では、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 ファイルが、Java 2 プラットフォームでどのように扱われるかを示しています。

JAR ファイルのタイプ

1.1 データベース内のアイデンティティー

1.1 データベースから Java 2 Platform キーストアにインポートされる信頼できるアイデンティティー (4)

ポリシーファイルがアイデンティティー/別名に特権を与える

与えられる特権

署名付き JAR

なし

なし

なし

すべてのコードに与えられるデフォルトの特権

署名のない JAR

なし

なし

なし

すべてのコードに与えられるデフォルトの特権

署名付き JAR

なし

あり

なし

すべてのコードに与えられるデフォルトの特権

署名付き JAR

あり/信頼できない

なし

なし

すべてのコードに与えられるデフォルトの特権 (3)

署名付き JAR

あり/信頼できない

なし

あり

すべてのコードに与えられるデフォルトの特権 (1,3)

署名付き JAR

なし

あり

あり

すべてのコードに与えられるデフォルトの特権とポリシーファイル内で与えられる特権

署名付き JAR

あり/信頼できる

あり

あり

すべてのコードに与えられるデフォルトの特権とポリシーファイル内で与えられる特権 (2)

署名付き JAR

あり/信頼できる

なし

なし

すべての特権

署名付き JAR

あり/信頼できる

あり

なし

すべての特権 (1)

署名付き JAR

あり/信頼できる

なし

あり

すべての特権 (1)

注 -

  1. ポリシーファイル内にアイデンティティー/別名についての言及がある場合、それをキーストアにインポートして、ポリシーファイルの設定が与えられた特権に反映されるようにする必要があります。
  2. ポリシーファイル/キーストアの組み合わせは、アイデンティティーデータベース内の信頼できるアイデンティティーよりも優先されます。
  3. Java 2 プラットフォームでは、信頼できないアイデンティティーは無視されます。
  4. Java 2 SDK キーストアにインポートできるのは、信頼できるアイデンティティーだけです。

キーストアの別名

キーストアのすべてのエントリは、一意の「別名」を介してアクセスされます。

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 がデフォルトでユーザーのホームディレクトリになっています。

-keystore オプションからの入力ストリームは、KeyStore.load メソッドに渡されます。URL として NONE が指定されている場合は、null のストリームが KeyStore.load メソッドに渡されます。NONE は、KeyStore がファイルベースではなく、たとえば、ハードウェアトークンデバイスに置かれている場合に指定します。

キーストアの実装

java.security パッケージで提供される KeyStore クラスには、キーストア内の情報に対するアクセスと変更を行うための明確に定義されたインタフェースが用意されています。キーストアの固定実装としては、それぞれが特定の「タイプ」のキーストアを対象とする複数の異なる実装が存在可能です。

現在、キーストアの実装を使用するものとして、keytooljarsigner の 2 つのコマンド行ツールと、Policy Tool という名前の 1 つの GUI ベースのツールがあります。KeyStore は public として使用可能なので、Java 2 SDK ユーザーは KeyStore を使ったほかのセキュリティーアプリケーションも作成できます。

キーストアには、Sun が提供する組み込みのデフォルトの実装があります。これは、JKS という名前の独自のキーストアタイプ (形式) を利用するもので、キーストアをファイルとして実装しています。この実装では、個々の非公開鍵は個別のパスワードによって保護され、キーストア全体の整合性も (非公開鍵とは別の) パスワードによって保護されます。

キーストアの実装は、プロバイダベースです。具体的には、KeyStore が提供するアプリケーションインタフェースは、Service Provider Interface (SPI) という形で実装されています。つまり、対応する KeystoreSpi 抽象クラス (これも java.security パッケージに含まれている) があり、このクラスが Service Provider Interface のメソッドを定義しています。これらのメソッドは、「プロバイダ」が実装しなければなりません。ここで、「プロバイダ」とは、Java Security API によってアクセス可能なサービスのサブセットに対し、その固定実装を提供するパッケージまたはパッケージの集合のことです。したがって、キーストアの実装を提供するには、「Java 暗号化アーキテクチャー用プロバイダの実装方法」で説明しているように、クライアントが「プロバイダ」を実装し、KeystoreSpi サブクラスの実装を提供する必要があります。

アプリケーションでは、KeyStore クラスが提供する getInstance ファクトリメソッドを使うことで、さまざまなプロバイダから異なる「タイプ」のキーストアの実装を選択できます。キーストアのタイプは、キーストア情報の格納形式とデータ形式を定義するとともに、キーストア内の非公開鍵とキーストア自体の整合性を保護するために使われるアルゴリズムを定義します。異なるタイプのキーストアの実装には、互換性はありません。

keytool は、任意のファイルベースのキーストア実装で動作します。keytool は、コマンド行から渡されたキーストアの場所をファイル名として扱い、これを FileInputStream に変換して、FileInputStream からキーストアの情報をロードします。一方、jarsigner ツールと policytool ツールは、URL で指定可能な任意の場所からキーストアを読み込むことができます。

jarsignerkeytool の場合、-storetype オプションを使ってコマンド行でキーストアのタイプを指定できます。Policy Tool の場合は、「Edit」メニューの「Change Keystore」コマンドを使ってキーストアのタイプを指定できます。

キーストアのタイプを明示的に指定しない場合、keytooljarsigner、および policytool の各ツールは、セキュリティープロパティーファイル内で指定された keystore.type プロパティーの値に基づいてキーストアの実装を選択します。セキュリティープロパティーファイルは、java.security という名前で SDK セキュリティープロパティーディレクトリ java.home/lib/security に置かれています。java.home は、実行環境のディレクトリ (SDK の jre ディレクトリまたは Java 2 Runtime Environment の最上位のディレクトリ) です。

各ツールは、keystore.type の値を取得し、この値で指定されたタイプのキーストアを実装しているプロバイダが見つかるまで、現在インストールされているすべてのプロバイダを調べます。目的のプロバイダが見つかると、そのプロバイダからのキーストアの実装を使います。

KeyStore クラスでは getDefaultType という名前の static メソッドが定義されており、アプリケーションとアプレットはこのメソッドを使うことで keystore.type プロパティーの値を取得できます。次のコードは、デフォルトのキーストアタイプ (keystore.type プロパティーで指定されたタイプ) のインスタンスを生成します。

    KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());

デフォルトのキーストアタイプは JKS (Sun が提供する独自のタイプのキーストアの実装) です。これは、セキュリティープロパティーファイル内の次の行によって指定されています。

    keystore.type=jks

注: キーストアのタイプの指定では、大文字と小文字は区別されません。たとえば、JKS と jks は同じものとして扱われます。

各ツールでデフォルト以外のキーストアの実装を使用するには、上の行を変更して別のキーストアのタイプを指定します。たとえば、pkcs12 と呼ばれるタイプのキーストアの実装を提供しているプロバイダパッケージを使用するには、上の行を次のように変更します。

    keystore.type=pkcs12

PKCS#11 プロバイダパッケージを使用する場合、その詳細については、「Java PKCS#11 Reference Guide」にある「KeyTool and JarSigner」節を参照してください。

サポートされるアルゴリズム

デフォルトでは、jarsigner は次のどちらかのアルゴリズムを使って JAR ファイルに署名します。

具体的には、署名者の公開鍵と非公開鍵が DSA 鍵である場合、jarsigner は SHA1withDSA アルゴリズムを使って JAR ファイルに署名を付けます。署名者の鍵が RSA 鍵である場合、jarsigner は MD5withRSA アルゴリズムを使って JAR ファイルに署名を付けます。

これらのデフォルトの署名アルゴリズムは、-sigalg オプションを使ってオーバーライドできます。

署名付き JAR ファイル

jarsigner を使って JAR ファイルに署名を付けた場合、出力される署名付き JAR ファイルは入力 JAR ファイルと同じですが、次の 2 つの追加ファイルが META-INF ディレクトリに置かれる点が異なります。

これら 2 つのファイルのベースファイル名は、-sigFile オプションの値から作成されます。たとえば、次のようにオプションを指定したとします。
  -sigFile MKSIGN
この場合、ファイル名はそれぞれ MKSIGN.SF と MKSIGN.DSA になります。

コマンド行で -sigfile オプションを指定しなかった場合、.SF ファイルと .DSA ファイルのベースファイル名は、コマンド行で指定された別名の先頭の 8 文字をすべて大文字に変換したものになります。別名が 8 文字未満の場合は、別名がそのまま使われます。別名の中に、署名ファイル名に使用できない文字が含まれている場合は、該当する文字を下線 (_) に置き換えてファイル名が作成されます。使用できる文字は、アルファベット、数字、下線 (_)、ハイフンです。

署名 (.SF) ファイル

署名ファイル (.SF ファイル) は、jarsigner で署名を付けた JAR ファイルに常に含まれるマニフェストファイルと似ています。つまり、マニフェストファイル同様、.SF ファイルには、JAR ファイルに含まれているソースファイルごとに、次の 3 つの行があります。
  • ファイル名
  • 使われているダイジェストアルゴリズム (SHA) の名前
  • SHA ダイジェストの値
マニフェストファイルでは、SHA ダイジェストの値は、ソースファイルのバイナリデータのダイジェスト (ハッシュ) です。一方、.SF ファイルでは、ソースファイルのダイジェストの値は、マニフェストファイル中の該当するソースファイルに対応する 3 行のハッシュです。

署名ファイルには、デフォルトでマニフェストファイル全体のハッシュも含まれています。後述の「JAR ファイルの検証」で説明するように、このヘッダーの存在によって検証の最適化が可能になっています。

署名ブロック (.DSA) ファイル

.SF ファイルには署名が付けられ、署名は .DSA ファイルに置かれます。.DSA ファイルには、キーストアからの証明書または証明書チェーンも符号化された形で含まれています。 証明書または証明書チェーンは、署名に使われた非公開鍵に対応する公開鍵を認証します。

署名タイムスタンプ

J2SE 5.0 リリースの jarsigner ツールは、JAR ファイルの署名時に署名タイムスタンプを生成および格納できるようになりました。さらに、jarsigner は代替署名機構をサポートします。この動作は省略可能で、署名時に次の各オプションによって制御されます。 これらの各オプションの詳細については、後述の「オプション」節を参照してください。

JAR ファイルの検証

JAR ファイルの検証が成功するのは、署名が有効であり、かつ署名の生成以後に JAR ファイル内のどのファイルも変更されていない場合です。JAR ファイルの検証は、次の手順で行われます。

  1. .SF ファイルそれ自体の署名を検証します。

    この手順では、各署名ブロック (.DSA) ファイルに格納されている署名が、実際に、公開鍵に対応する非公開鍵を使って生成されたものであることを確認します。 .DSA ファイルには、公開鍵の証明書 (または証明書チェーン) も含まれています。また、この手順では、目的の署名が、対応する署名 (.SF) ファイル内の有効な署名であるかどうかを調べ、.SF ファイルが改変されていないことも確認します。

  2. .SF ファイル内の各エントリのダイジェストをマニフェスト内の対応する各セクションと突き合わせて検証します。

    .SF ファイルには、マニフェストファイル全体のハッシュが格納されたヘッダーがデフォルトで含まれています。このヘッダーが存在する場合は、ヘッダー内のハッシュが実際にマニフェストファイルのハッシュと一致するかどうかを検証することができます。ハッシュが一致する場合は、次の手順に進みます。

    ハッシュが一致しない場合は、効率的には劣る方法を使って検証を行います。具体的には、.SF ファイル内の各ソースファイル情報セクションのハッシュが、マニフェストファイル内の対応するセクションのハッシュと一致するかどうかを確認します (「署名 (.SF) ファイル」を参照)。

    .SF ファイルのヘッダーに格納されたマニフェストファイルのハッシュと、実際のマニフェストファイルのハッシュとが一致しない場合は、署名 (および .SF ファイル) の生成後に、JAR ファイルに 1 つ以上のファイルが追加 (jar ツールを使用) された可能性があります。jar ツールを使ってファイルを追加した場合、マニフェストファイルは変更されますが (新しいファイル用のセクションが追加される)、.SF ファイルは変更されません。この場合、.SF ファイルのヘッダー以外のセクションに格納されたハッシュが、マニフェストファイル内の対応するセクションのハッシュと一致するときは、署名の生成時に JAR ファイル内に存在していたファイルのうち、どのファイルも変更されていないことになり、検証は成功したものとして扱われます。

  3. JAR ファイル内のファイルのうち、.SF ファイル内にエントリを持つ各ファイルを読み込みます。読み込み中にファイルのダイジェストを計算し、結果をマニフェストセクション内の該当するファイルのダイジェストと比較します。2 つのダイジェストは同じでなければならず、そうでない場合は検証が失敗します。

検証プロセスの途中でなんらかの重大な検証エラーが発生した場合、検証プロセスは中止され、セキュリティー例外がスローされます。スローされたセキュリティー例外は、jarsigner がキャッチして表示します。

1 つの JAR ファイルを対象とする複数の署名

1 つの JAR ファイルに対して jarsigner ツールを複数回実行し、実行のたびに、異なるユーザーの別名を指定すれば、JAR ファイルに複数のユーザーの署名を付けることができます。
  jarsigner myBundle.jar susan
  jarsigner myBundle.jar kevin
JAR ファイルが複数回署名されている場合、その 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 url
キーストアの場所を示す URL を指定します。デフォルトは、ユーザーのホームディレクトリ内のファイル .keystore です。 ユーザーのホームディレクトリは、user.home システムプロパティーによって決まります。

署名するときはキーストアが必要です。 このため、デフォルトのキーストアが存在しない場合、あるいはデフォルト以外のほかのキーストアを使用する場合は、キーストアを明示的に指定する必要があります。

検証するときはキーストアは必要ありません。 ただし、キーストアが指定されているか、あるいはデフォルトのキーストアが存在していて、さらに -verbose オプションも指定されている場合は、JAR ファイルの検証に使われる証明書がキーストアに存在するかどうかについての追加情報が出力されます。

注:-keystore の引数には、URL の代わりにファイル名 (とパス) を指定できます。ファイル名 (とパス) を指定した場合は、「file:」URL として扱われます。たとえば、次のように指定できます。

  -keystore filePathAndName
これは、次の指定と同じものとして扱われます。
  -keystore file:filePathAndName
JRE の $JAVA_HOME/lib/security ディレクトリに格納された java.security セキュリティープロパティーファイル内で Sun PKCS#11 プロバイダが設定されている場合、keytool と jarsigner は PKCS#11 トークンに基づいて動作できます。次のオプションを指定します。
  • -keystore NONE
  • -storetype PKCS11
たとえば、次のコマンドは、設定された PKCS#11 トークンの内容を一覧表示します。
   jarsigner -keystore NONE -storetype PKCS11 -list
  
-storetype storetype
インスタンスを生成するキーストアのタイプを指定します。デフォルトのキーストアタイプは、セキュリティープロパティーファイル内の keystore.type プロパティーの値で指定されたタイプです。この値は、java.security.KeyStore の static getDefaultType メソッドで取得できます。

-storepass オプションを使って PCKS#11 トークンの PIN を指定することもできます。何も指定しなかった場合、keytool と jarsigner はユーザーにトークン PIN の 入力を求めます。トークンに保護された認証パス (専用の PIN パッドや生体読み取り機など) がある場合、-protected オプションを指定する必要がありますが、パスワードオプションを指定する必要はありません。

-storepass password
キーストアにアクセスするのに必要なパスワードを指定します。このオプションが必要なのは、JAR ファイルに署名を付けるときだけです (JAR ファイルを検証するときは不要)。署名を付けるときに、コマンド行で -storepass オプションを指定しなかった場合は、パスワードの入力を求められます。

注: テストを目的とする場合、または安全であることがわかっているシステムで実行する場合以外は、コマンド行やスクリプトでパスワードを指定しないでください。

-keypass password
コマンド行で指定された別名に対応するキーストアエントリの非公開鍵を保護するのに使うパスワードを指定します。jarsigner を使って JAR ファイルに署名を付けるときは、パスワードが必要です。コマンド行でパスワードが指定されておらず、必要なパスワードがストアのパスワードと異なる場合は、パスワードの入力を求められます。

注: テストを目的とする場合、または安全であることがわかっているシステムで実行する場合以外は、コマンド行やスクリプトでパスワードを指定しないでください。

-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 文字未満の場合は、別名がそのまま使われます。別名の中に、署名ファイル名に使用できない文字が含まれている場合は、該当する文字を下線 (_) に置き換えてファイル名が作成されます。

-sigalg algorithm
JAR ファイルの署名に使用する署名アルゴリズムの名前を指定します。

標準署名アルゴリズム名の一覧については、「Java Cryptography Architecture」にある 「Appendix A 」を参照してください。このアルゴリズムは、JAR ファイルの署名に使用する秘密鍵と互換性のあるものでなければなりません。このオプションを指定しなかった場合、秘密鍵のタイプに応じて SHA1withDSA、MD5withRSA のいずれかが使用されます。指定されたアルゴリズムの実装を提供するプロバイダが静的にインストールされているか、あるいはユーザーがそのようなプロバイダを -providerClass オプションを使って指定する必要があります。そうでない場合、コマンドの実行が失敗します。

-digestalg algorithm
JAR ファイルのエントリをダイジェストする際に使用するメッセージダイジェストアルゴリズムの名前を指定します。

標準メッセージダイジェストアルゴリズム名の一覧については、「Java Cryptography Architecture」にある 「Appendix A 」を参照してください。このオプションを指定しなかった場合、SHA-1 が使用されます。指定されたアルゴリズムの実装を提供するプロバイダが静的にインストールされているか、あるいはユーザーがそのようなプロバイダを -providerClass オプションを使って指定する必要があります。そうでない場合、コマンドの実行が失敗します。

-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 ファイルの検証」を参照してください。

このオプションは、テストを行う場合には便利ですが、それ以外には使用しないでください。 このオプションを使用すると、有益な最適化が行われなくなります。

-provider provider-class-name
サービスプロバイダがセキュリティープロパティーファイル (java.security) のリストに入っていないときに、暗号化サービスプロバイダのマスタークラスファイルの名前を指定します。

-providerArg ConfigFilePath オプションと組み合わせて使用します。keytool と jarsigner はプロバイダを動的にインストールします (ここで、ConfigFilePath はトークン設定ファイルへのパスです)。セキュリティープロパティーファイル内で Sun PKCS#11 プロバイダが設定されていない場合に PKCS#11 キーストアを一覧表示するコマンドの例を次に示します。

jarsigner -keystore NONE -storetype PKCS11 \
          -providerClass sun.security.pkcs11.SunPKCS11 \
          -providerArg /foo/bar/token.config \
          -list
-providerName providerName
java.security セキュリティープロパティーファイル内で 2 つ以上のプロバイダが設定されている場合、-providerName オプションを使って特定のプロバイダインスタンスを選択できます。このオプションの引数は、プロバイダの名前です。

Sun PKCS#11 プロバイダの場合、providerNameSunPKCS11-TokenName という形式になります。 ここで「TokenName」は、プロバイダインスタンスが構成された名前の接尾辞です。 詳細は構成属性の表を参照してください。たとえば、以下のコマンドでは、名前接尾辞 SmartCard の PKCS#11 キーストアプロバイダインスタンスの内容をリストします。

jarsigner -keystore NONE -storetype PKCS11 \
        -providerName SunPKCS11-SmartCard \
        -list
-Jjavaoption
指定された javaoption 文字列を Java インタプリタに直接渡します。(jarsigner は、実際には Java インタプリタに対する「ラッパー」です。このオプションには、空白を含めることはできません。このオプションは、実行環境またはメモリー使用を調整する場合に便利です。指定できるインタプリタオプションを一覧表示するには、コマンド行で java -h または java -X と入力してください。

-tsa url
JAR ファイルの署名時にコマンド行に「-tsa http://example.tsa.url」が表示される場合、署名のタイムスタンプが生成されます。URL http://example.tsa.url は、TSA (Time Stamping Authority) の場所を特定します。これは、-tsacert オプションで検出された URL をオーバーライドします。-tsa オプションでは、TSA の公開鍵証明書をキーストアに配置する必要はありません。

タイムスタンプを生成するため、jarsignerRFC 3161 で定義されている TSP (Time-Stamp Protocol) を使用して TSA と通信します。成功すると、TSA から返されたタイムスタンプトークンは署名ブロックファイルの署名とともに保存されます。

-tsacert alias
JAR ファイルの署名時にコマンド行に「-tsacert alias」が表示される場合、署名のタイムスタンプが生成されます。alias は、キーストア内の現在有効な TSA の公開鍵証明書を特定します。エントリの証明書で、TSA の場所を特定する URL を含む Subject Information Access 拡張機能が確認されます。

TSA の公開鍵証明書は、-tsacert を使った場合、キーストアに配置されている必要があります。

-altsigner class
代替署名機構を使用することを指定します。完全修飾クラス名は、com.sun.jarsigner.ContentSigner の abstract クラスを拡張するクラスファイルを特定します。このクラスファイルへのパスは、-altsignerpath オプションによって定義されます。-altsigner オプションを使用した場合、jarsigner は指定されたクラスが提供する署名機構を使用します。または、jarsigner はデフォルトの署名機構を使用します。

たとえば、com.sun.sun.jarsigner.AuthSigner というクラスが提供する署名機構を使用するには、jarsigner オプション「-altsigner com.sun.jarsigner.AuthSigner」を使用します。

-altsignerpath classpathlist
クラスファイル (クラスファイル名は上記のように -altsigner オプションで指定される) およびそれが依存する JAR ファイルへのパスを指定します。クラスファイルが JAR ファイル内にある場合、以下の例のように JAR ファイルへのパスが指定されます。

絶対パスまたは現在のディレクトリからの相対パスを指定できます。classpathlist には、複数のパスまたは JAR ファイルを含めることができます。 その場合、各パスまたは JAR ファイルを、Solaris の場合にはコロン (:)、Windows の場合にはセミコロン (;) で区切ります。目的のクラスがすでに検索パス内にある場合は、このオプションは不要です。

クラスファイルを含む、JAR ファイルへのパスを指定する例を示します。

-altsignerpath /home/user/lib/authsigner.jar
JAR ファイル名が含まれていることに注意してください。

クラスファイルを含む JAR ファイルへのパスを指定する例を示します。

-altsignerpath /home/user/classes/com/sun/tools/jarsigner/
JAR ファイル名は含まれていないことに留意してください。

JAR ファイルの署名

bundle.jar という名前の JAR ファイルがあるとします。このファイルに、キーストアの別名が jane であるユーザーの非公開鍵を使って、署名を付けるとします。キーストアは、mystore という名前で、C ドライブの 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.SFJANE.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 は角括弧で囲まれているので、この別名はキーストアの別名ではなく、アイデンティティーデータベースの別名です。

関連項目


Copyright © 2002-2006 Sun Microsystems, Inc. All Rights Reserved.

Sun
Java Software