之前在《Android Studio生成Key Store打包含有app安装包证书的apk应用》中已经讲解了如何用Android Studio生成keystore来打包含有APP安装包证书的apk应用了。
打包完我们可以用keytool或jarsigner查看apk应用签名信息。
#方式一
keytool -printcert -jarfile app-release.apk
#方式二
jarsigner -verify -verbose -certs app-release.apk
如果没正确签名apk,那么用keytool查询会报“不是已签名的 jar 文件”,用jarsigner查询则会报“jar 未签名”具体如下。
s = 已验证签名
m = 在清单中列出条目
k = 在密钥库中至少找到了一个证书
i = 在身份作用域内至少找到了一个证书
没有清单。
jar 未签名。
apk应用未签名主要是build.gradle文件没配置对,照《Android Studio生成Key Store打包含有app安装包证书的apk应用》生成keystore然后把storeFile、storePassword、keyAlias、keyPassword配进来,重点是加上“v1SigningEnabled true”和“v2SigningEnabled true”这两个在旧版本开发工具是可以直接勾选的。
signingConfigs和buildTypes配置信息如下。
signingConfigs {
config {
storeFile file('xxxx') // 支持相对路径与绝对路径
storePassword 'xxxx'
keyAlias = 'xxxx'
keyPassword 'xxxx'
v1SigningEnabled true //兼容v1
v2SigningEnabled true //兼容v2
}
}
buildTypes {
debug {
signingConfig signingConfigs.config
}
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.config
}
}
}
打包后可以看到apk文件里的META-INF目录下有MANIFEST.MF、CERT.SF、CERT.RSA这些文件证明APP签名成功。
将“CERT.RSA”解压出来用“keytool -printcert -file CERT.RSA ”或者再用上面的keytool或jarsigner命令都能查看apk应用的签名信息了,但是你会发现都只显示“证书指纹的SHA1和SHA256”、“签名算法名称:SHA256withRSA”、“主体公共密钥算法: 2048 位 RSA 密钥”等部分信息,就算用“keytool -list -v -keystore fenxianglu.keystore”直接查询keystore也只能看到类似的结果,像备案APP还要用到公钥、MD5。
这个时候可以通过执行右边菜单栏Gradle下面的“signingReport”可以看到MD5、SHA1、SHA256、有些截止日期等。
如果Gradle下面没有“signingReport”可以通过点击Gradle下面那个图标在弹出来的“Run Anything”中输入“gradle signingReport”,即可打印出签名信息。
但是还是没法看到公钥,网上一些做法说可以通过下面的命令把keystore转成cer证书,再用操作系统自带工具查看公钥,macOS用钥匙串访问打开证书就可以看到公共密钥了。
keytool -export -alias xubingtao.cn -keystore fenxianglu.keystore -file fenxianglu.cer
但是你会发现到Windows看到的结果跟macOS的不一样,这是因为不同操作系统的证书存放格式、编码不同导致显示结果不同。备案拿这个就行了,下面那种方式查出来的字符串反而无法填进去!
其实可以直接用下面的命令就可以查看到keystore的公钥和私钥了,当然也可以用Java程序来读取keystore的公钥和私钥。
keytool -list -rfc --keystore fenxianglu.keystore | openssl x509 -inform pem -pubkey
展开阅读全文