jarsigner(1) セキュリティ・ツール jarsigner(1)

# 名前

jarsigner - Javaアーカイブ(JAR)ファイルに対して署名および検証を行います。

# 概要

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

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

*options*

コマンド行オプション。オプションを参照してください。

-verify

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

**-strict**オプションも指定した場合、**jarsigner**コマンドにより重大な警告が検出されると、メッセージ「jarが検証されました。署名者エラー」が表示されます。

*jar-file*

署名されるJARファイル。

**-strict**オプションも指定した場合、**jarsigner**コマンドにより重大な警告が検出されると、メッセージ「jarは署名されました - 署名者エラーがあります。」というメッセージが表示されます。

*alias*

別名は、**-keystore**で指定されたキーストア内またはデフォルトのキーストア内に定義されます。

# 説明

**jarsigner**ツールには、次の2つの目的があります。

•Javaアーカイブ(JAR)ファイルに署名する目的。

•署名付きJARファイルの署名と整合性を検証する目的。

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

デジタル署名は、なんらかのデータ(署名の対象となるデータ)、およびエンティティ(人、会社など)の秘密鍵から計算されるビットの文字列です。手書きの署名同様、デジタル署名には多くの利点があります。

•署名の生成に使用された秘密鍵に対応する公開鍵を使用する計算によって、それが本物であることを検証できます。

•秘密鍵が他人に知られない限り、デジタル署名の偽造は不可能です。

•これは、署名が付いたデータの機能であり、他のデータの署名となるように要求できません。

•署名付きデータは変更できません。データが変更された場合、署名によって本物であると検証できません。

ファイルに対してエンティティの署名を生成するには、まず、エンティティは、そのエンティティに関連する公開鍵/秘密鍵のペアと、公開鍵を認証する1つ以上の証明書を持つ必要があります。証明書とは、あるエンティティからのデジタル署名付きの文書で、別のエンティティの公開鍵が特定の値を持つことを示しています。

**jarsigner**コマンドは、キーストアからの鍵と証明書情報を使用して、JARファイルのデジタル署名を生成します。キーストアは、秘密鍵、および対応する公開鍵を認証する、秘密鍵に関連したX.509証明書チェーンのデータベースです。**keytool**コマンドを使用して、キーストアを作成および管理します。

**jarsigner**コマンドでは、エンティティの秘密鍵を使用して署名を生成します。署名付きJARファイルには、特に、ファイルへの署名に使用する秘密鍵に対応する公開鍵のキーストアからの証明書のコピーが含まれます。**jarsigner**コマンドでは、内部(署名ブロック・ファイル内)の証明書を使用して、署名付きJARファイルのデジタル署名を検証できます。

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

現時点では、**jarsigner**コマンドでは、**jar**コマンドまたはZIPファイルによって作成されたJARファイルのみに署名できます。JARファイルはZIPファイルと同じですが、JARファイルには**META-INF/MANIFEST.MF**ファイルも含まれている点が異なります。**META-INF/MANIFEST.MF**ファイルは、**jarsigner**コマンドによってZIPファイルに署名する際に作成されます。

デフォルトの**jarsigner**コマンドの動作では、JARまたはZIPファイルに署名します。**-verify**オプションを使用して、署名付きJARファイルを検証します。

**jarsigner**コマンドは、署名または検証の後に署名者の証明書の検証も試行します。検証エラーまたはその他の問題が発生すると、コマンドにより警告メッセージが生成されます。**-strict**オプションを指定した場合、コマンドにより重大な警告がエラーとして処理されます。エラーと警告を参照してください。

## キーストアの別名

キーストアのすべてのエンティティは、一意の別名を使用してアクセスされます。

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

```
jarsigner -keystore /working/mystore -storepass <keystore password>
      -keypass <private key password> MyJARFile.jar duke


 
```

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

## キーストアの場所

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

Oracle Solarisシステムの場合、**user.home**は、ユーザーのホーム・ディレクトリにデフォルト設定されます。

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

