0

自 2010 年左右以来,我在 Play 商店中有一个应用程序。我用来签署 apk 的密钥库是在这个时候创建​​的。

直到今天,我都可以使用以下命令行对 apk 进行签名:

jarsigner -storepass XXXX -keypass XXXX -verbose -sigalg MD5withRSA -digestalg SHA1 -keystore YaDuSurfAndroid.jks air.com.yadusurf.yadusurf.apk 1

我使用来自 JDK 版本的 apksigner:jdk1.7.0_80(见注 1)

但最近 Google Play 控制台拒绝了我签名的 apk :

You uploaded an APK with an invalid signature (…) Error from apksigner : MIN_SIG_SCHEME_FOR_TARGET_SDK_NOT_MET: Target SDK version 30 requires a minimum of signature scheme v2: the APK is not signed with this or a later signature scheme.

我的理解是 jarsigner 太旧 (链接),我必须使用 apksigner 选项 --v2-signing-enabled 设置为 true 所以这是我的新命令行:

apksigner sign --v1-signing-enabled true --v2-signing-enabled true --ks myfile.jks --in input-zipped.apk --out output.apk (见注2)

但它返回此异常:

Failed to load signer "signer #1"
java.security.cert.CertificateException: Unable to initialize, java.io.IOException: DerInputStream.getLength(): Redundant length bytes found
at sun.security.x509.X509CertImpl.<init>(X509CertImpl.java:198)
at sun.security.provider.X509Factory.engineGenerateCertificate(X509Factory.java:102)
at java.security.cert.CertificateFactory.generateCertificate(CertificateFactory.java:339)
at sun.security.provider.JavaKeyStore.engineLoad(JavaKeyStore.java:721)
at sun.security.provider.JavaKeyStore$JKS.engineLoad(JavaKeyStore.java:56)
at sun.security.provider.KeyStoreDelegator.engineLoad(KeyStoreDelegator.java:224)
at sun.security.provider.JavaKeyStore$DualFormatJKS.engineLoad(JavaKeyStore.java:70)
at java.security.KeyStore.load(KeyStore.java:1445)
at com.android.apksigner.SignerParams.loadKeyStoreFromFile(SignerParams.java:353)
at com.android.apksigner.SignerParams.loadPrivateKeyAndCertsFromKeyStore(SignerParams.java:239)
at com.android.apksigner.SignerParams.loadPrivateKeyAndCerts(SignerParams.java:181)
at com.android.apksigner.ApkSignerTool.sign(ApkSignerTool.java:277)
at com.android.apksigner.ApkSignerTool.main(ApkSignerTool.java:83)

引起:java.io.IOException:DerInputStream.getLength():在 sun.security.util.DerInputStream.getLength(DerInputStream.java:606) 在 sun.security.util.DerValue.(DerValue.java: 258)

我的理解是我的密钥库太旧了(是用现在太旧的 jdk 生成的)(链接)

问题 :

我的命令行有问题,还是我必须更新/转换我当前的密钥库?

在最后一种情况下,你知道如何进行这种转换吗?

(注 1)对于更高版本,aspsigner 无法使用其他版本签署 apk,但我没有错误。

(注 2)执行此命令行时,提示我输入“签名者 #1 的密钥库密码”。在这里,我尝试输入 jarsigner 命令行的“storepass”和“keypass”;两者都生成指定的异常。

4

0 回答 0