夜雨聆风学习资料网

ARTICLE · 1156101

APP 自签名到底算不算合规?

APP 自签名到底算不算合规?

等保测评里有一条要求:应保证开发移动业务应用软件的签名证书合法性。

现场争议一直不小:有人说自签名不合规,得买 CA 证书;有人说 Android 官方明确不要求 CA,自签名就是标准做法。两边都能找到依据,谁也说服不了谁。

Android 官方文档已经把话说死了:应用并非必须由核心机构签名,Android 目前不对应用证书进行 CA 验证。所以自签名本身不构成不符合项。

真正的问题不是"要不要买证书",而是这条指标到底在管什么。

目 录

一、它和 HTTPS 证书根本不是一回事 二、安装那一步,系统到底验了什么 三、证书上写的主体名,不能当证据 四、真正能查的三项,和查不动的两项 五、最典型的失分点

一、它和 HTTPS 证书根本不是一回事

它和 HTTPS 证书根本不是一回事。

你打开一个网站,浏览器不认识你也不认识这个网站,凭什么相信它自称的公司?办法是找一家大家都信的 CA 担保,形成一条从浏览器信任名单一路指到网站的链。

App 这条链不存在。 手机系统里没有预置任何信任名单,也不做证书链验证。而且它根本不需要——它不比"你是谁",只比"这个包和你手机上那个是不是同一个东西"。

HTTPS 证书
App 签名证书
谁在验证
浏览器(对你是陌生人)
手机系统
验证什么
网站背后是谁
内容被改过没有
何时验证
每次联网
只在安装那一次
谁来担保
第三方 CA
没有担保人
私钥干什么
既证明身份又加密传输
只做防篡改

所以 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 以上。
  • 指纹可核对——侧载场景需在官网公布证书指纹供用户核对。

另有两项理论上属于证书内容,但在现行公开渠道下不具备可操作性:主体可追溯(卡在备案查不到指纹、商店后台需登录开发者账号)、证书持续唯一(卡在渠道包要逐个下载提取,实际很少做)。这两项不是不重要,而是取证成本远高于收益。

有几项则是明确不能作为判据的:

排除项
理由
证书上写的主体名称
申请者自填,无第三方核验
是否由 CA 签发、证书链是否可追溯
系统不做 CA 验证,无此维度
证书是否在有效期内
只在安装时看一眼
,装上后过期照常运行
签名方案 v1/v2/v3
属 APK 签名方案,不是证书的属性
安全软件报"测试签名"
第三方自建信誉库,存在误报

有效期这条特别容易误判。

官方原文是"系统仅在安装时检查签名者证书的过期时间。如果应用程序签名者的证书在安装后的时间过期,该应用将仍然正常工作。"行业惯例设 10000 天(约 27 年),有效期长不是缺陷,是常态。

五、最典型的失分点

用 debug 证书签了正式发布的包。

Android 开发工具首次调试时会自动生成一份 debug 证书,参数全部写死:证书库密码 android、密钥别名 androiddebugkey、密钥密码 android、主体 CN=Android Debug, O=Android, C=US。

这意味着全世界所有 Android 开发者的这份证书长得一模一样。 用这样的证书签发布的 App,等于对外宣称"我是这个开发者"——而任何人都能这么说。Google Play 官方明确不接受:"由于调试证书由构建工具创建,并且在设计上不安全,因此大多数应用商店都不接受使用调试证书为要发布的应用签名。"

排查时看证书主体是不是 CN=Android Debug,而不是 keystore 文件锁在哪。

私钥本身是公开常量,锁起来也没用。

最后提醒一句:目前等保测评中尚无针对本条"证书合法性"的具体判定方法。实际遇到这条,建议结论表述为"部分符合/待补充证据"并注明依据不足的原因,不宜直接判定为不符合。


📚 往期精华

  1. 纯短信登录,口令复杂度怎么判?
  2. 虚拟机能"漂移",到底算不算热冗余?
  3. 三级系统"等保+密评"都要做?双评联动的实操打法来了
  4. 数据安全测评、风险评估、密评……名目这么多,到底什么关系?
  5. 听说要做数据安全测评?单位最关心的八个问题一次说清
  6. "重要业务数据"怎么界定?一份可直接套用的数据分类分级与加密清单
  7. 安全管理员,到底是干什么的?
  8. JumpServer 合规吗?
  9. 没有双因子,还有救吗?
  10. 向日葵,哪里不合规?
  11. 应急预案怎么写?照着抄就行

相关学习资料