## キーストアの実装

**java.security package**で提供されている**KeyStore**クラスは、キーストア内の情報へのアクセスおよび情報の変更を行うための、明確に定義された多くのインタフェースを提供します。複数の異なる固定実装を指定することができ、各実装は特定のタイプのキーストアを対象とします。

現在、キーストアの実装を使用する2つのコマンド行ツール(**keytool**と**jarsigner**)、およびポリシー・ツールという名前の1つのGUIベースのツールがあります。**KeyStore**クラスは公開されているため、JDKユーザーは、それを使用する他のセキュリティ・アプリケーションを書き込むことができます。

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

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

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

**jarsigner**および**policytool**コマンドは、URLを使用して指定できる任意の場所からファイルベースのキーストアを読み取ることができます。また、これらのコマンドは、Windows上のMSCAPIおよびすべてのプラットフォーム上のPKCS11で提供されるような非ファイルベースのキーストアを読み取ることができます。

**jarsigner**コマンドおよび**keytool**コマンドの場合、**-storetype**オプションを使用して、コマンド行でキーストアのタイプを指定できます。ポリシー・ツールの場合、**「キーストア」**メニューの**「編集」**コマンドを使用して、キーストアのタイプを指定できます。

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

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

**KeyStore**クラスに定義されているstaticメソッド**getDefaultType**を使用すると、アプリケーションやアプレットから**keystore.type**プロパティの値を取得できます。次のコードの行では、**keystore.type property**で指定された、デフォルトのキーストア・タイプのインスタンスを作成します。

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


 
```

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

```
keystore.type=jks


 
```

キーストアのタイプの指定では、大文字と小文字は区別されません。たとえば、**JKS**は**jks**と同じになります。

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

```
keystore.type=pkcs12


 
```

**注意:** PKCS 11プロバイダ・パッケージを使用する場合、http://docs.oracle.com/javase/8/docs/technotes/guides/security/p11guide.htmlにある Java PKCS #11リファレンス・ガイドの「KeyTool」および「JarSigner」を参照してください。

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

デフォルトで、**jarsigner**コマンドでは次のいずれかのアルゴリズムを使用してJARファイルに署名します。

•SHA1ダイジェスト・アルゴリズムを使用したデジタル署名アルゴリズム(DSA)

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

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

署名者の公開鍵と秘密鍵がDSA鍵である場合、**jarsigner**は**SHA1withDSA**アルゴリズムを使用してJARファイルに署名します。署名者の鍵がRSA鍵である場合、**jarsigner**は**SHA256withRSA**アルゴリズムを使用してJARファイルに署名しようとします。署名者の鍵がEC鍵である場合、**jarsigner**は**SHA256withECDSA**アルゴリズムを使用してJARファイルに署名します。

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

## 署名付きJARファイル

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

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

•**.DSA**、**.RSA**または**.EC**拡張子の付いた署名ブロック・ファイル

これら2つのファイルのベース・ファイル名は、**-sigFile**オプションの値から作成されます。たとえば、オプションが**-sigFile MKSIGN**の場合、ファイルは**MKSIGN.SF**および**MKSIGN.DSA**という名前になります。

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

署名ファイル

署名ファイル(**.SF**ファイル)は、**jarsigner**コマンドを使用してファイルに署名する際にJARファイルに常に含まれるマニフェスト・ファイルと似ています。JARファイルに含まれているソース・ファイルごとに、**.SF**ファイルには、マニフェスト・ファイルにあるような、次に示す3つの行があります。

•ファイル名

•ダイジェスト・アルゴリズム(SHA)の名前

•SHAダイジェストの値

マニフェスト・ファイルでは、各ソース・ファイルのSHAダイジェストの値は、ソース・ファイルのバイナリ・データのダイジェスト(ハッシュ)になります。**.SF**ファイルでは、指定されたソース・ファイルのダイジェストの値は、ソース・ファイルのマニフェスト・ファイル内のその3行のハッシュになります。

署名ファイルには、デフォルトで、マニフェスト・ファイル全体のハッシュが格納されたヘッダーが含まれています。ヘッダーにはマニフェスト・ヘッダーのハッシュも含まれています。ヘッダーが存在すると、検証の最適化が有効になります。JARファイルの検証を参照してください。

署名ブロック・ファイル

**.SF**ファイルには署名が付けられ、署名は署名ブロック・ファイルに置かれます。このファイルには、署名に使用された秘密鍵に対応する公開鍵を認証するキーストアからの証明書または証明書チェーンも、内部でエンコードされて含まれています。ファイルの拡張子は、使用されるダイジェスト・アルゴリズムに応じて、**.DSA**、**.RSA**または**.EC**になります。

## 署名タイムスタンプ

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

```
-tsa url
-tsacert alias
-altsigner class
-altsignerpath classpathlist
-tsapolicyid policyid


 
```

## [JARファイルの検証](#JAR)

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

1.**.SF**ファイルの署名を検証します。

検証では、各署名ブロック(**.DSA**)ファイルに格納された署名が、証明書(または証明書チェーン)も**.DSA**ファイルに示される公開鍵に対応する秘密鍵を使用して生成されたことを確認します。また、署名が対応する署名(**.SF**)ファイルの有効な署名であることが確認され、それにより、**.SF**ファイルが改ざんされていないことも確認されます。

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

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

一致しない場合、**.SF**ファイル内の各ソース・ファイル情報セクションのハッシュが、マニフェスト・ファイル内の対応するセクションのハッシュと一致することを確認するために、あまり最適化されていない検証が必要になります。署名ファイルを参照してください。

**.SF**ファイルのヘッダーに格納されたマニフェスト・ファイルのハッシュが、現在のマニフェスト・ファイルのハッシュに一致しない理由の1つは、署名および**.SF**ファイルの生成後に、(**jar**ツールを使用して)1つ以上のファイルがJARファイルに追加されたことです。**jar**ツールを使用してファイルを追加した場合、新しいファイル用のセクションが追加されることにより、マニフェスト・ファイルは変更されますが、**.SF**ファイルは変更されません。検証がまだ成功しているとみなされるのは、署名の生成以降にJARファイル内のどのファイルも変更されていない場合です。これが発生するのは、**.SF**ファイルのヘッダー以外のセクションのハッシュが、マニフェスト・ファイル内の対応するセクションのハッシュと一致する場合です。

3.**.SF**ファイル内にエントリを持つJARファイル内の各ファイルを読み取ります。読取り中にファイルのダイジェストを計算し、結果をマニフェスト・セクション内のこのファイルのダイジェストと比較します。ダイジェストは同じである必要があり、そうでない場合は検証が失敗します。

検証プロセス中になんらかの重大な検証エラーが発生した場合、そのプロセスは停止され、セキュリティ例外がスローされます。**jarsigner**コマンドでは、例外を捕捉および表示します。

**注意:** 追加の警告(または、**-strict**オプションを指定した場合はエラー)はすべて読む必要があります。同様に、証明が信頼できるかを決定するために、(**-verbose**および**-certs**オプションを指定して)証明書の内容も読む必要があります。

## [1つのJARファイルを対象とする複数の署名](#1)

次のように、**jarsigner**コマンドをファイルで複数回実行し、実行のたびに異なるユーザーの別名を指定することによって、1つのJARファイルに複数のユーザーの署名を付けることができます。

```
jarsigner myBundle.jar susan
jarsigner myBundle.jar kevin


 
```

JARファイルが複数回署名されている場合、そのJARファイルには、複数の**.SF**ファイルと**.DSA**ファイルが含まれており、1回の署名に対して1つのペアとなります。前述の例では、出力JARファイルには、次の名前のファイルが含まれています。

```
SUSAN.SF
SUSAN.DSA
KEVIN.SF
KEVIN.DSA
```

# オプション

次の各項では、様々な**jarsigner**オプションについて説明します。次の標準に注意してください。

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

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

•イタリックまたは下線付きの項目(オプションの値)の実際の値は、指定する必要があります。

•**-storepass**、**-keypass**、**-sigfile**、**-sigalg**、**-digestalg**、**-signedjar**およびTSA関連のオプションを使用できるのは、JARファイルに署名する場合のみです。署名付きJARファイルを検証する場合ではありません。**-keystore** オプションは、JARファイルの署名および検証に関連します。また、別名は、JARファイルの署名および検証時に指定します。

-keystore *url*

キーストアの場所を示すURLを指定します。これにより、**user.home**システム・プロパティで決定されたユーザーのホーム・ディレクトリ内のファイル**.keystore**にデフォルト設定されます。

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

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

**-keystore**引数には、URLではなくファイル名とパスを指定でき、この場合、ファイル: URLと同じように処理されます。たとえば、次にように指定すると同等になります。

```
-keystore filePathAndName
-keystore file:filePathAndName


 
```

(JREの**$JAVA\_HOME/lib/security directory**にある) **java.security**セキュリティ・プロパティ・ファイル内でSun PKCS #11プロバイダが構成された場合、**keytool**および**jarsigner**ツールはPKCS#11トークンに基づいて動作できます。次のオプションを指定します。

```
-keystore NONE
-storetype PKCS11


 
```

たとえば、次のコマンドは、構成されたPKCS#11トークンの内容を一覧表示します。

```
keytool -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ファイルに署名を付けるときのみです(検証するときには不要です)。その場合、**-storepass**オプションをコマンド行で指定しないと、パスワードの入力を求められます。

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

