如何创建使getPackageInfo返回多签名的APK?排查单签名返回问题
问题分析与解决办法
核心误解:证书链 ≠ 多签名
你当前用CA+叶子证书的签名链签名APK,本质上属于单签名者的证书链——整个APK只有一个签名(由叶子证书生成),CA证书仅用于验证叶子证书的合法性,并非独立签名者。而getPackageInfo(..., GET_SIGNATURES)返回的是不同签名者的签名,不是证书链里的每个证书,这就是你只得到一个签名的原因。
实现多签名的正确步骤
要让该接口返回多个签名,你需要用**多个独立的密钥对(不同签名身份)**对APK执行多签名操作,具体步骤如下:
生成两个独立密钥库
用keytool生成两个完全无关的JKS密钥库(或PKCS12格式),每个都有独立的密钥对和证书:# 生成第一个签名者密钥库 keytool -genkey -v -keystore signer1.jks -keyalg RSA -keysize 2048 -validity 10000 -alias signer1 # 生成第二个签名者密钥库 keytool -genkey -v -keystore signer2.jks -keyalg RSA -keysize 2048 -validity 10000 -alias signer2用apksigner完成多签名
使用Android SDK的apksigner工具,先以第一个密钥签名,再追加第二个密钥的签名:apksigner sign --ks signer1.jks --next-signer --ks signer2.jks app-release-unsigned.apk验证多签名结果
用apksigner验证签名,会显示两个独立的签名者条目:apksigner verify --verbose app-release-unsigned.apk此时用
keytool查看APK证书,也会看到两个独立的证书,而非链式结构。接口调用验证
安装APK后调用getPackageInfo(..., GET_SIGNATURES),即可得到包含两个Signature对象的数组,对应两个独立签名者的签名。
补充说明
- 你提到的BlackHat文档场景,是利用旧Android版本对证书链的验证漏洞,并非正常多签名流程;
- StackOverflow中提到的Verizon应用,采用的是多签名机制(多个独立签名者),而非单签名者的证书链;
- AOSP中处理多签名的逻辑,正是针对多个独立签名者的场景,而非证书链中的证书。
内容的提问来源于stack exchange,提问作者phish_and_chips
相关产品推荐
相关产品推荐

