目录
基础
Android提供了两种对Apk的签名方式,一种是基于JAR的签名机制,另一种是基于Apk的签名机制,它们的主要区别在于使用的签名文件不一样:jarsigner工具使用keystore文件进行签名;apksigner工具除了支持使用keystore文件进行签名外,还支持直接指定pem证书文件和私钥进行签名。
keystore是一个密钥库,它用于存储多对私钥和证书,keystore的密码是用于保护keystore本身的,一对私钥和证书是通过alias来区分的。keystore文件是以.jks结尾。
而证书格式是:X.509;证书可以有多种编码格式:常用的有两种:pem(Privacy Enhanced Mail)和der(Distinguished Encoding Rules)。
apksigner和jarsigner是支持使用多个证书对Apk进行签名的。
签名和校验的大体过程
签名是:对数据用摘要算法生成摘要,然后使用秘钥对摘要进行加密得到签名信息,然后将证书(包含签名信息,公钥)和数据放在一块儿。
验证是:对数据使用同一套摘要算法生成摘要,然后使用证书中的公钥对签名解密,然后比对密文和摘要是否一样。
安全性
Apk的证书通常的自签名的,也就是由开发者自己制作,没有向CA机构申请。Android在安装Apk时并没有校验证书本身的合法性,
只是从证书中提取公钥和加密算法,这也正是对第三方Apk重新签名后,还能够继续在没有安装这个Apk的系统中继续安装的原因。
应用市场应该帮会验证证书的合法性。
如果数字签名和公钥(通常都在数字证书中)一起被篡改,接收方无法得知,还是会校验通过。从而数字证书的合法性很重要。
签名相关命令
#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● 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