•**env**: **argument**という名前の環境変数からパスワードを取得します。

•**file**: **argument**という名前のファイルからパスワードを取得します。

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

-keypass \[:env | :file] *argument*

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

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

•**env**: **argument**という名前の環境変数からパスワードを取得します。

•**file**: **argument**という名前のファイルからパスワードを取得します。

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

-sigfile *file*

生成された**.SF**ファイルおよび**.DSA**ファイルに使用するベース・ファイル名を指定します。たとえば、ファイルが**DUKESIGN**の場合、生成される**.SF**および**.DSA**ファイルは、**DUKESIGN.SF**および**DUKESIGN.DSA**という名前で、署名付きJARファイルの**META-INF**ディレクトリに格納されます。

ファイル内の文字は、セット**a-zA-Z0-9\_-**から指定される必要があります。アルファベット、数字、アンダースコアおよびハイフン文字のみを使用できます。**.SF**および**.DSA**のファイル名では、小文字はすべて大文字に変換されます。

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

-sigalg *algorithm*

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

標準的な署名アルゴリズム名のリストは、http://docs.oracle.com/javase/8/docs/technotes/guides/security/crypto/CryptoSpec.html#AppAにある Java Cryptography Architecture (JCA)リファレンス・ガイドの「付録A: 標準名」を参照してください。

