jarsigner(1)

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

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

形式

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

jarsigner の -verify コマンドでは、JAR ファイル名のあとに 0 個以上のキーストア別名を指定できます。キーストア別名が指定された場合、jarsigner は、JAR ファイル内の各署名付きエンティティーの検証に使用される証明書がキーストア別名のいずれかに一致することをチェックします。別名は、-keystore で指定されたキーストア内またはデフォルトのキーストア内に定義されます。

説明

jarsigner ツールは、次の 2 つの目的で使用します。

    1.  Java ARchive (JAR) ファイルに署名を付ける

    2.  署名付き JAR ファイルの署名と整合性を検証する

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

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

    o   署名の生成に使われた非公開鍵と対になる公開鍵を使って計算を行うことで、デジタル署名が本物かどうかを検証できる

    o   非公開鍵が他人に知られない限り、デジタル署名の偽造は不可能である

    o   デジタル署名は、その署名が付いたデータだけを対象とするものであり、ほかのデータの署名として機能することはない

    o   署名付きのデータは変更できない。 データが変更された場合は、その署名によってデータが本物ではないことが検証される

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

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

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

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

現時点では、jarsigner で署名できるのは、JDK の jar(1) ツールで作成された JAR ファイル、または ZIP ファイルだけです。JAR ファイルは ZIP ファイルと同じですが、JAR ファイルには META-INF/MANIFEST.MF ファイルが含まれている点が異なります。META-INF/MANIFEST.MF ファイルは、jarsigner が ZIP ファイルに署名を付けるときに自動的に作成されます。

デフォルトでは、jarsigner は JAR (または ZIP) ファイルに「署名」を付けます。署名付き JAR ファイルを「検証」する場合は、 -verify オプションを指定します。

  キーストアの別名

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

jarsigner を使って JAR ファイルに署名を付けるときは、署名の生成に必要な非公開鍵を含むキーストアエントリの別名を指定する必要があります。たとえば、次の例は、working ディレクトリの mystore という名前のキーストアに含まれる別名 duke に関連付けられた非公開鍵を使って、MyJARFile.jar という名前の JAR ファイルに署名を付けます。出力ファイルは指定されていないので、MyJARFile.jar は署名付きの JAR ファイルによって上書きされます。

    jarsigner -keystore /working/mystore -storepass <キーストアのパスワード>
      -keypass <非公開鍵のパスワード> MyJARFile.jar duke

キーストアはパスワードで保護されているので、ストアのパスワードを指定する必要があります。コマンド行でストアのパスワードを指定しないと、パスワードの入力を求められます。同様に、非公開鍵もキーストア内でパスワードによって保護されているため、非公開鍵のパスワードを指定する必要があります。コマンド行で非公開鍵のパスワードを指定していない、また、指定したパスワートが保存されているパスワードと違っている場合には、非公開鍵のパスワードの入力を求められます。

  キーストアの場所

jarsigner には、 使用するキーストアの URL を指定する -keystore があります。キーストア は デフォルトで、 user.home システムプロパティーで決まるユーザーのホームディレクトリの .keystore という名前のファイル内に格納されます。Solaris システムの場合、 user.home のデフォルトはユーザーの home ディレクトリになります。

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

  キーストアの実装

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

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

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

キーストアの実装は、プロバイダベースです。具体的には、 KeyStore によって提供されるアプリケーションインタフェースが「サービスプロバイダインタフェース」 (SPI) に基づいて実装されます。つまり、対応する抽象クラス KeystoreSpi が同じ java.security パッケージ内に存在しており、このクラスによって、「プロバイダ」が実装する必要のあるサービスプロバイダインタフェースメソッドが定義されています。ここで、「プロバイダ」とは、Java Security API によってアクセス可能なサービスのサブセットに対し、その固定実装を提供するパッケージまたはパッケージの集合のことです。したがって、キーストアの実装を提供するには、 「Java 暗号化アーキテクチャー用プロバイダの実装方法」 @
http://java.sun.com/javase/6/docs/technotes/guides/security/crypto/HowToImplAProvider.htmlで説明しているように、クライアントが「プロバイダ」を実装し、KeystoreSpi サブクラスの実装を提供する必要があります。

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

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

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

