ソフトウェア開発者の日常

こだわりなく書きたいことを書いていきます。

JARファイルへの署名ができなくて、試行錯誤してました

よくわからずに署名しようとして、時間を無駄にしてしまったので、次回に向けてまとめます。

署名の手順

  1. JARファイルを作成する。
  2. JARファイルをデスクトップ等にコピーする。
  3. JARファイルの拡張子.jarを.zipに変更する。
  4. ZIP形式になったので、META-INFディレクトリ内のMANIFEST.MFだけをZIPファイルから取り出す。
  5. MANIFEST.MFに、
    Permissions: all-permissions
    を追加して保存する。
  6. 更新したMANIFEST.MFを、ZIP形式の元の位置に戻す。
  7. 拡張子を.zipから.jarに戻す。
  8. 管理者コマンドプロンプトを開く。
  9. コマンドプロンプト上で、JDKをインストールしたディレクトリ内のbinディレクトリに移動する。
  10. JDKをインストールしたディレクトリ内のbinディレクトリにJARファイルをコピーする。
  11. JDKをインストールしたディレクトリ内のbinディレクトリに証明書ファイルをコピーする。
  12. コマンドプロンプト上で、jarsignerを使って署名する。
    起動方法は以下のとおり。

jarsigner -keystore www -storepass xxx -keypass xxx zzz.jar yyy

これで期待通りの動作をするようになりました。


この手順になるまでに、いくつか間違えていたところがあります。

MANIFEST.MFをEclipseのプロジェクトに追加していた

MANIFEST.MFにPermissions: all-permissionsを記述して、Eclipseのプロジェクトに追加していましたが、META-INFディレクトリ内のMANIFEST.MFとして使われていなかったので、不要でした。
JARファイルをZIP形式にして確認して気づきました。

署名後に、MANIFEST.MFを更新していた

署名をすると、META-INFディレクトリ内のMANIFEST.MFに、META-INFディレクトリ内のMANIFEST.MFが改変されていないかのハッシュ値も追加されるので、署名後に更新すると改変したことになるので、正常に動作しませんでした。
署名前の更新が必要です。

コマンドプロンプトを管理者で起動していなかった

Windows 7を使っていて、JDKをC:\Program Files\Java\の下にインストールしていて、その中のファイルを更新しようとすると、管理者で起動していないコマンドプロンプトでは、

作成できませんでした


と表示されて、エラーの理由が全くわかりませんでした。

JARファイルをコピーするときに、コピーしていいか確認メッセージが表示されるので、管理者でコマンドプロンプトを起動しないといけないと最初に気づくべきでした。