このアルゴリズムには、JARファイルの署名に使用する秘密鍵との互換性が必要です。このオプションを指定しない場合、秘密鍵のタイプに応じて、**SHA1withDSA**、**SHA256withRSA**または**SHA256withECDSA**が使用されます。指定されたアルゴリズムの実装を提供するプロバイダが静的にインストールされているか、**-providerClass**オプションを使用してそのようなプロバイダをユーザーが指定する必要があります。そうでない場合、コマンドは失敗します。

-digestalg *algorithm*

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

標準的なメッセージ・ダイジェスト・アルゴリズム名のリストは、http://docs.oracle.com/javase/8/docs/technotes/guides/security/crypto/CryptoSpec.html#AppAにある Java Cryptography Architecture (JCA)リファレンス・ガイドの「付録A: 標準名」を参照してください。

このオプションを指定しない場合、**SHA256**が使用されます。指定されたアルゴリズムの実装を提供するプロバイダが静的にインストールされているか、**-providerClass**オプションを使用してそのようなプロバイダをユーザーが指定する必要があります。そうでない場合、コマンドは失敗します。

-certs

コマンド行で、**-certs**オプションを**-verify**および**-verbose**オプションとともに指定した場合、JARファイルの各署名者の証明書情報が出力に含まれます。この情報には、署名者の公開鍵を証明する証明書(**.DSA**ファイルに格納)のタイプの名前が含まれ、証明書がX.509証明書(**java.security.cert.X509Certificate**のインスタンス)の場合、署名者の識別名が含まれます。

