Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用Adobe Air证书签署Android本机apk_Java_Android_Ssl_Air_Certificate - Fatal编程技术网

Java 使用Adobe Air证书签署Android本机apk

Java 使用Adobe Air证书签署Android本机apk,java,android,ssl,air,certificate,Java,Android,Ssl,Air,Certificate,我需要帮助签署Android本机应用程序与现有的.p12证书生成的AdobeAIR。该应用程序几年前在AdobeAIR中完成,并在Google play上签名发布。现在,当从AdobeAIR迁移到Android Native时,为了将应用程序升级到store上的新版本,它需要使用相同的私钥进行签名。问题在于,在较新版本的java上,无法通过keytool打开/读取密钥。尝试读取.p12证书将返回: java.security.cert.CertificateException: Unable t

我需要帮助签署Android本机应用程序与现有的.p12证书生成的AdobeAIR。该应用程序几年前在AdobeAIR中完成,并在Google play上签名发布。现在,当从AdobeAIR迁移到Android Native时,为了将应用程序升级到store上的新版本,它需要使用相同的私钥进行签名。问题在于,在较新版本的java上,无法通过keytool打开/读取密钥。尝试读取.p12证书将返回:

java.security.cert.CertificateException: Unable to initialize, java.io.IOException: DerInputStream.getLength(): Redundant length bytes found

取决于我试图执行的命令

(1)询问老朋友谷歌并没有带来太多,但带来了更多的挫折。我确实喜欢中的建议,我尝试使用OpenSSL以这种方式修复冗余字节:

openssl pkcs12 -in pkcs12-file -out key-and-cert -nodes -passin pass:abcXYZ 
openssl pkcs12 -in key-and-cert -export -out new-pkcs12-file -passout pass:abcXYZ
此命令将成功执行,但生成的SHA1密钥(…:F7)将与原始密钥(…:E5)不同!这其实并不奇怪,因为更改文件的任何部分(如删除冗余字节)将以不同的SHA密钥结束。很明显,这不是一个解决方案

(2)我尝试的下一件事是从原始的.p12证书中提取私钥和证书作为纯文本(.pem)文件,以便尝试创建一个新的.jks文件。所以我设法将我的私钥和证书从原始的.p12证书提取为纯文本。然后使用keytools和openssl,我尝试使用原始数据创建新的.jks文件,如下所述: 嗯,它的工作方式是创建了新的.jks文件,但是SHA1键(同样是…:F7)与原来的不一样(…:E5)

(3)我的下一步是通过互联网阅读和查找更多信息。找到了一些解决方案,这些解决方案表明转换最后一次是在Java1.8.0_111中工作的,并且上面的每个java发行版都有相同的问题。那么,让我们安装Java1.8.0_111并试一试。当然,它不起作用。问题依然存在。在Java1.10和Oracle版本中也尝试过,但仍然不起作用

(4)我做的最后一件事是,我安装了java 1.6并尝试使用它,没有问题,它工作得很好,我设法毫无问题地阅读了.p12,将它转换为.jks,没有任何问题,工作得很有魅力。生成的SHA1密钥(…:E5)与原始密钥(…:E5)相同

但是,问题是我需要用该证书签名的应用程序是用Java1.8开发的,而Java1.8无法读取该证书。所以我现在很沮丧,因为我在这个问题上已经输了几天了

所以,无法读取它,无法重新生成它,无法签署应用程序

所以我的问题是:是否可能,如果可能,如何使用.p12证书签署Android apk


我不确定这个问题有多普遍,但任何可能的帮助都是非常受欢迎的。

我不想成为坏消息的传播者,但这也是版本控制在企业环境中至关重要的原因之一。当事情更新时,构建可能会中断

有三件事我没有想到,上面列出了:

1] 如果您使用的是Android Studio或IntelliJ之类的IDE,您可以尝试将项目分解为Java 1.8代码和Java 1.6代码。例如,您可以创建一个密钥库签名模块,然后为其添加gradle命令,以使用Java1.6进行构建,而其余的项目模块则使用Java1.8进行构建

2] 您可以尝试创建自己的签名类,并直接调用Java1.6类,这些类可以手动添加到项目中


3] 您可以使用新的密钥库,更改包名,并将以前的商店列表指向新的Java1.8应用程序。这可能是最不可取的,因为它将被视为商店中的新应用。

我终于找到了解决我所面临问题的最佳方案。事实上,这个解决方案就在我面前,需要一点努力

我试着切换到Java1.6版本只是为了对应用程序进行签名,实际上我确实成功地完成了签名。之后,我将再次将应用程序转移到1.8Java环境中,并成功完成zipalign!当我管理好这一切时,我真的很高兴,希望谷歌游戏最终能接受apk。 当我把apk上传到商店时,我的希望就破灭了。Google Play说并不是所有的文件都签名了,我需要上传所有签名文件的apk。你能想象挫折的程度吗

我的问题是我有旧的.p12证书,无法在AndroidStudio中读取或转换为jks,但我能够从该文件中提取我的私钥和证书

在我试着再四处看看之后,我设法找到了解决方案

实际上,我所做的是,我用调试密钥构建了一个.apk签名,然后使用apksigner工具,提供了我的私钥和证书文件,最后对apk进行了签名。然后我就可以将apk上传到Google Play商店,没有任何问题

我使用apksigner工具对apk进行签名时使用的命令是:

./apksigner sign --key <your_private_key_in_.pcks8> --cert <your_certificate_in.der> <your_debug_signed_application_in.apk>
/apksigner sign--key--cert
这里需要注意的是,您的密钥必须是.pcks8格式,否则该命令将无法工作。此外,apksigner在linux上作为脚本运行,这就是为什么在apksigner之前使用“/”的原因。如果您在windows上安装了此工具或以其他方式安装了此工具,则最好仅使用apksigner.exe或apksigner启动命令

如果您的密钥为纯文本(.pem)格式,则可以使用openssl命令将其转换为.pcks8格式:

openssl pkcs8 -topk8 -inform PEM -outform DER -in <your_private_key_in.pem> -out <your_private_key_in.pcks8> -nocrypt
opensslpkcs8-topk8-通知PEM-出口DER-in-out-nocrypt

我们无法使用合法证书对应用程序进行签名。因此,我们使用自制的证书来编译/发布应用程序。然后我们使用Microsoft的Signtool(.exe)来完成这项工作。你的第一个建议我没有想到,谢谢你
openssl pkcs8 -topk8 -inform PEM -outform DER -in <your_private_key_in.pem> -out <your_private_key_in.pcks8> -nocrypt