`

Android生成签名文件并用其对apk文件进行签名(Failure [INSTALL_PARSE_FAILED_NO_CERTIFICATES]错误完美解决)

阅读更多

最近编程时遇到问题:写了一个android小程序,打包后用apktool反编译再打包都没问题,安装时出现Failure [INSTALL_PARSE_FAILED_NO_CERTIFICATES]错误,网上查资料原来是签名的问题,解决方案如下。

 

《一》使用命令行生成签名文件 

(1)创建一个用来存放签名文件的文件夹Android_keystore
(2)在命令行窗口中输入命令:(粗体部分) 

[java] view plaincopy
  1. D:\Android_keystore>keytool -genkey -alias aeo_android.keystore -keyalg RSA -val  
  2. idity 20000 -keystore aeo_android.keystore  

 

[java] view plaincopy
  1. 输入密钥库口令:  
  2. 再次输入新口令:  
  3. 您的名字与姓氏是什么?  
  4.   [Unknown]:  localhost  
  5. 您的组织单位名称是什么?  
  6.   [Unknown]:  btbu  
  7. 您的组织名称是什么?  
  8.   [Unknown]:  btbu  
  9. 您所在的城市或区域名称是什么?  
  10.   [Unknown]:  beijing  
  11. 您所在的省/市/自治区名称是什么?  
  12.   [Unknown]:  beijing  
  13. 该单位的双字母国家/地区代码是什么?  
  14.   [Unknown]:  cn  
  15. CN=XiaoFeng, OU=btbu, O=btbu, L=beijing, ST=beijing, C=cn是否正确?  
  16.   [否]:  y  





输入 <aeo_android.keystore> 的密钥口令

        (如果和密钥库口令相同, 按回车):

 

这时会在D盘的Android_keystore文件夹下生成aeo_android.keystore文件,就是我们需要的签名文件,(-validity 20000 表示证书的有效天数为20000天) 

《二》用生成的签名文件对apk文件进行签名 
(1)在Eclipse中用“Export the unsigned apk”工具导出项目,这里保存到D盘的Android_keystore文件夹下,名为testbim.apk 

(2)使用jarsigner给 testbim.apk 文件签名,如下所示:

 

[java] view plaincopy
  1. D:\Android_keystore>"C:\Program Files\Java\jdk1.6.0_30\bin\jarsigner.exe" -verbo  
  2. se -keystore aeo_android.keystore -signedjar testbim_signed.apk testbim.apk aeo_  
  3. android.keystore  
  4. 输入密钥库的口令短语:  
  5.    正在添加: META-INF/MANIFEST.MF  
  6.    正在添加: META-INF/AEO_ANDR.SF  
  7.    正在添加: META-INF/AEO_ANDR.RSA  
  8.   正在签名: res/drawable-hdpi/ic_action_search.png  
  9.   正在签名: res/drawable-hdpi/ic_launcher.png  
  10.   正在签名: res/drawable-ldpi/ic_launcher.png  
  11.   正在签名: res/drawable-mdpi/ic_action_search.png  
  12.   正在签名: res/drawable-mdpi/ic_launcher.png  
  13.   正在签名: res/drawable-xhdpi/ic_action_search.png  
  14.   正在签名: res/drawable-xhdpi/ic_launcher.png  
  15.   正在签名: res/layout/activity_main.xml  
  16.   正在签名: res/layout/two.xml  
  17.   正在签名: res/menu/activity_main.xml  
  18.   正在签名: AndroidManifest.xml  
  19.   正在签名: classes.dex  
  20.   正在签名: resources.arsc  

 

 

keytool 是个密钥和证书管理工具。jarsigner 工具利用密钥仓库中的信息来产生或校验 Java 存档 (JAR) 文件的数字签名 (JAR 文件将类文件、图象、声音和/或其它数字化数据打包在一个文件中)。

这两个工具都是JDK自带的,所以你当前需要先确保JDK安装正确。并且环境变量设置正确,以便可以以命令行的方式进行处理。


输入密匙的口令短语: 
...... 
通过上面的命令就可以讲未签名的testbim.apk 文件签名为

[java] view plaincopy
  1. testbim_signed.apk  


(3)最后验证是否签名成功 
Android_keystore>"C:\Program Files\Java\jdk1.6.0_30\bin\jarsigner.exe" -verify testbim_signed.apk
如果成功则 
输出: 

jar 已验证 

( 4 )安装到虚拟机上

搞定~

 

命令参数说明:

-genkey    产生证书文件 
-keystore  指定密钥库的.keystore文件中 

-keyalg     指定密钥的算法

-validity    为证书有效天数,这里我们写的是20000天。 
-alias       产生别名 

在输入密码时没有回显,只管输入就可以了,一般位数建议使用20位,切忌需要记下来后面还要用,

注意:

1、CN(Common Name - 名字与姓氏):其实这个“名字与姓氏”应该是域名,比如说localhost或是blog.devep.net之类的。输成了姓名,和真正运行的时候域名不符,会出问题。浏览器访问时,弹出一个对话框,提示“安全证书上的名称无效,或者与站点名称不匹配”,用户选择继续还是可以浏览网页。但是用http client写程序访问的时候,会抛出类似于“javax.servlet.ServletException: HTTPS hostname wrong: should be ”的异常。

2、在用keytool生成数字证书时必须保证:-keystore androidapp.keystore -alias androidapp.keystore 两者名称必须相同。否则下一步签名时会出现错误:jarsigner: 找不到 androidapp.keystore 的证书链。androidapp.keystore 必须引用包含专用密钥和相应的公共密钥证书链的有效密钥库密钥条目。

 

查看帮助

$jarsigner -h
用法:jarsigner [选项] jar 文件别名(key的别名)
       jarsigner -verify [选项] jar 文件

[-keystore <url>]           密钥库位置

[-storepass <口令>]         用于密钥库完整性的口令

[-storetype <类型>]         密钥库类型

[-keypass <口令>]           专用密钥的口令(如果不同)

[-sigfile <文件>]           .SF/.DSA 文件的名称

[-signedjar <文件>]         已签名的 JAR 文件的名称

[-digestalg <算法>]    摘要算法的名称

[-sigalg <算法>]       签名算法的名称

[-verify]                   验证已签名的 JAR 文件

[-verbose]                  签名/验证时输出详细信息

[-certs]                    输出详细信息和验证时显示证书

[-tsa <url>]                时间戳机构的位置

[-tsacert <别名>]           时间戳机构的公共密钥证书

[-altsigner <类>]           替代的签名机制的类名

[-altsignerpath <路径列表>] 替代的签名机制的位置

[-internalsf]               在签名块内包含 .SF 文件

[-sectionsonly]             不计算整个清单的散列

[-protected]                密钥库已保护验证路径

[-providerName <名称>]      提供者名称

[-providerClass <类>        加密服务提供者的名称
  [-providerArg <参数>]] ... 主类文件和构造函数参数

  

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics