1. 什么是签名和数字证书
签名就是在摘要(采用单向Hash函数将需要加密的明文“摘要”成一串固定长度的密文)的基础上再进行一次加密,对摘要加密后的数据就可以当作数字签名,在安装Apk需要对签名进行验证,验证通过才能继续安装。
数字证书是身份认证机构(Certificate Authority)颁发的,包含了以下信息
- 证书颁发机构
- 证书颁发机构签名
- 证书绑定的服务器域名
- 证书版本、有效期
- 签名使用的加密算法(非对称算法,如RSA)
- 公钥 等
2. 证书格式
keystore文件:根据编码不同keystore文件分很多种 主要是der和pem格式,Android使用的是Java标准keystore格式JKS(Java Key Storage),以文件名以.jks结尾, jks使用的der格式。
-
DER(Distinguished Encoding Rules)
二进制格式,所有类型的证书和私钥都可以存储为der格式。
-
PEM(Privacy Enhanced Mail)
base64编码,内容以—–BEGIN xxx—– 开头,以—–END xxx—– 结尾,中间内容为一串数据和字母。
3. APK的签名方式
一种是基于JAR的签名方式,另一种是基于Apk的签名方式,它们的主要区别在于使用的签名文件不一样:jarsigner使用keystore文件进行签名;apksigner除了支持使用keystore文件进行签名外,还支持直接指定pem证书文件和私钥进行签名。
注意:通过keytool或者AS生成一个keystore的时候(签署您的应用),除了要输入keystore的密码外,还要输入一个alias和key的密码,因为keystore是一个密码库,支持使用多个证书对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
注: 这是参考相关文档总结出的精华,若有侵权问题,请立即联系我删除该文档