You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何创建使getPackageInfo返回多签名的APK?排查单签名返回问题

问题分析与解决办法

核心误解:证书链 ≠ 多签名

你当前用CA+叶子证书的签名链签名APK,本质上属于单签名者的证书链——整个APK只有一个签名(由叶子证书生成),CA证书仅用于验证叶子证书的合法性,并非独立签名者。而getPackageInfo(..., GET_SIGNATURES)返回的是不同签名者的签名,不是证书链里的每个证书,这就是你只得到一个签名的原因。

实现多签名的正确步骤

要让该接口返回多个签名,你需要用**多个独立的密钥对(不同签名身份)**对APK执行多签名操作,具体步骤如下:

  1. 生成两个独立密钥库
    用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
    
  2. 用apksigner完成多签名
    使用Android SDK的apksigner工具,先以第一个密钥签名,再追加第二个密钥的签名:

    apksigner sign --ks signer1.jks --next-signer --ks signer2.jks app-release-unsigned.apk
    
  3. 验证多签名结果
    用apksigner验证签名,会显示两个独立的签名者条目:

    apksigner verify --verbose app-release-unsigned.apk
    

    此时用keytool查看APK证书,也会看到两个独立的证书,而非链式结构。

  4. 接口调用验证
    安装APK后调用getPackageInfo(..., GET_SIGNATURES),即可得到包含两个Signature对象的数组,对应两个独立签名者的签名。

补充说明

  • 你提到的BlackHat文档场景,是利用旧Android版本对证书链的验证漏洞,并非正常多签名流程;
  • StackOverflow中提到的Verizon应用,采用的是多签名机制(多个独立签名者),而非单签名者的证书链;
  • AOSP中处理多签名的逻辑,正是针对多个独立签名者的场景,而非证书链中的证书。

内容的提问来源于stack exchange,提问作者phish_and_chips

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 02:37:30