ARTICLE · 1156101
APP 自签名到底算不算合规?
等保测评里有一条要求:应保证开发移动业务应用软件的签名证书合法性。
现场争议一直不小:有人说自签名不合规,得买 CA 证书;有人说 Android 官方明确不要求 CA,自签名就是标准做法。两边都能找到依据,谁也说服不了谁。
Android 官方文档已经把话说死了:应用并非必须由核心机构签名,Android 目前不对应用证书进行 CA 验证。所以自签名本身不构成不符合项。
真正的问题不是"要不要买证书",而是这条指标到底在管什么。
目 录
一、它和 HTTPS 证书根本不是一回事 二、安装那一步,系统到底验了什么 三、证书上写的主体名,不能当证据 四、真正能查的三项,和查不动的两项 五、最典型的失分点
一、它和 HTTPS 证书根本不是一回事
它和 HTTPS 证书根本不是一回事。
你打开一个网站,浏览器不认识你也不认识这个网站,凭什么相信它自称的公司?办法是找一家大家都信的 CA 担保,形成一条从浏览器信任名单一路指到网站的链。
App 这条链不存在。 手机系统里没有预置任何信任名单,也不做证书链验证。而且它根本不需要——它不比"你是谁",只比"这个包和你手机上那个是不是同一个东西"。
所以 Android 自签名是行业标准做法,不是缺陷。 Google Play、各大应用商店接受的都是开发者自签名证书。
二、安装那一步,系统到底验了什么
证书的作用是给整个安装包算一个指纹。 安装前系统重算一遍,跟包里存的指纹比对,对得上才装。和快递封条一个道理:封条完整,说明出厂后没人拆过。
这里有个容易被误解的点:首次安装时系统只能验"签名和内容匹配",验不了签名人是谁。
攻击者改完字节用自己证书重签,系统会重算指纹比对——对不上,直接拒装。但如果他连签名值也重算一遍,包内签名和内容就自洽了,系统会正常放行。
因为首次安装时系统没有"正确签名"这个参照物,它只能确认签名和内容对得上,确认不了这是不是该开发者的签名。
能挡住重签名仿冒的,是覆盖安装时那道校验:手机里已经有旧版,新版证书必须和它一致,攻击者换了自己的证书就顶不上去,只能换个包名当新应用——这才是"二次打包"。
系统查的是货有没有被掉包,不是货是谁的。
三、证书上写的主体名,不能当证据
现场拿到证书,第一反应往往是比对 CN 字段和营业执照名称。这个做法不成立。
X.509 证书的 CN 字段没有统一格式规范,填拼音、填英文品牌、填产品名都合法。而且它是申请者自己填的,没有第三方核验过——Android 根本不校验这个字段的内容。
最直接的例子是 debug 证书,CN=Android Debug, O=Android, C=US。全世界所有 Android 开发者的这张证书完全一样,你敲一行命令就能造出一张和 Google、华为一模一样的证书。如果 CN 声明有权威性,那全球就都是同一家主体了。
所以主体这一项不是"不考",而是换了个查法:不看证书上写了什么,看它的指纹能不能和备案记录、商店登记对上。主体身份由备案和商店承担,不由证书自证。
顺带说一个坑:工信部备案公众查询只能查到备案号、审核日期和主办单位名称,查不到公钥和签名 MD5(那部分在接入商后台)。所以通过备案只能证明"这家公司备案过某个 App",不能证明"这张证书就是那个 App 用的"。
四、真正能查的三项,和查不动的两项
证书里写着指纹、主体名称、签名算法与密钥长度、有效期,外加一件不在证书文件里但更关键的东西——私钥。这五项构成"这张证书值得信任",但真正能落地核查的只有三项:
私钥受控——keystore 由单位指定人员保管,有台账和离职处置记录;不是Debug证书。 参数合规——证书签名算法 SHA256 以上、RSA 2048 以上。 指纹可核对——侧载场景需在官网公布证书指纹供用户核对。
另有两项理论上属于证书内容,但在现行公开渠道下不具备可操作性:主体可追溯(卡在备案查不到指纹、商店后台需登录开发者账号)、证书持续唯一(卡在渠道包要逐个下载提取,实际很少做)。这两项不是不重要,而是取证成本远高于收益。
有几项则是明确不能作为判据的:
| 只在安装时看一眼 | |
有效期这条特别容易误判。
官方原文是"系统仅在安装时检查签名者证书的过期时间。如果应用程序签名者的证书在安装后的时间过期,该应用将仍然正常工作。"行业惯例设 10000 天(约 27 年),有效期长不是缺陷,是常态。
五、最典型的失分点
用 debug 证书签了正式发布的包。
Android 开发工具首次调试时会自动生成一份 debug 证书,参数全部写死:证书库密码 android、密钥别名 androiddebugkey、密钥密码 android、主体 CN=Android Debug, O=Android, C=US。
这意味着全世界所有 Android 开发者的这份证书长得一模一样。 用这样的证书签发布的 App,等于对外宣称"我是这个开发者"——而任何人都能这么说。Google Play 官方明确不接受:"由于调试证书由构建工具创建,并且在设计上不安全,因此大多数应用商店都不接受使用调试证书为要发布的应用签名。"
排查时看证书主体是不是 CN=Android Debug,而不是 keystore 文件锁在哪。
私钥本身是公开常量,锁起来也没用。
最后提醒一句:目前等保测评中尚无针对本条"证书合法性"的具体判定方法。实际遇到这条,建议结论表述为"部分符合/待补充证据"并注明依据不足的原因,不宜直接判定为不符合。
📚 往期精华