jarsigner(1)

名前
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 ファイルとみなすことができます。

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

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

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

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

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

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

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

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

J2SE 5.0 以降の jarsigner は、タイムスタンプを含む署名を生成できるようになりました。このため、システム/デプロイヤ (Java Plug-in など) は、署名付きの証明書がまだ有効である期間中に JAR ファイルの署名が行われたかどうかを確認できます。さらに、そのタイムスタンプ情報をアプリケーションが取得するための API が、J2SE 5.0 で追加されました。

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

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

  JDK 1.1 との互換性

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

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

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

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

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

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

                      1.1 データ
         1.1 データ   ベースから   ポリシー
JAR      ベース内の   1.2 キース   ファイル
ファイル   アイデン   トアにイン   がアイデン   与えられる
のタイプ   ティティ   ポートされ   ティティ/    特権
                      る信頼でき   別名に特権
                      るアイデン   を与える
                      ティティ(4)
署名付き                                         すべてのコードに
JAR          x         x          x           与えられる
                                                 デフォルトの
                                                 特権

署名のない                                       すべてのコードに
JAR          x         x          x           与えられる
                                                 デフォルトの
                                                 特権
署名付き                                         すべてのコードに
JAR          x         ○          x           与えられる
                                                 デフォルトの
                                                 特権
署名付き                                         すべてのコードに
JAR          ○/信頼で  x          x           与えられる
              きない                             デフォルトの
                                                 特権 (3)
署名付き                                         すべてのコードに
JAR          ○/信頼で  x          ○           与えられる
              きない                             デフォルトの
                                                 特権 (1,3)
署名付き                                         すべてのコードに
JAR          x         ○          ○           与えられる
                                                 デフォルトの
                                                 特権とポリシー
                                                 ファイル内
                                                 で与えられる
                                                 特権

署名付き                                         すべてのコードに
JAR          ○/信頼    ○          ○           与えられる
              できる                             デフォルトの
                                                 特権とポリシー
                                                 ファイル内
                                                 で与えられる
                                                 特権 (2)
署名付き                                         すべての
JAR          ○/信頼    x          x           特権
              できる
署名付き                                         すべての
JAR          ○/信頼    ○          x           特権 (1)
              できる
署名付き                                         すべての
JAR          ○/信頼    x          ○           特権 (1)
              できる

注:

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

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

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

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

  キーストアの別名

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

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

jarsigner -keystore /working/mystore -storepass
   myspass -keypass dukekeypasswd MyJARFile.jar duke

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

  キーストアの場所

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

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

  キーストアの実装

java.security パッケージ内にある KeyStore クラス では、キーストア内の情報にアクセスし、変更できるように 適切に定義されたインタフェースが提供されています。 このクラスは複数のさまざまな固定実装が可能で、 それぞれの実装は、特定の種類のキーストア用の固定実装です。

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

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

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

アプリケーションでは、 KeyStore クラスが提供する getInstance ファクトリメソッドを使うことで、さまざまなプロバイダから異なる「タイプ」のキーストアの 実装を選択できます。キーストアのタイプは、キーストア情報の格納形式とデータ形式、 およびキーストア内の非公開鍵とキーストア自体の完全性を保護するために使われる アルゴリズムを定義します。異なるタイプのキーストアの実装には、互いに互換性は ありません。keytool、jarsigner、および policytool の各ツールは、 KeyStore が提供する共通のアプリケーションインタフェースだけを使っているので、任意の タイプのキーストアで使用できます。

keytool は、ファイルベースのキーストア実装に対して機能します。 keytool は、コマンド行で渡されたキーストアの位置をファイル名として扱い、 FileInputStream に変換して、そこからキーストア情報をロードします。一方、 jarsigner ツールおよび policytool ツールは、URL を使って指定することが可能な任意の位置にあるキーストアを 読み取ることができます。

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

