Java Platform, Standard Editionツール・リファレンス
目次      

jarsigner

Java Archive(JAR)ファイルの署名および検証を行います。

形式

jarsigner [ options ] jar-file alias

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

options

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

-verify

-verifyオプションでは、JARファイル名の後に0個以上のキーストア別名を指定できます。-verifyオプションを指定すると、jarsignerコマンドは、JARファイル内の個々の署名済エントリを検証するために使用された証明書がいずれかのキーストア別名と一致するかどうかを確認します。別名は、-keystoreで指定されたキーストアまたはデフォルトのキーストアで定義されています。

-strictオプションも指定した場合は、jarsignerコマンドで重大な警告が検出されると、「jar verified, with signer errors」というメッセージが表示されます。

jar-file

署名が付けられるJARファイルです。

-strictオプションも指定した場合は、jarsignerコマンドで重大な警告が検出されると、「jar signed, with signer errors」というメッセージが表示されます。

alias

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

説明

jarsignerツールの目的は次の2つです。

  • Java Archive (JAR)ファイルに署名を付ける。

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

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

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

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

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

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

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

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

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

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

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

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

デフォルトでは、jarsignerコマンドはJARまたはzipファイルに署名を付けます。署名付きJARファイルを検証する場合は、-verifyオプションを使用します。

また、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オプションがあります。キーストアは、デフォルトではユーザーのホーム・ディレクトリの.keystoreという名前のファイルに格納されます。ユーザーのホーム・ディレクトリは、user.homeシステム・プロパティによって決まります。

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

キーストアの実装

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

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

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

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

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

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

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

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

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

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

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

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

keystore.type=jks

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

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

keystore.type=pkcs12

注: PKCS 11プロバイダ・パッケージを使用する場合は、『Java PKCS #11 Reference Guide』で「KeyTool and JarSigner」を参照してください。
http://docs.oracle.com/javase/jp/8/technotes/guides/security/p11guide.html

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

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

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

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

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

署名者の公開鍵と秘密鍵がDSA鍵である場合、jarsignerSHA1withDSAアルゴリズムを使用してJARファイルに署名を付けます。署名者の鍵がRSA鍵である場合、jarsignerSHA256withRSAアルゴリズムを使用してJARファイルに署名を付けます。署名者の鍵がEC鍵である場合、jarsignerSHA256withECDSAアルゴリズムを使用して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ファイルに常に含まれるマニフェスト・ファイルと似ています。マニフェスト・ファイルと同様に、.SFファイルには、JARファイルに含まれているソース・ファイルごとに、次に示す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ファイルの検証は、次の手順で行われます。

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

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

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

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

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

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

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

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

注: 追加の警告(-strictオプションを指定した場合はエラー)、および証明書の内容(-verboseおよび-certsオプションを指定した場合)を読み込んで、署名を信頼できるかどうかを確認するようにしてください。

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

1つのJARファイルに対してjarsignerコマンドを複数回実行し、実行のたびに、異なるユーザーの別名を指定すれば、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を指定します。このデフォルトは、ユーザーのホーム・ディレクトリ内のファイル.keystoreです。ユーザーのホーム・ディレクトリは、user.homeシステム・プロパティによって決まります。

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

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

-keystoreの引数には、URLの代わりにファイル名とパスを指定できます。この場合は、file: 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ファイルに署名を付けるときだけです(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ファイルの生成に使用するベース・ファイル名を指定します。たとえば、fileにDUKESIGNを指定すると、生成される.SFファイルと.DSAファイルの名前は、それぞれDUKESIGN.SFDUKESIGN.DSAになります。これらのファイルは、署名付きJARファイルのMETA-INFディレクトリに置かれます。

fileに使用できる文字はa-zA-Z0-9_-です。文字、数字、アンダースコアおよびハイフンのみを使用できます。.SFおよび.DSAのファイル名では、小文字はすべて大文字に変換されます。

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

-sigalg algorithm

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

標準の署名アルゴリズム名のリストについては、『Java Cryptography Architecture (JCA) Reference Guide』の「Appendix A: Standard Names」を参照してください。
http://docs.oracle.com/javase/jp/8/technotes/guides/security/crypto/CryptoSpec.html#AppA

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

-digestalg algorithm

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

標準のメッセージ・ダイジェスト・アルゴリズム名のリストについては、『Java Cryptography Architecture (JCA) Reference Guide』の「Appendix A: Standard Names」を参照してください。
http://docs.oracle.com/javase/jp/8/technotes/guides/security/crypto/CryptoSpec.html#AppA

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

-certs

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

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

-certchain file

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

-verbose

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

-internalsf

以前は、JARファイルの署名時に生成された.DSA (署名ブロック)ファイルの中に、生成された.SFファイル(署名ファイル)の完全なコピーが符号化された形で含まれていました。この動作は変更されました。現在では、出力JARファイル全体のサイズを小さくするために、デフォルトでは.SFファイルが.DSAファイルに含まれないようになっています。コマンド行で-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セキュリティ・プロパティ・ファイルに複数のプロバイダが構成された場合は、-providerNameオプションを使用して特定のプロバイダ・インスタンスを選択できます。このオプションの引数は、プロバイダの名前です。

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

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

指定されたjavaoption文字列をJavaインタプリタに直接渡します。jarsignerコマンドは、インタプリタに対するラッパーです。このオプションには、空白を含めることはできません。このオプションは、実行環境またはメモリー使用を調整する場合に便利です。指定できるインタプリタ・オプションを一覧表示するには、コマンド行で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の公開鍵証明書がキーストアに配置されている必要はありません。

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

-tsacert alias

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

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

-tsapolicyid policyid

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

オブジェクト識別子は、ITU電気通信標準化部門(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コマンドが発行できるエラーおよび警告の名前、コードおよび説明を示します。

失敗

jarsignerコマンドに失敗する原因として、コマンド行の解析エラー、JARファイルに署名を付ける鍵のペアが見つからないこと、署名付きJARの検証の失敗などが考えられますが、それだけにかぎりません。

failure

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

重大な警告

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

jarsignerコマンドで重大な警告が発行される原因として、JARファイルの署名に使用される証明書でエラーが発生したことや、署名付きJARファイルでその他の問題が発生したことが考えられます。

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ファイルの署名

キーストアの別名が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.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=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)と表示されます。

関連項目

目次      

Copyright © 1993, 2018, Oracle and/or its affiliates. All rights reserved.