ユーザーがキーストアのタイプを明示的に指定しなかった場合、ツールは、単純にセキュリティープロパティーファイルで指定された keystore.type プロパティーの値に基づいて、キーストアの実装を選択します。このセキュリティープロパティーファイルは java.security と呼ばれ、SDK セキュリティープロパティーディレクトリ java.home/lib/security 内に存在しています。ここで、java.home は実行時環境のディレクトリ (SDK の jre ディレクトリまたは Java 2 Runtime Environment のトップレベルディレクトリ) です。

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

KeyStore クラスに定義されている static メソッド getDefaultType を使用すると、アプリケーションやアプレットから 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」 @
http://java.sun.com/javase/6/docs/technotes/guides/security/p11guide.html#KeyToolJarSigner節を参照してください。

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

jarsigner はデフォルトで、次のいずれかを使用して JAR ファイルに署名します。

    o   SHA1 ダイジェストアルゴリズムを使った DSA (デジタル署名アルゴリズム)

    o   SHA256 ダイジェストアルゴリズムを使用した RSA アルゴリズム

    o   SHA256 と ECDSA (楕円曲線デジタル署名アルゴリズム) を使用した EC (楕円曲線) 暗号方式アルゴリズム

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

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

  署名付き JAR ファイル

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

    o

    o

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

-sigFile MKSIGN

この場合、ファイル名はそれぞれ MKSIGN.SF と MKSIGN.DSA になります。

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

署名 (.SF) ファイル

署名ファイル (.SF ファイル) は、jarsigner で署名を付けた JAR ファイルに常に含まれるマニフェストファイルと似ています。つまり、マニフェストファイル同様、.SF ファイルには、JAR ファイルに含まれているソースファイルごとに、次の 3 つの行があります。

    o   ファイル名

    o   使われているダイジェストアルゴリズム (SHA) の名前

    o   SHA ダイジェストの値

マニフェストファイルでは、SHA ダイジェストの値は、ソースファイルのバイナリデータのダイジェスト (ハッシュ) です。一方、.SF ファイルでは、ソースファイルのダイジェストの値は、マニフェストファイル中の該当するソースファイルに対応する 3 行のハッシュです。

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

署名ブロックファイル

  署名タイムスタンプ

jarsigner ツールは、JAR ファイルの署名時に署名タイムスタンプを生成して保存できます。さらに、 jarsigner は代替署名機構をサポートします。この動作は省略可能で、署名時に次の各オプションによって制御されます。

    o   -tsa url

    o   -tsacert alias

    o   -altsigner class

    o   -altsignerpath classpathlist