キーストアのタイプを明示的に指定しない場合、 keytool 、 jarsigner 、および policytool の各ツールは、セキュリティプロパティファイル内で指定 された keystore.type プロパティの値に基づいてキーストアの実装を選択します。セキュリティプロパティファ イルは、 java.security という名前でセキュリティプロパティディレクトリ java.home/lib/security に置かれています。 java.home は、JDK の実行環境ディレクトリです。(SDK 内の jre ディレクトリ または Java 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」( http://java.sun.com/javase/6/docs/technotes/guides/security/p11guide.html#keytooljarsigner) にある 「KeyTool and JarSigner」節を参照してください。

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

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

•   SHA-1 ダイジェストアルゴリズムを使った DSA (デジタル署名アルゴリズム)

•   MD5 ダイジェストアルゴリズムを使った RSA アルゴリズム

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

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

  署名付き JAR ファイル

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

•   .SF 拡張子の付いた署名ファイル

•   .DSA 拡張子の付いた署名ブロックファイル

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

-sigFile MKSIGN

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

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

署名 (.SF) ファイル

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

•   ファイル名

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

•   SHA ダイジェストの値

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

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

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

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

  署名タイムスタンプ

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

    o   -tsa url

    o   -tsacert alias

    o   -altsigner class

    o   -altsignerpath classpathlist

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

  JAR ファイルの検証

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

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

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

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

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

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

    .SF ファイルのヘッダに格納されたマニフェストファイルのハッシュと、実際のマニフェスト ファイルのハッシュとが一致しない場合は、署名 (および .SF ファイル) の生成後に、ファイルに 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

注: JDK 1.1 の javakey ツールで生成した署名と、 jarsigner で生成した署名というように、 1 つの JAR ファイルに署名を混在させることができます。 つまり javakey ですでに以前署名した JAR ファイルに署名するために、 jarsigner を使用できます。

オプション

以下では、 jarsigner のオプションについて説明します。オプションを指定するときは、次の点に注意 してください。

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

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

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

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

    -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 トークンに基づいて動作できます。次のオプションを指定します。

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

        注: テストを目的とする場合、または安全が保障されたシステムで実行する場合 以外は、コマンド行やスクリプトでパスワードを指定しないでください。また、 password プロンプトでパスワードを入力すると、入力したパスワードがエコーされ、 そのまま画面に表示されます。このため、周囲にほかのユーザがいる場合は、 パスワードを見られないように注意してください。

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

        注: テストを目的とする場合、または安全であることがわかっているシステムで 実行する場合以外は、コマンド行やスクリプトでパスワードを指定しないでください。 また、password プロンプトでパスワードを入力すると、入力したパスワードがエコー され、そのまま画面に表示されます。このため、周囲にほかのユーザがいる場合は、 パスワードを見られないように注意してください。

    -sigfile file
        SF ファイルと .DSA ファイルの生成に使うベースファイル名を指定します。 たとえば、file に DUKESIGN を指定すると、生成される .SF ファイルと これらのファイルは、署名付き JAR ファイルの META-INF ディレクトリに置かれます。

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

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

        -sigalg  algorithm

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

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

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

            標準メッセージダイジェストアルゴリズム名の一覧については、「Java Cryptography Architecture」(http://java.sun.com/javase/6/docs/technotes/guides/security/crypto/CryptoSpec.html#appa)の 「 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 ファイルの検証」を参照してください。

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

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

        -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 プロバイダの場合、providerName は SunPKCS11-TokenName の形式になります。ここで、TokenName は、プロバイダインスタンスの設定時に使用した名前のサフィックスです。詳細については、
        http://java.sun.com/javase/6/docs/technotes/guides/security/p11guide.html#KeyToolJarSigner#ATTRS の 「configuration attributes table」を参照してください。たとえば、次のコマンドは、名前サフィックス SmartCard を持つ PKCS#11 キーストアプロバイダインスタンスの内容を一覧表示します。

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

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

        -tsa url
            JAR ファイル署名時にコマンド行に「-tsa http://example.tsa.url」と入力した場合、署名のタイムスタンプが生成されます。http://example.tsa.url という URL が、TSA (Time Stamping Authority) の場所を特定します。これは、-tsacert オプション経由で見つかったどの URL よりも優先されます。-tsa オプションを使用する場合、TSA の公開鍵証明書がキーストア内に存在している必要はありません。

        タイムスタンプを生成するために、jarsigner は、
        http://www.ietf.org/rfc/rfc3161.txt の 「RFC 3161」で規定された TSP (Time-Stamp Protocol) を使って TSA と通信します。成功すると、TSA から返されたタイムスタンプトークンが、署名とともに署名ブロックファイル内に格納されます。

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

        -tsacert を使用する場合、TSA の公開鍵証明書がキーストア内に存在している必要があります。

        -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 ファイルへのパスを指定します。

        絶対パス、現在のディレクトリに対する相対パスのいずれかを指定できます。複数のパスまたは JAR ファイルを classpathlist に含める場合には、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 という名前で 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 は角括弧で囲まれているので、この別名はキーストアの別名ではなく、 アイデンティティデータベースの別名です。

関連項目

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

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

    o   jarsigner ツールの使用例については、「Java Tutorial」 (http://java.sun.com/docs/books/tutorial/trailmap.html) の「Security」( http://java.sun.com/docs/books/tutorial/security1.2/index.html) を参照