web-dev-qa-db-ja.com

Android Studioで再構築中のSHA-1ダイジェストアルゴリズムのセキュリティ強度は、このキーサイズには不十分です」

プロジェクトの構築中にこの問題に直面しています。以下はスタックトレースです。リリースキー用の新しいキーストアファイルを作成しましたが、機能しませんでした。

Caused by: Java.io.IOException: Failed to generate v1 signature
at com.Android.tools.build.apkzlib.sign.SigningExtension.onOutputZipReadyForUpdate(SigningExtension.Java:292)
at com.Android.tools.build.apkzlib.sign.SigningExtension.access$200(SigningExtension.Java:53)
at com.Android.tools.build.apkzlib.sign.SigningExtension$1.lambda$beforeUpdate$2(SigningExtension.Java:171)
at com.Android.tools.build.apkzlib.Zip.ZFile.notify(ZFile.Java:2154)
at com.Android.tools.build.apkzlib.Zip.ZFile.update(ZFile.Java:923)
at com.Android.tools.build.apkzlib.Zip.ZFile.close(ZFile.Java:1207)
at com.Android.tools.build.apkzlib.zfile.ApkZFileCreator.close(ApkZFileCreator.Java:174)
at com.google.common.io.Closer.close(Closer.Java:216)
at com.Android.builder.internal.packaging.IncrementalPackager.close(IncrementalPackager.Java:332)
at com.Android.build.gradle.tasks.PackageAndroidArtifact.doTask(PackageAndroidArtifact.Java:704)
at com.Android.build.gradle.tasks.PackageAndroidArtifact.splitFullAction(PackageAndroidArtifact.Java:515)
at com.Android.build.gradle.tasks.PackageAndroidArtifact.lambda$doFullTaskAction$3(PackageAndroidArtifact.Java:396)
at com.Android.build.gradle.internal.scope.BuildElements$ExecutorBasedScheduler$transform$$inlined$forEach$lambda$1.call(BuildElements.kt:121)
at com.Android.build.gradle.internal.scope.BuildElements$ExecutorBasedScheduler$transform$$inlined$forEach$lambda$1.call(BuildElements.kt:110)
at Java.util.concurrent.ForkJoinTask$AdaptedCallable.exec(ForkJoinTask.Java:1424)
at Java.util.concurrent.ForkJoinTask.doExec(ForkJoinTask.Java:289)
at Java.util.concurrent.ForkJoinPool$WorkQueue.runTask(ForkJoinPool.Java:1056)
at Java.util.concurrent.ForkJoinPool.runWorker(ForkJoinPool.Java:1692)
at Java.util.concurrent.ForkJoinWorkerThread.run(ForkJoinWorkerThread.Java:157)
Caused by: Java.security.InvalidKeyException: Failed to sign using signer "CERT"
at com.Android.apksig.internal.apk.v1.V1SchemeSigner.signManifest(V1SchemeSigner.Java:295)
at com.Android.apksig.internal.apk.v1.V1SchemeSigner.sign(V1SchemeSigner.Java:256)
at com.Android.apksig.DefaultApkSignerEngine.outputJarEntries(DefaultApkSignerEngine.Java:424)
at com.Android.tools.build.apkzlib.sign.SigningExtension.onOutputZipReadyForUpdate(SigningExtension.Java:290)
... 18 more
Caused by: Java.security.InvalidKeyException: Failed to sign using SHA1withDSA
at com.Android.apksig.internal.apk.v1.V1SchemeSigner.generateSignatureBlock(V1SchemeSigner.Java:519)
at com.Android.apksig.internal.apk.v1.V1SchemeSigner.signManifest(V1SchemeSigner.Java:293)
... 21 more
Caused by: Java.security.InvalidKeyException: The security strength of SHA-1 digest algorithm is not sufficient for this key size
at Sun.security.provider.DSA.checkKey(DSA.Java:104)
at Sun.security.provider.DSA.engineInitSign(DSA.Java:136)
at Java.security.Signature$Delegate.init(Signature.Java:1152)
at Java.security.Signature$Delegate.chooseProvider(Signature.Java:1112)
at Java.security.Signature$Delegate.engineInitSign(Signature.Java:1176)
at Java.security.Signature.initSign(Signature.Java:527)
at com.Android.apksig.internal.apk.v1.V1SchemeSigner.generateSignatureBlock(V1SchemeSigner.Java:515)

フォーラムの他の質問に従いましたが、何も機能しませんでした。助けてください。 Android Studioバージョン-3.2.1

編集-minSdkVersionを18から21に変更すると、問題が修正されました。しかし、この背後にある本当の理由を理解することはできません。

5
umesh lohani

エラーメッセージは、キーのビット強度が1024ビット強度である可能性が高いことを意味します。これは、JDK 8u151-while少なくとも2048ビットキー強度が期待されています:

SHA-1ダイジェストアルゴリズムのセキュリティ強度は、このキーサイズには十分ではありません。

この背後にある理由は、デフォルトのキーサイズがJDK 8u1511024から2048ビットに変更されたためです。この変更は、JRE/JDK crypto roadmap at datecode 2017-10-17にもあります。

DSAキーのjarsignerおよびkeytool‑sigalgのデフォルトをSHA256withDSAにアップグレードし、‑keysizeのデフォルトを2048にアップグレードしました。

「元に戻す手順」は次のようになります(Android Studio)のサイネージには実際には適用されません):

別のアルゴリズムや小さいキーサイズを使用するには、keytoolとjarsignerの‑sigalgおよび‑keysizeオプションを使用して、現在のデフォルトを上書きします。この変更前のデフォルト値は、SHA1withDSAおよび1024ビットでした。

APKの場合、 jarsigner -の代わりに apksigner を使用することをお勧めします。その間、 APK署名スキームv があります(これらは下位互換性があります)。互換性があるため、v1)を使用しないでください。

少なくとも2048ビット強度で新しいキーを生成すると、v1jar)署名が許可されます。 JDKのダウングレードも実行可能な回避策になります(ただし、それはお勧めしません)。

このキーを既にGooglePlayに公開している場合、利用可能な最善のオプションは、 Google Playアプリ署名 に移行することです(リリースキーはアップロードキーにダウングレードされます)。


つまり、システム全体にインストールされているJDKのバージョンは、現在のバージョンのAndroid Studio-にバンドルされているOpenJDKよりもはるかに古いため、新しいキーをいくつでも生成できる可能性があります。必要に応じて、ただし最小セキュリティ要件を満たしていません。システム全体にインストールされたバージョンのJDKを更新すると、十分な強度のキーを生成できるようになります。Java -versionを実行して、使用しているものを確認してください。強度が不十分なキーを生成します。

または単に... /Android-studio/jre/jre/bin/keytoolを使用してそれらを生成します。

1
Martin Zeitler