当前位置: 首页 > news >正文

【APK安全】HTTPS证书校验的核心风险与防御指南

文章目录

    • 前言
    • 一、HTTPS 证书校验的核心风险
      • 1. 风险 1:CA 证书验证缺失(中间人伪造信任链)
        • 风险本质
        • 典型攻击案例:伪造 CA 实施支付篡改
      • 2. 风险 2:Hostname 校验失效(域名伪造绕过)
        • 风险本质
        • 漏洞场景
      • 3. 风险 3:证书过期时间未检查(旧证书被滥用)
        • 风险本质
        • 防御缺失案例
      • 4. 风险 4:自签名证书滥用(开发环境漏洞流入生产)
        • 风险本质
        • 典型疏漏
      • 5. 风险 5:重写 X509TrustManager(全盘禁用校验)
        • 风险本质
        • 高危代码示例(中间人攻击直接利用)
    • 二、防御方案
      • 1. 强制 CA 证书验证(启用证书透明性)
        • 核心措施
        • 适配代码
      • 2. 保留 Hostname 默认校验(禁止自定义绕过)
        • 核心措施
        • 安全实现
      • 3. 依赖系统校验证书过期时间
        • 核心措施
        • 验证强化
      • 4. 自签名证书的安全管控
        • 核心措施
        • 配置示例
      • 5. 禁止重写 X509TrustManager
        • 核心措施
        • 合规实现
      • 6. Android 15 TLS 版本适配
        • 核心措施
        • 代码配置
    • 三、HTTPS 安全测试方法
      • 1. 静态测试(代码与配置审核)
      • 2. 动态测试(中间人攻击模拟)
      • 3. API 35 特性验证
    • 四、总结:HTTPS 安全的核心原则

⚠️本博文所涉安全渗透测试技术、方法及案例,仅用于网络安全技术研究与合规性交流,旨在提升读者的安全防护意识与技术能力。任何个人或组织在使用相关内容前,必须获得目标网络 / 系统所有者的明确且书面授权,严禁用于未经授权的网络探测、漏洞利用、数据获取等非法行为。

前言

在移动应用通信中,HTTPS 通过 “证书校验 + 加密传输” 构建信任体系,但 APK 若存在证书校验缺陷(如忽略 CA 验证、放行过期证书),会导致中间人攻击(MITM)有机可乘 —— 攻击者可伪造证书拦截请求、篡改返回数据(如修改支付金额、窃取登录 Token)。Android 15(API 35)进一步强化 HTTPS 安全管控(如禁用 TLS 1.0/1.1、强制证书透明性),本文聚焦五大核心校验要点,拆解风险场景、提供适配方案,筑牢 APK 通信安全防线。

一、HTTPS 证书校验的核心风险

HTTPS 信任链的建立依赖 “CA 合法性→域名一致性→证书有效性→签名可靠性” 四层校验,任一环节缺失均会引发安全漏洞。以下结合 Android 15 特性解析典型风险:

1. 风险 1:CA 证书验证缺失(中间人伪造信任链)

风险本质

HTTPS 默认通过系统预装的可信 CA 列表验证证书合法性,若应用绕过该校验(如自定义信任所有 CA),攻击者可通过伪造 CA 签发的证书构建虚假信任链。Android 15 强制要求证书透明性(CT)验证,未纳入 CT 日志的证书会被直接拦截,但手动绕过 CA 校验仍会突破该防护。

典型攻击案例:伪造 CA 实施支付篡改

某电商 APP 为简化测试,重写X509TrustManager跳过 CA 校验:

// 风险代码:完全禁用CA验证
SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(null, new TrustManager[]{new X509TrustManager() {@Overridepublic void checkClientTrusted(X509Certificate[] chain, String authType) {}@Overridepublic void checkServerTrusted(X509Certificate[] chain, String authType) {} // 未校验CA@Overridepublic X509Certificate[] getAcceptedIssuers() { return new X509Certificate[0]; }
}}, new SecureRandom());
okHttpClient = new OkHttpClient.Builder().sslSocketFactory(sslContext.getSocketFactory(), (X509TrustManager) trustManagers[0]).build();