キーストアの確認も行われます。コマンド行でキーストアの値が指定されていない場合、デフォルトのキーストア・ファイル(ある場合)がチェックされます。署名者の公開鍵の証明書がキーストア内のエントリと一致する場合、その署名者のキーストアのエントリの別名が丸カッコ内に表示されます。

-certchain *file*

コマンド行で指定した別名によって表されるキーストア・エントリの秘密鍵に関連付けられた証明書チェーンが完全ではない場合に、使用する証明書チェーンを指定します。これは、証明書チェーン全体を保持するのに十分な領域がないハードウェア・トークン上にキーストアが格納されている場合に発生します。このファイルは一連の連結されたX.509証明書、PKCS#7形式の単一データ・ブロックのいずれかとなり、そのエンコーディング形式はバイナリ・エンコーディング形式、Internet RFC 1421標準で規定される印刷可能エンコーディング形式(Base64エンコーディングとも呼ばれる)のいずれかになります。インターネットRFC 1421証明書符号化規格およびhttp://tools.ietf.org/html/rfc1421を参照してください。

-verbose

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

-internalsf

以前は、JARファイルの署名時に生成された**.DSA** (署名ブロック)ファイルに、生成された**.SF**ファイル(署名ファイル)のエンコードされた完全なコピーが含まれていました。 この動作は変更されました。出力JARファイル全体のサイズを小さくするために、デフォルトでは**.DSA**ファイルには**.SF**ファイルのコピーが含まれないようになっています。コマンド行で**-internalsf**を指定した場合、以前と同じように動作します。このオプションは、テストを行う場合に便利です。実際には、**-internalsf**オプションは、オーバーヘッドが大きくなるため、使用しないでください。

-sectionsonly

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

デフォルトでは、最適化のために、このヘッダーが追加されます。ヘッダーが存在する場合、JARファイルを検証するたびに、検証では、まずヘッダー内のハッシュがマニフェスト・ファイル全体のハッシュと一致するかどうかを確認するためにチェックできます。一致する場合、検証は次の手順に進みます。一致しない場合、**.SF**ファイル内の各ソース・ファイル情報セクションのハッシュが、マニフェスト・ファイル内の対応するセクションのハッシュと一致するという、あまり最適化されていない検証を実行する必要があります。JARファイルの検証を参照してください。

**-sectionsonly**オプションは、主にテスト用に使用されます。これを使用するとオーバーヘッドが大きくなるため、テスト用以外では使用しないでください。

-protected

**true**または**false**のいずれかの値を指定できます。専用PINリーダーなどの保護された認証パスによってパスワードを指定する必要がある場合、**true**を指定します。

-providerClass *provider-class-name*

暗号化サービス・プロバイダが**java.security**セキュリティ・プロパティ・ファイルに指定されていないときは、そのマスター・クラス・ファイルの名前を指定するときに使用されます。

**-providerArg ConfigFilePath**オプションとともに使用し、**keytool**および**jarsigner**ツールは、プロバイダを動的にインストールし、トークン構成ファイルへのパスに*ConfigFilePath*を使用します。次の例は、Oracle PKCS #11プロバイダがセキュリティ・プロパティ・ファイルに構成されていなかった場合に**PKCS #11**キーストアを一覧表示するコマンドを示しています。

