1、生成私钥
Keytool 选项 | 描述 |
---|---|
-genkey | 产生一个键值对(公钥和私钥) |
-v | 允许动作输出 |
-alias<alias_name> | 键的别名。只有前八位字符有效。 |
-keyalg | 产生键的加密算法。支持DSA和RSA。 |
-keysize | 产生键的长度。如果不支持,keytool用默认值1024 bits.通常我们用2048 bits 或更长的key。 |
-dname | 专有名称,描述谁创建的密钥。该值被用作自签名证书的颁发者和主题字段。注意你可以不在命令行指定。如果没有指定keytool会提示你(CN, OU, and so on)。 |
-keypass | 键的密码。 主要为了安全起见,如果没提供,keytool会提示你输入。 |
-validity | 键的有效期,单位:天 Note: A value of 10000 or greater is recommended. |
-keystore.keystore | 用于存储私钥的文件。 |
-storepass | 私钥存储文件的密码。 主要为了安全起见,如果没提供,keytool会提示你输入。这个密码不会存储在你的shell历史记录中。 |
keytool -genkey -v -keyalg DSA -keysize 1024 -sigalg SHA1withDSA -validity 20000 -keystore Mystore.keystore -alias devel -keypass pwd -storepass pwd
2、读取android keystore 中的信息,
在命令窗口中输入:keytool -list -v -keystore keystoreName - storepass keystorePassword
3、对apk进行签名:
在命令行中输入:jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore {keystore文件路径} -storepass {私钥存储文件的秘钥,即keystore的秘钥} {要签名的apk} {生成keystore时,定义的别名}
该命令在JDK 1.7以上使用
Jarsigner 选项 | 描述 |
---|---|
-keystore.keystore | 包含你私钥的存储文件 |
-verbose | 显示输出动作。 |
-sigalg | 签名算法,用 SHA1withRSA . |
-digestalg | 消息摘要算法,用 SHA1 . |
-storepass | 存储文件的密码。
主要为了安全起见,如果没提供,jarsigner会提示你输入。这个密码不会存储在你的shell历史记录中。 |
-keypass | 私钥的密码。
主要为了安全起见,如果没提供,jarsigner会提示你输入。这个密码不会存储在你的shell历史记录中。 |
1、使用命令对apk进行签名的时候,会产生警告,可忽略。警告如下:
警告:
未提供 -tsa 或 -tsacert, 此 jar 没有时间戳。如果没有时间戳, 则在签名者证书的到期日期 (2039-03-05) 或以后的任何撤销日期之后, 用户可
能无法验证此 jar。
a、解决方案:
jarsigner -verbose -digestalg SHA1 -sigalg MD5withRSA-tsa https://timestamp.geotrust.com/tsa -keystore new.keystore -keypass coo -storepass coo -signedjar signed.apk(签名后apk的名字) sign.apk(要签名的apk) new.keystore
该方法问题:-tsa 的网址在命令行中有时会访问失败。{jarsigner: 无法对 jar 进行签名: javax.net.ssl.SSLHandshakeException: Remote host closed connection during handshake}
二、在签名过程遇到的jarsigner 错误: java.util.zip.ZipException: invalid entry compressed size (expected 10434 but got 10610 bytes) 异常。
这是因为默认给apk做了debug 签名,所以无法做新的签名
这时就必须点工程右键->Android Tools ->Export Unsigned Application Package.
或者从AndroidManifest.xml的 Exporting上也是一样的
然后再基于这个导出的unsigned apk做签名,导出的时候最好将其目录选在你之前产生keystore的那个目录下,这样操作起来就方便了。
另外,也可以用压缩软件打开apk包,删除保重的META-INF文件。在进行签名也可以。
大家有好的解决方案可交流一下。谢谢!