AndroidアプリやJavaのJARファイルを署名するときに、「jarsigner: unable to sign jar」と表示され、署名処理が失敗することがあります。
jarsigner: unable to sign jar
このメッセージだけでは原因を特定できません。実際には、Keystoreを開けない、Key Aliasが存在しない、Key Passwordが違う、秘密鍵を取得できない、署名対象ファイルへ書き込めない、古い署名アルゴリズムが拒否されているなど、複数の原因があります。
Oracleの現在のjarsignerドキュメントでは、コマンド解析エラー、署名に必要なキーペアを見つけられない場合、署名や検証そのものに失敗した場合などは、jarsignerがFailureとして終了コード1を返します。 :contentReference[oaicite:0]{index=0}
Androidでは現在、APK署名そのものにはAndroid SDKのapksignerやGradle/Android Studioを使うのが一般的ですが、JAR署名、古いビルド処理、独自の署名工程などではjarsignerが登場することがあります。
この記事では、「jarsigner: unable to sign jar」の原因と、Keystore、Alias、Password、JDK、ファイル権限、署名アルゴリズムを順番に確認する方法を解説します。
- 「jarsigner: unable to sign jar」とは
- 代表的な発生状況
- 主な原因
- 確認手順1:Keystoreをkeytoolで開く
- 確認手順2:Aliasを確認する
- 確認手順3:署名対象JARが存在するか確認する
- 解決方法1:Keystoreの絶対パスを指定する
- 解決方法2:Keystore Passwordを入力プロンプトで確認する
- 解決方法3:正しいKey Aliasを指定する
- 解決方法4:特定Aliasをkeytoolで確認する
- 解決方法5:Key Passwordを確認する
- 解決方法6:JKS形式を明示する
- 解決方法7:PKCS12形式を明示する
- 解決方法8:署名後のJARを別ファイルとして出力する
- 解決方法9:書き込み権限を確認する
- 解決方法10:別の作業フォルダで試す
- 解決方法11:どのjarsignerを使っているか確認する
- 解決方法12:Javaバージョンを確認する
- 解決方法13:詳細情報付きで署名する
- 解決方法14:署名後に検証する
- 解決方法15:strictモードで警告を確認する
- 解決方法16:古い署名アルゴリズムを確認する
- 解決方法17:sigalgを不必要に固定しない
- 解決方法18:CI/CDでKeystoreが正しく復元されているか確認する
- 解決方法19:CI/CDのSecretを確認する
- 解決方法20:JARではなくAPKを署名しようとしている場合
- Androidアプリでは署名が必須
- 「unable to sign jar」と「Alias does not exist」の関係
- 「unable to sign jar」とPasswordエラーの関係
- 「unable to sign jar」と証明書の警告の違い
- 最短で原因を特定する手順
- それでも解決しない場合
- まとめ
「jarsigner: unable to sign jar」とは
jarsignerはJDKに含まれるJAR署名・検証ツールです。
Keystore内の秘密鍵を利用してJARへデジタル署名を追加できます。
基本形は次のようになります。
jarsigner -keystore release.jks app.jar release
ここで、
release.jks:Keystoreapp.jar:署名対象JARrelease:Key Alias
を指定しています。
Oracleの公式ドキュメントでも、jarsignerはKeystore内の指定Aliasに対応する秘密鍵を利用してJARを署名します。 :contentReference[oaicite:1]{index=1}
代表的な発生状況
- コマンドラインからJARを署名したとき
- 古いAndroidビルドスクリプトを実行したとき
- 独自のRelease署名処理を実行したとき
- 別PCへKeystoreを移行したあと
- JDKを更新したあと
- Keystore Passwordを変更したあと
- Key Passwordを変更したあと
- Key Aliasを変更したあと
- JKSからPKCS12へ移行したあと
- CI/CD環境で署名するとき
主な原因
1.Keystoreファイルが見つからない
指定したKeystoreパスが間違っている場合、署名に利用する秘密鍵へアクセスできません。
jarsigner -keystore release.jks app.jar release
このコマンドを実行しているカレントディレクトリにrelease.jksがない場合は、正しいパスを指定する必要があります。
2.Keystore Passwordが間違っている
Keystoreを開けなければ秘密鍵を取得できないため、署名に失敗します。
3.Key Aliasが存在しない
Keystore内に存在しないAliasを指定すると、署名用キーペアを取得できません。
Oracleは、署名に必要なキーペアを見つけられない場合をjarsignerのFailure原因の1つとして挙げています。 :contentReference[oaicite:2]{index=2}
4.Key Passwordが間違っている
Keystoreは開けても、Alias内の秘密鍵を取得できない場合があります。
5.Aliasが秘密鍵エントリではない
信頼済み証明書だけのエントリではJARへ署名できません。
署名には秘密鍵を含むエントリが必要です。
6.署名対象JARが存在しない
単純なパス指定ミスでも署名処理は失敗します。
7.署名対象ファイルへ書き込めない
読み取り専用ファイル、権限のないディレクトリ、ロック中のファイルなどでは署名結果を保存できません。
8.Keystore形式が想定と違う
JKSやPKCS12などKeystore形式が異なる場合、-storetypeを明示すると切り分けできます。
9.使用しているJDKが想定と違う
複数JDKがあると、Android Studioとターミナルで別のjarsignerを使用する場合があります。
10.署名アルゴリズムが無効化されている
現在のJDKでは、安全性に問題がある古いアルゴリズムが無効化される場合があります。
OracleのJava 26ドキュメントでは、jarsignerがjdk.jar.disabledAlgorithmsとjdk.security.legacyAlgorithmsを参照し、無効化されたアルゴリズムを使用した署名は署名済みとして扱われない場合があると説明されています。 :contentReference[oaicite:3]{index=3}
確認手順1:Keystoreをkeytoolで開く
最初にKeystoreが正常か確認します。
keytool -list -v -keystore release.jks
Keystore Passwordを入力します。
正常に内容が表示されれば、KeystoreファイルとStore Passwordは少なくとも読み込み可能です。
確認手順2:Aliasを確認する
一覧から実際のAliasを確認します。
Alias name: release
そのAliasをjarsignerへ指定します。
jarsigner -keystore release.jks app.jar release
ポイント:Aliasを推測せず、必ずkeytool -listで実際の値を確認してください。
確認手順3:署名対象JARが存在するか確認する
macOS / Linux:
ls -lh app.jar
Windows PowerShell:
Get-Item .\app.jar
解決方法1:Keystoreの絶対パスを指定する
相対パスの取り違えを防ぐため、絶対パスを指定します。
Windows:
jarsigner -keystore "C:\AndroidKeys\release.jks" app.jar release
macOS:
jarsigner -keystore /Users/user/AndroidKeys/release.jks app.jar release
解決方法2:Keystore Passwordを入力プロンプトで確認する
通常はパスワードをコマンドへ直接書かず、入力プロンプトから入力します。
jarsigner -keystore release.jks app.jar release
-storepassも利用できますが、コマンド履歴へ秘密情報を残す可能性があります。
注意:本番用KeystoreのパスワードをShell履歴やCIログへ平文で残さないでください。
解決方法3:正しいKey Aliasを指定する
たとえば実際のAliasが、
upload
なら、
jarsigner -keystore release.jks app.jar upload
とします。
解決方法4:特定Aliasをkeytoolで確認する
keytool -list -v -keystore release.jks -alias upload
Aliasが存在し、秘密鍵エントリであることを確認してください。
解決方法5:Key Passwordを確認する
Store PasswordとKey Passwordが異なるKeystoreでは、秘密鍵のPasswordも必要です。
Oracleのjarsignerでは-keypassを指定できます。 :contentReference[oaicite:4]{index=4}
jarsigner -keystore release.jks -keypass KEY_PASSWORD app.jar release
ただし、コマンドラインに秘密情報を直接書くことは避けるのが安全です。
解決方法6:JKS形式を明示する
jarsigner -keystore release.jks -storetype JKS app.jar release
解決方法7:PKCS12形式を明示する
jarsigner -keystore release.p12 -storetype PKCS12 app.jar release
Keystore形式を明示すると、古いプロジェクトや移行済みKeystoreの問題を切り分けやすくなります。
解決方法8:署名後のJARを別ファイルとして出力する
元ファイルを書き換えられない場合は、-signedjarを利用します。
jarsigner -keystore release.jks -signedjar app-signed.jar app.jar release
Oracle公式ドキュメントでも、-signedjarによって署名済みJARを別ファイルへ出力できます。 :contentReference[oaicite:5]{index=5}
解決方法9:書き込み権限を確認する
macOS / Linux:
ls -l app.jar ls -ld .
Windows PowerShell:
Get-Item .\app.jar | Format-List *
読み取り専用属性や保存先の書き込み権限を確認します。
解決方法10:別の作業フォルダで試す
OneDrive、ネットワークドライブ、NAS、保護フォルダなどで失敗する場合は、ローカルの単純な場所へコピーします。
C:\AndroidSign\
などで再試行します。
解決方法11:どのjarsignerを使っているか確認する
Windows:
where jarsigner
macOS / Linux:
which jarsigner
複数JDKがインストールされている場合は、古いJDKが先に選択されていないか確認します。
解決方法12:Javaバージョンを確認する
java -version jarsigner -J-version
署名環境を変更した直後に問題が出た場合は、使用JDKの違いを確認してください。
解決方法13:詳細情報付きで署名する
-verboseを付けると詳細な署名処理を確認できます。
jarsigner -verbose -keystore release.jks app.jar release
「unable to sign jar」より前に表示される原因メッセージを確認してください。
解決方法14:署名後に検証する
署名できたら、次を実行します。
jarsigner -verify -verbose -certs app-signed.jar
Oracleの現在のドキュメントでは、-verifyでJAR署名を検証できます。検証自体が失敗した場合もjarsignerのFailureになります。 :contentReference[oaicite:6]{index=6}
解決方法15:strictモードで警告を確認する
jarsigner -verify -strict -verbose -certs app-signed.jar
Oracleの現在のjarsignerでは、-strictを使用すると重大な警告が終了コードへ反映されます。 :contentReference[oaicite:7]{index=7}
解決方法16:古い署名アルゴリズムを確認する
古いJARや古いKeystoreでは、MD5や古いSHA-1ベースの署名構成などが問題になる場合があります。
現在のJDKでは、jdk.jar.disabledAlgorithmsで無効化されたアルゴリズムを使用している署名を安全でないものとして扱います。 :contentReference[oaicite:8]{index=8}
新しい署名では現在のJDKが選択する安全な既定アルゴリズムを使用するのが基本です。
注意:エラー回避目的で古い弱いアルゴリズムを強制指定するのはおすすめできません。
解決方法17:sigalgを不必要に固定しない
古いビルドスクリプトで、
-sigalg SHA1withRSA
などが固定されている場合は確認してください。
Oracleの現在のドキュメントでは、JDKは秘密鍵の種類やサイズに応じて既定の署名アルゴリズムを自動選択し、必要な場合のみ-sigalgで上書きできるとされています。 :contentReference[oaicite:9]{index=9}
解決方法18:CI/CDでKeystoreが正しく復元されているか確認する
Base64からKeystoreを復元している場合、ファイル破損がないか確認します。
keytool -list -v -keystore release.jks
このコマンドで正常に開けなければ、jarsignerより前のKeystore復元工程を修正します。
解決方法19:CI/CDのSecretを確認する
次の値がローカルと一致しているか確認します。
- Keystore Password
- Key Alias
- Key Password
- Keystoreファイル
解決方法20:JARではなくAPKを署名しようとしている場合
Android APKを現在のAndroid SDKで署名・検証する目的なら、通常はjarsignerよりAndroid SDK Build Toolsのapksignerを利用します。
また、Android StudioやGradleのSigningConfigを設定すれば、通常はReleaseビルド時に署名を自動化できます。
ポイント:「Androidアプリを署名したい」という目的だけなら、古い手順でjarsignerを直接使っている必要がないか確認してください。
Androidアプリでは署名が必須
Android公式ドキュメントでは、APKは端末へインストールまたは更新する前にデジタル署名されている必要があります。また、Google PlayへAABをアップロードする場合でも、開発者側の証明書で署名してからアップロードします。 :contentReference[oaicite:10]{index=10}
そのため署名エラーは無視せず、正しい鍵と署名工程を設定する必要があります。
「unable to sign jar」と「Alias does not exist」の関係
次のような具体的原因が、
Alias release does not exist
最終的に、
jarsigner: unable to sign jar
へつながる場合があります。
この場合はkeytool -listでAliasを確認します。
「unable to sign jar」とPasswordエラーの関係
Keystore PasswordやKey Passwordが間違っていると、署名用秘密鍵を取得できません。
まず、
keytool -list -v -keystore release.jks
でKeystore Passwordを確認し、その後Key Passwordを確認します。
「unable to sign jar」と証明書の警告の違い
証明書が自己署名である、証明書チェーンを検証できない、証明書期限が近いなどは必ずしも即座に署名失敗を意味するわけではありません。
Oracleのjarsignerでは、重大警告とFailureが区別されており、-strictを使用すると重大警告がエラー終了コードとして扱われます。 :contentReference[oaicite:11]{index=11}
最短で原因を特定する手順
keytool -list -v -keystore release.jksを実行する- Keystore Passwordで開けるか確認する
- 実際のKey Aliasを確認する
- Aliasが秘密鍵エントリか確認する
- Key Passwordを確認する
- 署名対象JARのパスを確認する
- 書き込み権限を確認する
jarsigner -verboseで詳細エラーを見る- 署名後に
jarsigner -verifyで検証する
それでも解決しない場合
「jarsigner: unable to sign jar」が続く場合は、次を確認してください。
- Keystoreファイルが存在するか
- Keystore Passwordが正しいか
- Key Aliasが正しいか
- AliasがKeystore内に存在するか
- Aliasが秘密鍵を含んでいるか
- Key Passwordが正しいか
- 署名対象JARが存在するか
- JARへ書き込みできるか
- 別ファイルへ
-signedjarで出力したか - Keystore形式がJKSかPKCS12か確認したか
- 使用しているJDKと
jarsignerを確認したか - 古い署名アルゴリズムを固定していないか
- CI/CDのKeystoreが破損していないか
- CI/CD Secretが正しいか
-verboseで本当の原因を確認したか
まとめ
Android「jarsigner: unable to sign jar」は、JARへ署名できなかったという最終的なエラーであり、その直前に本当の原因が存在することが多いメッセージです。
Oracleの現在のjarsignerドキュメントでは、コマンド解析エラー、署名用キーペアを取得できない場合、署名や検証に失敗した場合などがFailureとなり、終了コード1を返します。 :contentReference[oaicite:12]{index=12}
まず次を実行してください。
keytool -list -v -keystore release.jks
ここでKeystore Password、Alias、秘密鍵エントリを確認します。
その後、
jarsigner -verbose -keystore release.jks app.jar release
で詳細ログを確認します。
元のJARを書き換えたくない場合は、
jarsigner -keystore release.jks -signedjar app-signed.jar app.jar release
とし、署名後は、
jarsigner -verify -verbose -certs app-signed.jar
で検証してください。Oracle公式ドキュメントでも、-signedjarによる別ファイル出力と-verifyによる署名検証が案内されています。 :contentReference[oaicite:13]{index=13}
また、Android APKのRelease署名が目的なら、現在はAndroid Studio、Gradle SigningConfig、Android SDKのapksignerを使う構成も確認してください。Android公式ドキュメントでは、APKはインストールや更新前に署名が必要であり、Google PlayへアップロードするAABも開発者側で署名する必要があります。 :contentReference[oaicite:14]{index=14}