```
jarsigner -keystore NONE -storetype PKCS11 \
          -providerClass sun.security.pkcs11.SunPKCS11 \
          -providerArg /mydir1/mydir2/token.config \
          -list


 
```

-providerName *providerName*

**java.security**セキュリティ・プロパティ・ファイル内で2つ以上のプロバイダが構成された場合、**-providerName**オプションを使用して、特定のプロバイダ・インスタンスを対象にすることができます。このオプションの引数は、プロバイダの名前です。

Oracle PKCS #11プロバイダの場合、*providerName*は**SunPKCS11-TokenName**という形式になります。ここで、構成属性の表で詳細に説明されているように、*TokenName*は、プロバイダ・インスタンスが構成された名前の接尾辞です。たとえば、次のコマンドは、名前接尾辞**SmartCard**の**PKCS #11**キーストア・プロバイダ・インスタンスの内容を一覧表示します。

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


 
```

-J*javaoption*

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

-tsa *url*

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

タイムスタンプを生成するために、**jarsigner**は、RFC 3161で定義されているタイムスタンプ・プロトコル(TSP)を使用してTSAと通信します。成功すると、TSAによって返されたタイムスタンプ・トークンは、署名ブロック・ファイルの署名とともに保存されます。

-tsacert *alias*

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

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

-tsapolicyid *policyid*

TSAサーバーに送信するポリシーIDを識別するオブジェクト識別子(OID)を指定します。このオプションを指定しない場合、ポリシーIDは送信されず、TSAサーバーはデフォルトのポリシーIDを選択します。

オブジェクト識別子は、ITU Telecommunication Standardization Sector (ITU-T)標準であるX.696によって定義されます。これらの識別子は、通常、**1.2.3.4**などの、負ではない数字のピリオド区切りのセットです。

-altsigner *class*

このオプションは、代替署名メカニズムを指定します。完全修飾クラス名は、**com.sun.jarsigner.ContentSigner**抽象クラスを拡張するクラス・ファイルを識別します。このクラス・ファイルへのパスは、**-altsignerpath**オプションによって定義されます。**-altsigner**オプションを使用した場合、**jarsigner**コマンドでは、指定されたクラスによって提供される署名メカニズムを使用します。それ以外の場合、**jarsigner**コマンドはデフォルトの署名メカニズムを使用します。

たとえば、**com.sun.sun.jarsigner.AuthSigner**という名前のクラスが提供する署名メカニズムを使用するには、jarsignerのオプション**-altsigner com.sun.jarsigner.AuthSigner**を使用します。

-altsignerpath *classpathlist*

クラス・ファイルおよびそれが依存するJARファイルへのパスを指定します。**-altsigner**オプションを使用して、クラス・ファイル名を指定します。クラス・ファイルがJARファイル内にある場合、このオプションでは、そのJARファイルへのパスを指定します。

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

次の例では、クラス・ファイルを含むJARファイルへのパスを指定する方法を示します。JARファイル名を含めます。

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


 
```

