Skip to content

Android 防抓包设置

targetSdkVersion 大于 24 「Android 7.0」时系统不再信任由用户自主安装的 CA 证书。

内容加密

服务器与客户端约定一套加密、解密密钥,客户端发起请求之前对所有请求参数及内容进行加密,服务器在收到请求后先进行解密再进行处理;同理,服务器在向客户端发送响应数据之前先对数据进行加密,客户端收到数据后先对数据进行解密再进行处理;

弊端:可能会导致服务器资源的大幅消耗。

拒绝使用代理服务器

  • 针对 OkHttpClient 的请求可以禁用使用代理服务器。
OkHttpClient client = new OkHttpClient.Builder().proxy(Proxy.NO_PROXY).build();
  • 针对使用 HttpUrlConnection 进行网络请求
URL url = new URL(link);
HttpsURLConnection connection = (HttpsURLConnection) url.openConnection(Proxy.NO_PROXY);
connection.connect();

弊端:在某些场景下必须使用 VPN 进行网络连接,会无法进行网络连接。

配置 network-security-config

Certificate Pinning

原理:配置了固定证书验证,在 HTTPS 沟通建立过程中验证证书时,只要在整个过程中有一个 pining 的摘要与设置的相同,则可进行网络请求。

还可配置当前限制的过期时间,防止证书过期导致的网络请求失败。

<?xml version="1.0" encoding="utf-8"?>
<network-security-config xmlns:android="http://schemas.android.com/apk/res/android">
    <base-config cleartextTrafficPermitted="false" />
    <domain-config cleartextTrafficPermitted="true">
        <domain includeSubdomains="true">jiangjiwei.store</domain>
    </domain-config>

    <domain-config cleartextTrafficPermitted="true">
        <domain includeSubdomains="true">storage.googleapis.com</domain>
        <pin-set expiration="2021-01-01">
            <pin digest="SHA-256">afwiKY3RxoMmLkuRW1l7QsPZTJPwDS2pdDROQjXw8ig=</pin>
        </pin-set>
    </domain-config>
</network-security-config>

限制可信任 CA 集

需要将可信 CA 添加到 res/raw/trusted_roots 中进行配置。

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
  <domain-config>
    <domain includeSubdomains="true">secure.example.com</domain>
    <domain includeSubdomains="true">cdn.example.com</domain>
    <trust-anchors>
        <trust-anchors>
            <certificates src="system"/>
            <certificates src="@raw/debug_certificate"/>
        </trust-anchors>
    </trust-anchors>
  </domain-config>
</network-security-config>

弊端:如果是在 Android 7 一下,用户手动安装的 CA 可安装在系统目录下。

限制明文请求

仅在 Android 9 以下可用

<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
  <base-config cleartextTrafficPermitted="false" />
</network-security-config>

配置 clearTextTrafficPermitted 为 false 时,加载图片等资源文件时也不允许使用 HTTP 进行明文传输。如果特定的主机必须使用 HTTP 进行网络请求可配置 domain-config