これらの各オプションの詳細については、後述の「オプション」節を参照してください。

  JAR ファイルの検証

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

    1.

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

    2.

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

    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 のオプションについて説明します。注:

    o   どのオプション名にも先頭にマイナス記号 (-) が付く

    o   オプションは任意の順序で指定できる

    o   イタリック体の項目の実際の値 (オプションの値) は、ユーザーが指定する必要がある

    o   -keystore、 -storepass、 -keypass、 -sigfile、 -sigalg、 -digestalg、および -signedjar オプションを使用できるのは、署名付き JAR ファイルを検証する場合ではなく、JAR ファイルに署名する場合だけです。同様に、別名をコマンド行で指定するのは、JAR ファイルに署名を付ける場合だけである

    -keystore url
        キーストアの場所を示す URL を指定します。デフォルトは、ユーザーのホームディレクトリ内のファイル .keystore です。 ユーザーのホームディレクトリは、user.home システムプロパティーによって決まります。

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

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

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

      -keystore filePathAndName

    これは、次の指定と同じものとして扱われます。

      -keystore file:filePathAndName

    JRE の $JAVA_HOME/lib/security ディレクトリに格納された java.security セキュリティープロパティーファイル内で Sun PKCS#11 プロバイダが設定されている場合、keytool と jarsigner は PKCS#11 トークンに基づいて動作できます。次のオプションを指定します。

        o   -keystore NONE

        o   -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[:env | :file] argument

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

    修飾子 env または file が指定されていない場合、パスワードの値は argument になります。それ以外の場合、パスワードは次のようにして取得されます。

        o   env: argument という名前の環境変数からパスワードを取得する

        o   file: argument という名前のファイルからパスワードを取得する

    注: テストを目的とする場合、またはセキュリティー保護されたシステムを使用している場合以外は、コマンド行やスクリプトでパスワードを指定しないでください。

    -keypass[:env | :file] argument

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

    修飾子 env または file が指定されていない場合、パスワードの値は argument になります。それ以外の場合、パスワードは次のようにして取得されます。

        o   env: argument という名前の環境変数からパスワードを取得する

        o   file: argument という名前のファイルからパスワードを取得する

    注: テストを目的とする場合、またはセキュリティー保護されたシステムを使用している場合以外は、コマンド行やスクリプトでパスワードを指定しないでください。

    -sigfile file

    file に使用できる文字は「a-zA-Z0-9_-」です。つまり、文字、数字、下線、およびハイフンだけを使用できます。注: .SF および .DSA のファイル名では、小文字はすべて大文字に変換されます。

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

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

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

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

    標準メッセージダイジェストアルゴリズム名の一覧については、「Java Cryptography Architecture」にある 「Appendix A 」 @
    http://java.sun.com/javase/6/docs/technotes/guides/security/crypto/CryptoSpec.html#AppAを参照してください。このオプションを指定しなかった場合、SHA256 が使用されます。指定されたアルゴリズムの実装を提供するプロバイダが静的にインストールされているか、あるいはユーザーがそのようなプロバイダを -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 ファイルの各署名者の証明書情報が出力に含まれます。証明書情報には次のものが含まれます。

        o   署名者の公開鍵を証明する (.DSA ファイルに格納された) 証明書の種類の名前

        o   証明書が X. 証明書 (つまり、 java.security.cert.X509Certificate のインスタンス) である場合は、署名者の識別名

    キーストアの確認も行われます。コマンド行でキーストアの値が指定されていない場合、デフォルトのキーストアファイルがあれば、検査されます。署名者の公開鍵の証明書がキーストア内のエントリと一致した場合は、次の情報も表示されます。

        o   署名者に該当するキーストアエントリの別名。この別名は括弧で囲まれます。 ただし、キーストアではなく JDK 1.1 のアイデンティティーデータベースに由来する署名者の場合は、括弧ではなく大括弧で囲まれます。

    -certchain file
        コマンド行で指定した別名で決まるキーストアエントリの非公開鍵に関連付けられた証明書チェーンが完全でない場合に、使用すべき証明書チェーンを指定します。そのような状態になる可能性があるのは、キーストアがハードウェアトークン上に格納されているが、そこには証明書チェーンの全体を保持できるだけの領域が存在していないような場合です。このファイルは一連の X.509 証明書が順に連結されたもの、PKCS#7 形式の単一データブロックのいずれかとなり、そのエンコーディング形式はバイナリエンコーディング形式、Internet RFC 1421 標準で規定される印刷可能エンコーディング形式 (BASE64 エンコーディングとも呼ばれる) のいずれかになります。

    -verbose
        コマンド行でこのオプションが指定されている場合、jarsigner は「冗長」モードで動作し、JAR の署名または検証の進行状況に関する追加情報を出力します。

    -internalsf
        以前は、JAR ファイルの署名時に生成された .DSA (署名ブロック) ファイルの中に、生成された .SF ファイル (署名ファイル) の完全なコピーが符号化された形で含まれていました。この動作は変更されました。この動作は変更になり、現在では、出力 JAR ファイル全体のサイズを小さくするために、デフォルトでは .SF ファイルが .DSA ファイルに含まれないようになっています。ただし、 -internalsf オプションをコマンド行で指定すると、以前と同じように動作します。このオプションは、テストを行う場合には便利ですが、それ以外には使用しないでください。 このオプションを使用すると、有益な最適化が行われなくなります。

    -sectionsonly
        コマンド行でこのオプションが指定されている場合、JAR ファイルの署名時に生成される .SF ファイル (署名ファイル) には、マニフェストファイル全体のハッシュを含むヘッダーは追加されません。この場合、.SF ファイルに含まれるのは、JAR ファイル内の各ソースファイルに関する情報およびハッシュだけです。詳細は、「署名 (.SF) ファイル」を参照してください。

    デフォルトでは、最適化を行うために、マニフェストファイル全体のハッシュを含むヘッダーが追加されます。ヘッダーが存在する場合は、JAR ファイルの検証時に、まずヘッダー内のハッシュが、マニフェストファイル全体のハッシュと実際に一致するかどうかが確認されます。ハッシュが一致する場合、検証は次の手順に進みます。ハッシュが一致しない場合は、効率的には劣る方法を使って検証を行います。 具体的には、.SF ファイル内の各ソースファイル情報セクションのハッシュが、マニフェストファイル内の対応するセクションのハッシュと一致するかどうかを確認します。

    詳細は、「JAR ファイルの検証」を参照してください。

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

    -protected
        true または false。専用 PIN リーダーなどの保護された認証パスを介してパスワードを指定する必要がある場合には、この値を true に指定してください。

    -providerClass 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 プロバイダの場合、providerName は SunPKCS11-TokenName という形式になります。 ここで「TokenName」は、プロバイダインスタンスが構成された名前の接尾辞です。 詳細は 構成属性の表 @
    http://java.sun.com/javase/6/docs/technotes/guides/security/p11guide.html#ATTRSを参照してください。たとえば、以下のコマンドでは、名前接尾辞 SmartCard の PKCS#11 キーストアプロバイダインスタンスの内容をリストします。

    jarsigner -keystore NONE -storetype PKCS11 \
            -providerName SunPKCS11-SmartCard \
            -list

    できますjavaoption
        指定された javaoption 文字列を Java インタプリタに直接渡します。jarsigner は、実際には Java インタプリタに対する「ラッパー」です。このオプションには、空白を含めることはできません。このオプションは、実行環境またはメモリー使用を調整する場合に便利です。使用可能なインタプリタオプションの一覧を表示するには、 java -h または java -X とコマンド行から入力します。

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

    タイムスタンプを生成するために、 jarsigner は、 RFC 3161 @
    http://www.ietf.org/rfc/rfc3161.txt で定義されている タイムスタンププロトコル (TSP) を使用して TSA と通信します。成功すると、TSA から返されたタイムスタンプトークンは署名ブロックファイルの署名とともに保存されます。

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

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

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

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

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

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

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

    -altsignerpath /home/user/lib/authsigner.jar

    JAR ファイル名が含まれていることに注意してください。

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

    -altsignerpath /home/user/classes/com/sun/tools/jarsigner/

    JAR ファイル名は含まれていないことに留意してください。

    -strict
        署名または検証処理中に、何らかの警告メッセージが表示される場合があります。コマンド行でこのオプションを指定すると、見つかった警告メッセージがツールの終了コードに反映されます。詳細は「警告」の項を参照してください。

    -verbose:sub-options
        検証処理で、 -verbose オプションは、表示する情報の量を決定するサブオプションを取ります。 -certs も指定した場合、デフォルトモード (またはサブオプション all) では、エントリが処理されるたびにそれらの各エントリが表示され、そのあとに JAR ファイルの各署名者の証明書情報も表示されます。 -certs と -verbose:grouped サブオプションを指定した場合、同じ署名者情報を持つエントリとその証明書情報が、いっしょにグループ化されて表示されます。 -certs と -verbose:summary サブオプションを指定した場合、同じ署名者情報を持つエントリとその証明書情報がいっしょにグループ化されて表示されますが、各エントリの詳細が「1 つのエントリ (およびそれ以上)」として要約されて表示されます。詳細は例の項を参照してください。