次の例では、クラス・ファイルを含むJARファイルへのパスを指定する方法を示します。JARファイル名を省略します。

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


 
```

-strict

署名または検証処理中に、コマンドにより警告メッセージが発行される場合があります。このオプションを指定すると、コマンドにより検出された重大な警告メッセージがツールの終了コードに反映されます。エラーと警告を参照してください。

-verbose *suboptions*

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

# エラーと警告

署名または検証プロセス中に、**jarsigner**コマンドで、様々なエラーまたは警告が発行される可能性があります。

障害がある場合、**jarsigner**コマンドはコード1で終了します。障害はないが、1つ以上の重大な警告がある場合、**-strict**オプションが指定されて**いない**場合は、**jarsigner**コマンドはコード0で終了し、**-strict**が指定されている場合は警告コードのOR値で終了します。情報警告のみがある、または警告がまったくない場合、コマンドは常にコード0で終了します。

たとえば、エントリの署名に使用される証明書が期限切れで、ファイルの署名を許可しないKeyUsage拡張機能を使用している場合、**-strict**オプションが指定されていると、**jarsigner**コマンドはコード12 (=4+8)で終了します。

**注意:** Solaris、LinuxおよびOS Xでは0から255までの値のみが有効のため、終了コードは再利用されます。

次のセクションでは、**jarsigner**コマンドにより発行できるエラーおよび警告の名前、コード、説明を記述します。

## 障害

コマンド行解析エラー、JARファイルに署名する鍵ペアを検索できない、または署名付きJARファイルの検証失敗など(限定されません)、**jarsigner**コマンドの失敗理由。

failure

コード1。署名または検証が失敗します。

## 重大な警告

**注意:** **-strict**オプションを指定した場合、重大な警告はエラーとして報告されます。

JARファイルの署名に使用する証明書にエラーがある、または署名付きJARファイルに他の問題があるなど、**jarsigner**コマンドが重大な警告を発行する理由。

hasExpiredCert

コード4。このjarには、署名者証明書が期限切れのエントリが含まれています。

notYetValidCert

コード4。このjarには、署名者証明書がまだ有効になっていないエントリが含まれています。

chainNotValidated

コード4。このjarには、証明書チェーンが検証されていないエントリが含まれています。

badKeyUsage

コード8。このJARには、署名者証明書のKeyUsage拡張機能がコード署名を許可しないエントリが含まれています。

badExtendedKeyUsage

コード8。このjarには、署名者証明書のExtendedKeyUsage拡張機能がコード署名を許可しないエントリが含まれています。

badNetscapeCertType

コード8。このjarには、署名者証明書のNetscapeCertType拡張機能がコード署名を許可しないエントリが含まれています。

hasUnsignedEntry

コード16。このjarには、整合性チェックをしていない未署名のエントリが含まれています。

notSignedByAlias

コード32。このjarには、指定された別名によって署名されていない署名済エントリが含まれています。

aliasNotInStore

コード32。このjarには、このキーストア内の別名によって署名されていない署名済エントリが含まれます。

## 情報警告

情報警告には、エラーではないが不適切とみなされるものが含まれます。コードはありません。

hasExpiringCert

このjarには、署名者証明書が6か月以内に期限切れとなるエントリが含まれています。

noTimestamp

このjarには、タイムスタンプを含まない署名が含まれています。タイムスタンプなしでは、署名者証明書の有効期限(**YYYY-MM-DD**)後または将来の取消日後、ユーザーはこのJARファイルを検証できない場合があります。

# 例

## [JARファイルの署名](#JAR~2)

次のコマンドを使用して、キーストア別名が**working**ディレクトリの**mystore**という名前のキーストアにある**jane**であるユーザーの秘密鍵でbundle.jarに署名し、署名付きJARファイルに**sbundle.jar**という名前を付けます。

```
jarsigner -keystore /working/mystore
    -storepass <keystore password>
    -keypass <private key password>
    -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**オプションを使用すると、詳細情報を取得できます。**jarsigner**を**-verbose**オプションとともに使用するサンプルを、次に示します。

```
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.


 
```

## 証明書情報を使用した検証

**-certs**オプションを**-verify**および**-verbose**オプションとともに指定した場合、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=Oracle, L=CUP, S=CA, C=US (javatest)
      X.509, CN=Jane Smith, OU=Java Software, O=Oracle, 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(1)](/man/os/openjdk-8/jar.1)

•[keytool(1)](/man/os/openjdk-8/keytool.1)

•http://docs.oracle.com/javase/tutorial/security/index.htmlにある 「コース: Java SEのセキュリティ機能」

2013年11月21日 JDK 8

---

Document: jarsigner(1) from openjdk-8 8.504-r4 (Chainguard OS)
Source: https://github.com/openjdk/jdk8u.git
