如何在iOS无SSL Pinning时阻止Charles捕获生产应用流量?
阻止Charles捕获生产应用流量的非SSL Pinning方案
检测代理环境:在生产应用里加个逻辑,检查设备是否配置了代理。Charles这类工具会设置系统代理,你可以通过获取系统的代理主机和端口参数来判断。如果检测到非信任的代理存在,直接断网或者拒绝发起请求就行。
- Android 示例代码:
String proxyHost = System.getProperties().getProperty("http.proxyHost"); int proxyPort = Integer.parseInt(System.getProperties().getProperty("http.proxyPort", "-1")); if (proxyHost != null && proxyPort != -1) { // 检测到非信任代理,禁止网络请求 } - iOS 示例代码:
if let proxySettings = CFNetworkCopySystemProxySettings()?.takeRetainedValue() as? [String: Any] { let httpProxy = proxySettings[kCFNetworkProxiesHTTPProxy as String] as? String let httpPort = proxySettings[kCFNetworkProxiesHTTPPort as String] as? Int if httpProxy != nil && httpPort != nil { // 检测到代理,拦截请求 } }
- Android 示例代码:
校验证书链合法性:不用SSL Pinning,但可以检查服务器证书的签发链。Charles会替换成自己的根证书,这时候证书链的根节点不是正规CA的证书。你可以在应用里只预设官方信任的CA根证书,握手时如果发现根证书不在列表里,直接中断连接。
生产包强制关闭调试兼容:打包生产版本时,直接砍掉所有允许调试代理的逻辑。调试版本放开代理支持方便查流量,生产版本强制请求走系统默认通道,不允许任何绕过安全设置的操作。
服务端加签名校验:在客户端发起请求时,生成一个只有生产环境才有效的签名参数(比如结合时间戳、设备信息和密钥生成)。Charles抓到流量后没法伪造这个签名,服务器收到请求直接校验签名,不合法就拒绝,就算流量被抓也没用。
内容的提问来源于stack exchange,提问作者Sudha Tiwari
相关产品推荐
相关产品推荐

