gradle进行apk签名打包
阅读数:229 评论数:0
跳转到新版页面分类
python/Java
正文
默认为debug mode, 使用的签名文件在: $HOME/.android/debug.keystore
Android系统在安装APK的过程中,会对APK进行签名检验, 校验通过后才能安装成功.
数字摘要
1. 唯一性
在不考虑碰撞的情况下, 不同的数据的计算出的接要是不同的.
2. 固定长度
比较常用的Hash算法有MD5和SHA1, MD5的长度是128位, SHA1的长度是160位.
3.不可逆性
签名和校验的大体过程
签名就是要摘要的基础上再进行一次加密, 对摘要加密后的数据就可以当作数字签名, 在安装Apk时需要对签名进行验证, 验证通过才能继续安装.
数字证书
数字证书是身份认证机构颁发的, 接收到消息后, 先向CA机构验证证书的合法性, 再进行签名校验.
需要注意的是, Apk的证书通常是自签名的, 也就是由开发者自己制作, 没有向CA机构申请, 这也是对第三方apk重新签名后, 还能继续在没有安装这个apk的系统中继续安装的原因.
keystore和证书格式
我们在对apk签名时并没有直接指定私钥 公钥和数字证书, 而是使用keystore文件, 这些信息都包含在了keystore文件中.根据编码不同, keystore文件分为很多种, Android使用的是Java标准keystore格式JKS(Java Key Storage).
keystore使用的证书标准是X.509, X.509标准也有很多种编码格式, 常用的有两种: pem( Privacy Enhanced Mail)和der(Distinguished Encoding Rules), JKS使用的是der格式.
jarsigner和apksigner
Android提供了两种对Apk的签名方式, 一种是基于JAR的签名方式( 使用keystore文件), 另一种是基于Apk的签名方式( 除了支持keystore,还支持直接指定pem证书文件和私钥进行签名),
我们通过keytool或者AS生成一个keystore的时候, 输入的keystore的密码是用于保护keystore本身的, 另外的输入的alias和key是用于密钥和证书的.
签名相关的命令
● jarsigner签名
jarsigner -keystore keystore_file -signedjar signed.apk unsigned.apk alias_name -storepass pwd
● apksigner签名
java -jar signapk.jar cert.x509.pem private.pk8 unsigned.apk signed.apk
● 查看keystore文件
keytool -list -v -keystore keystore_file -storepass pwd
● 查看apk证书
keytool -printcert -jarfile apk
● 查看DER格式证书(META-INFO/CERT.RSA)
openssl pkcs7 -inform DER -in CERT.RSA -noout -print_certs -text
● 查看PEM格式证书
openssl x509 -in cert.x509.pem -text -noout
● apksigner检查apk是否签名,以及查看证书SHA1值
apksigner verify -v --print-certs
生成数字证书
cd到项目目录, 证书在目录生成
keytool -genkey -v -keystore dao_flashcard.keystore -alias flashcard -keyalg RSA -validity 20000
(1) -genkey表示执行的是生成数字证书操作, -v表示将生成证书的详细信息打印出来.
(2) -keyalg RSA表示生成密钥文件所采用的算法是RSA
(3)-validatity 20000表示该证书的有效期为20000天.
执行gradle 命令, $ gradlew assembleRelease