例

  JAR ファイルの署名

bundle.jar という名前の JAR ファイルがあるとします。このファイルに、キーストアの別名が jane であるユーザーの非公開鍵を使って、署名を付けるとします。この場合、次のコマンドを実行すると、JAR ファイルに署名を付けて sbundle.jar という署名付き JAR ファイルを作成できます。

    jarsigner -keystore /working/mystore -storepass <キーストアのパスワード>
      -keypass <非公開鍵のパスワード> -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 ファイル (bundle.jar) を署名付き 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 = 署名が検証されました
      m = マニフェストにエントリが記載されています
      k = キーストアで 1 つ以上の証明書が見つかりました
    JAR が検証されました。

  証明書情報を使った検証

検証時に -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 = 署名が検証されました
      m = マニフェストにエントリが記載されています
      k = キーストアで 1 つ以上の証明書が見つかりました
    JAR が検証されました。

署名者の証明書が 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 = 署名が検証されました
      m = マニフェストにエントリが記載されています
      k = キーストアで 1 つ以上の証明書が見つかりました
      i = アイデンティティースコープで 1 つ以上の証明書が見つかりました
    JAR が検証されました。

別名 duke は角括弧で囲まれているので、この別名はキーストアの別名ではなく、アイデンティティーデータベースの別名です。