攻击者通过 Burp Suite 安装伪造 CA 证书,拦截 APP 与服务器的 HTTPS 通信:

  1. 拦截用户 “支付 100 元” 的请求包;

  2. 篡改返回包中金额字段为 “10000 元” 并重新加密;

  3. APP 未校验 CA 合法性,接收篡改数据并执行错误支付流程。

2. 风险 2:Hostname 校验失效(域名伪造绕过)

风险本质

证书中的Subject Alternative Name(SAN)字段需与请求域名匹配,若应用重写HostnameVerifier返回true,攻击者可使用 “合法 CA 签发的其他域名证书” 伪装目标服务器。Android 15 对 Hostname 校验逻辑未做变更,但强化了默认实现的不可篡改性

漏洞场景

某金融 APP 自定义 HostnameVerifier 忽略域名校验:

// 风险代码:跳过域名一致性检查
okHttpClient = new OkHttpClient.Builder().hostnameVerifier((hostname, session) -> true) // 任意域名均通过.build();

攻击者利用可信 CA 签发的fake-bank.com证书,将恶意服务器伪装为real-bank.com:

  • 证书 CA 在系统可信列表中,CA 校验通过;

  • HostnameVerifier 未拦截fake-bank.com与real-bank.com的不匹配;

  • APP 向恶意服务器发送账户密码,导致敏感数据泄露。

3. 风险 3:证书过期时间未检查(旧证书被滥用)

风险本质

证书包含有效期字段,过期后应视为无效。若应用手动忽略过期校验,攻击者可利用泄露的过期证书发起攻击。Android 15 系统校验层会强制拦截过期证书,但自定义校验逻辑仍可能绕过

防御缺失案例

某医疗 APP 为避免证书过期导致服务中断,在代码中硬编码忽略过期检查:

