生成私钥并给APP签名

2015/06/04 测试方法

问题描述

未签名的app在安装时adb会返回错误,问题是如何给apk签名?

  1. 为什么要签名:为了保证每个应用程序开发商合法ID,防止部分开放商可能通过使用相同的Package Name来混淆替换已经安装的程序,我们需要对我们发布的APK文件进行唯一签名,保证我们每次发布的版本的一致性(如自动更新不会因为版本不一致而无法安装)

  2. PC签名和Android签名的区别:

    • PC端程序的签名是找证书机构申请的(需要花银子),证书中有:公司信息;颁发机构信息;证书的有效期,如下所示: 2015-6-4-1
    • Android程序的签名只要保持统一(与后续版本的密钥库一致)就行,作用是防止部分开放商可能通过使用相同的Package Name来混淆替换已经安装的程序,因此Android程序没有必要验证签名是否是sogou.com的,只要有签名,且所有版本保持一致即可

如何给apk签名

  1. 有一个私钥(keystore)和这个keystore的口令
  2. 签名私钥:可以自己生成(如有现成的,需要知道私钥的口令;)

具体操作步骤

前提:安装JDK环境,并且将bin配置环境变量

  1. 生成一个私钥,使用keytool.exe(JDK自带的)
  2. 在cmd里直接输入以下命令,按照提示操作,主要是记住密钥库口令,密钥和密钥库的口令可保持一致,也可不保持一致,其他信息随便填写

keytool -genkey -v -keystore my-release-key.keystore -alias alias_name -keyalg RSA -keysize 2048 -validity 100002015-6-4-22

  1. 用生成的私钥对app进行签名, 在cmd命令里直接输入:

jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore my-release-key.keystore my_application.apk alias_name

注:上面的方法会使用签名后的apk直接将之前未签名的apk覆盖掉,如不想被覆盖,如下方法:

jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore my-release-key.keystore my_application.apk alias_name -signedjar demo_signed.apk

注:网上很多提供签名的命令都是:

jarsigner -verbose -keystore demo.keystore -signedjar demo_signed.apk demo.apk demo.keystore,签名后安装仍然显示没有签名,原因是:

As of JDK 7, the default signing algorithim has changed, requiring you to specify the signature and digest algorithims (-sigalg and -digestalg) when you sign an APK

写在最后

  1. 更多的信息可以参考http://developer.android.com/intl/zh-cn/tools/publishing/app-signing.html
  2. 查看keytool生成密钥的方法: 2015-6-4-2
  3. 签名jarsigner的用法 2015-6-4-3

Search

    Post Directory