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