// 风险代码:跳过过期时间校验
@Override
public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {try {chain[0].checkValidity(); // 验证有效期} catch (CertificateExpiredException e) {// 刻意忽略过期错误Log.w("SSL", "证书已过期,强制通过");}
}

攻击者获取该 APP 1 年前泄露的过期证书,搭建伪服务器:

  • 过期证书的 CA 仍在系统可信列表;

  • APP 忽略过期校验,建立连接;

  • 攻击者篡改患者病历数据,引发医疗事故。

4. 风险 4:自签名证书滥用(开发环境漏洞流入生产)

风险本质

自签名证书未经过公共 CA 签发,仅适用于开发测试。若生产环境未替换为可信 CA 证书,攻击者可伪造相同主题的自签名证书实施 MITM 攻击。Android 15 允许通过network-security-config配置可信自签名证书,但禁止全局信任所有自签名证书

典型疏漏

某企业 APP 开发阶段使用自签名证书,上线时未替换,且未配置信任锚点:

<!-- 错误配置:全局信任自签名证书(生产环境禁用) -->
<network-security-config><base-config><trust-anchors><certificates src="user" /> <!-- 信任用户安装的自签名证书 --><certificates src="system" /></trust-anchors></base-config>
</network-security-config>

攻击者在用户设备安装伪造的自签名证书,拦截 APP 与后端的通信:

  • 伪造证书主题与真实证书一致;

  • APP 信任用户添加的证书,建立连接;

  • 窃取企业内部数据(如客户名单)。

5. 风险 5:重写 X509TrustManager(全盘禁用校验)

风险本质

X509TrustManager是 HTTPS 校验的核心组件,重写其checkServerTrusted方法会导致系统默认校验失效。Android 15 虽未直接禁止重写,但通过应用商店审核机制拦截此类高危操作,且强制要求 CT 验证进一步暴露该漏洞。

高危代码示例(中间人攻击直接利用)

某社交 APP 为兼容旧设备,重写 TrustManager 禁用所有校验:

// 高危代码:完全绕过HTTPS校验
private SSLSocketFactory getUnsafeSSLSocketFactory() {try {X509TrustManager trustManager = new X509TrustManager() {@Overridepublic void checkServerTrusted(X509Certificate[] chain, String authType) {}@Overridepublic X509Certificate[] getAcceptedIssuers() { return null; }@Overridepublic void checkClientTrusted(X509Certificate[] chain, String authType) {}};SSLContext sslContext = SSLContext.getInstance("TLSv1.2");sslContext.init(null, new TrustManager[]{trustManager}, new SecureRandom());return sslContext.getSocketFactory();} catch (Exception e) {throw new RuntimeException(e);}
}

攻击者利用该漏洞实施 MITM 攻击:

  1. 在公共 WiFi 中部署拦截设备;

  2. 伪造服务器证书并拦截 APP 请求;

  3. 修改返回包中的 “好友消息” 为钓鱼链接;

  4. 用户点击链接泄露账号密码。

二、防御方案

1. 强制 CA 证书验证(启用证书透明性)

核心措施
  • 禁止重写X509TrustManager,依赖系统默认校验;

  • 通过network-security-config限制可信 CA,启用 CT 验证。

适配代码
  1. 配置网络安全策略(res/xml/network_security_config.xml):
<network-security-config><domain-config><!-- 仅信任指定域名 --><domain includeSubdomains="true">target-server.com</domain><trust-anchors><!-- 限制可信CA为指定根证书 --><certificates src="@raw/trusted_root_ca" /><certificates src="system" /> <!-- 补充系统可信CA --></trust-anchors><!-- Android 15强制CT验证,防止伪造证书 --><certificate-transparency mode="enforced"><public-key hash="sha256/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=" /></certificate-transparency></domain-config><!-- 禁用明文流量(Android 15默认禁用) --><base-config cleartextTrafficPermitted="false" />
</network-security-config>
  1. 在AndroidManifest.xml中引用配置:
<applicationandroid:networkSecurityConfig="@xml/network_security_config"...>
</application>

2. 保留 Hostname 默认校验(禁止自定义绕过)

核心措施
  • 不重写HostnameVerifier,使用 OkHttp / 系统默认实现;

  • 确保证书 SAN 字段包含所有业务域名。

安全实现
// 正确做法:使用默认HostnameVerifier
okHttpClient = new OkHttpClient.Builder()// 省略其他配置,不添加自定义hostnameVerifier.build();

3. 依赖系统校验证书过期时间

核心措施
  • 禁止在checkServerTrusted中捕获CertificateExpiredException并忽略;

  • 证书过期前通过服务端推送更新,避免硬编码证书。

验证强化
// 正确做法:不干预有效期校验
@Override
public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {// 依赖系统默认校验,不捕获过期异常super.checkServerTrusted(chain, authType);
}

4. 自签名证书的安全管控

核心措施
  • 开发环境:通过debug-overrides配置仅调试阶段信任自签名证书;

  • 生产环境:替换为公共 CA 签发的证书,禁用user来源信任锚。

配置示例
<network-security-config><!-- 仅调试阶段信任自签名证书 --><debug-overrides><trust-anchors><certificates src="@raw/debug_self_signed_ca" /></trust-anchors></debug-overrides><!-- 生产环境仅信任系统CA和指定根证书 --><base-config><trust-anchors><certificates src="system" /><certificates src="@raw/prod_root_ca" /></trust-anchors></base-config>
</network-security-config>

5. 禁止重写 X509TrustManager

核心措施
  • 移除所有自定义X509TrustManager实现;

  • 使用系统默认 SSLContext 或 OkHttp 安全配置。

合规实现
// 正确做法:使用系统默认SSL配置
okHttpClient = new OkHttpClient.Builder()// 无需设置sslSocketFactory和trustManager,使用默认值.build();// 若需自定义CA,通过network-security-config配置,而非重写TrustManager

6. Android 15 TLS 版本适配

核心措施
  • 禁用 TLS 1.0/1.1(Android 15 强制要求);

  • 最低支持 TLS 1.2,优先使用 TLS 1.3。

代码配置
okHttpClient = new OkHttpClient.Builder().connectionSpecs(Arrays.asList(ConnectionSpec.MODERN_TLS, // 支持TLS 1.2+ConnectionSpec.CLEARTEXT // 仅用于调试,生产环境移除)).build();

三、HTTPS 安全测试方法

1. 静态测试(代码与配置审核)

  • 搜索代码中X509TrustManager关键词,确认无自定义实现;

  • 检查network-security-config.xml:

  • 已启用certificate-transparency mode=“enforced”;

  • 未配置src=“user”(生产环境);

  • cleartextTrafficPermitted为false;

  • 验证证书文件(res/raw/下):

  • 生产环境证书由公共 CA 签发;

  • SAN 字段包含所有业务域名;

  • 未过期且有效期合理(≤2 年)。

2. 动态测试(中间人攻击模拟)

  1. 工具准备:Burp Suite + Android 15 测试设备;

  2. 攻击模拟步骤

  • 在设备安装 Burp Suite 根证书(模拟伪造 CA);

  • 拦截 APP 与服务器的 HTTPS 请求;

  • 篡改返回包数据(如修改订单金额);

  • 观察 APP 是否接收篡改数据(未接收则防御有效);

  1. 专项测试点
  • 验证过期证书是否被拦截;

  • 验证非匹配域名证书是否被 HostnameVerifier 拦截;

  • 验证自签名证书在生产环境是否被拒绝。

3. API 35 特性验证

  • 测试 TLS 1.1 连接:Android 15 应直接拒绝;

  • 测试未纳入 CT 日志的证书:应触发SSLHandshakeException;

四、总结:HTTPS 安全的核心原则

  1. 依赖系统校验:禁止重写X509TrustManager和HostnameVerifier,利用 Android 15 系统级安全增强;

  2. 配置优先于代码:通过network-security-config管理 CA 信任、CT 验证等,避免硬编码逻辑;

  3. 环境隔离:开发环境自签名证书仅通过debug-overrides配置,生产环境严格使用公共 CA 证书;

  4. 版本合规:禁用 TLS 1.0/1.1,适配 API 35 强制要求;

  5. 持续维护:定期更新证书、监控 CT 日志,及时修复证书相关漏洞。

HTTPS 安全的本质是 “信任链不可破”,Android 15 通过强制 CT 验证、禁用旧 TLS 版本等措施提升了攻击门槛,但最终防线仍依赖开发者对校验逻辑的合规实现 —— 任何 “图方便” 的绕过行为,都可能为中间人攻击打开后门。

http://www.dtcms.com/a/423905.html

相关文章:

  • 小迪web自用笔记41
  • 国外网站国内做好还是国外做邹城住房城乡建设部网站
  • 预付做网站定金如何免费的网站模板哪里有
  • 黄金、白银、石油期货市场API对接文档
  • linux入门5.1(Nginx服务器)
  • Hadess入门到实战(5) - 如何管理通用Generic制品
  • 丰台手机网站建设2023年新闻摘抄
  • Adobe Journey Optimizer 实战应用:企业如何整合全渠道营销与实时互动
  • 网站建设客户相关问题佛山网页设计师
  • 【附源码】基于Spring Boot的高校爱心捐助平台的设计与实现
  • PPIO上线DeepSeek-V3.2-Exp:引入稀疏注意力机制,API 大幅降价
  • 成都私人视频网站制作平台沈阳看男科的权威医院
  • 从零开始掌握 uv:新一代超快 Python 项目与包管理器(含 Windows 支持)
  • 天津网站建设 泰姆仕四川网络营销推广
  • 政务网站建设经验做法东莞企业网站建设预算大概多少
  • 怎么做网站icp备案有没有学做家具的网站
  • 新天力科技冲刺北交所:供应链韧性成资本市场“加分项”
  • Linux之线程池
  • 摄影师网站html5wordpress分类加密
  • 免费机械网站模板绵阳市建设工程监督网站
  • React Native 中的 useCallback
  • 哪些网站做的比较好看480元做网站
  • DSC蓝宝石法:精准测量材料比热容的核心技术
  • 在 Kubernetes 集群中运行并发布应用程序
  • Node.js面试题及详细答案120题(81-92) -- 框架与生态篇
  • 永久网站域名注册网页版传奇大全
  • 软考~系统规划与管理师考试—知识篇—第二版—1.2 信息技术及其发展
  • 常德网站开发服务抚顺网络推广
  • 建设网站的个人心得青冈网站建设
  • LeetCode 分类刷题:33. 搜索旋转排序数组