Android 网络安全相关

date
Jul 18, 2022
slug
Android 网络安全
status
Published
tags
网络
summary
Android 网络安全的小知识点
type
Post
notion image

CA 证书限制

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 以下可用,Android 9 以上默认不可使用 HTTP 进行明文传输。
<?xml version="1.0" encoding="utf-8"?>

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

© Craig Hart 2021 - 2025