警告

署名/検証処理中には、jarsigner からさまざまな警告が表示される可能性があります。これらの警告コードは次のように定義されています。

         hasExpiringCert         2
             この JAR に含まれるエントリの署名者の証明書が 6 か月以内に期限切れになります
         hasExpiredCert          4
             この JAR に含まれるエントリの署名者の証明書が期限切れになっています。
         notYetValidCert         4
             この JAR に含まれるエントリの署名者の証明書がまだ有効になっていません。
         chainNotValidated       4
             この JAR に含まれるエントリの証明書チェーンの検証を正しく行えません。
         badKeyUsa ge             8
             この JAR に含まれるエントリの署名者の証明書の KeyUsage 拡張がコードの署名を許可していません。
         badExtendedKeyUsage     8
             この JAR に含まれるエントリの署名者の証明書の ExtendedKeyUsage 拡張が
             コードの署名を許可していません。
         badNetscapeCertType     8
             この JAR に含まれるエントリの署名者の証明書の NetscapeCertType 拡張が
             コードの署名を許可していません。
         hasUnsignedEntry        16
             この JAR には、完全性チェックが行われていない署名なしエントリが含まれています。
         notSignedByAlias        32
             この JAR には、指定された別名によって署名されていない署名付きエントリが含まれています
         aliasNotInStore         32
             この JAR には、このキーストアの別名によって署名されていない署名付きエントリが含まれています

-strict オプションを指定した場合、検出された警告の OR を取った値がツールの終了コードとして返されます。たとえば、エントリの署名に使用される証明書が期限切れになっていて、かつその証明書の keyUsage 拡張でファイルの署名が許可されていない場合、終了コード 12 (=4+8) が返されます。

注: UNIX で使用可能な値は 0 から 255 だけであるため、終了コードは再利用されます。いずれにしても、署名/検証処理が失敗すると、次の終了コードが返されます。

failure                 1

  JDK 1.1 との互換性

keytool ツールと jarsigner ツールは、JDK 1.1 で提供されていた javakey ツールを完全に置き換えるものです。これらの新しいツールは、キーストアと非公開鍵をパスワードで保護する機能や、署名の生成に加えて署名を検証する機能など、javakey より多くのを機能を備えています。

新しいキーストアアーキテクチャーは、javakey が作成して管理していたアイデンティティーデータベースに代わるものです。キーストア形式と、JDK 1.1 の javakey が使っていたデータベース形式との間には下位互換性はありません。ただし、次のことは可能です。

    o   keytool の -identitydb コマンドを使うと、アイデンティティーデータベースの情報をキーストアにインポートできます。

    o   jarsigner は、以前に javakey を使って署名された JAR ファイルに署名を付けることができます。

    o   jarsigner は、javakeyを使って署名された JAR ファイルを検証できます。したがって、jarsigner は、Java 2 SDK のキーストアではなく JDK 1.1 のアイデンティティーデータベースからの署名者別名を認識し、これらを対象に処理を行うことができます。

次の表は、JDK 1.1.x で署名された JAR ファイルが、Java 2 プラットフォームでどのように扱われるかを示しています。

注 -

    1.  ポリシーファイル内にアイデンティティー/別名についての言及がある場合、それをキーストアにインポートして、ポリシーファイルの設定が与えられた特権に反映されるようにする必要があります。

    2.  ポリシーファイル/キーストアの組み合わせは、アイデンティティーデータベース内の信頼できるアイデンティティーよりも優先されます。

    3.  Java 2 プラットフォームでは、信頼できないアイデンティティーは無視されます。

    4.  Java 2 SDK キーストアにインポートできるのは、信頼できるアイデンティティーだけです。

関連項目

    o   jar(1) ツールのドキュメント

    o   keytool(1) ツールのドキュメント

    o   jarsigner ツールの使用例については、 @
        http://download.oracle.com/javase/tutorial/security/index.html 「Java チュートリアル」の @
        http://download.oracle.com/javase/tutorial/index.html「Security」を参照