Transport security has blocked a cleartext HTTP

Transport security has blocked a cleartext HTTP

技术背景

从iOS 9开始,为提高应用与Web服务之间连接的安全性,引入了App Transport Security(ATS)。ATS强制应用与Web服务之间的安全连接遵循最佳实践,以防止意外信息泄露,并提供安全的默认行为。当应用尝试使用明文HTTP进行网络请求时,ATS会阻止该请求,并提示“Transport security has blocked a cleartext HTTP”错误。ATS要求服务器至少支持TLS 1.2协议,连接密码需提供前向保密,证书必须使用SHA256或更优的签名哈希算法,使用2048位或更大的RSA密钥或256位或更大的椭圆曲线(ECC)密钥进行签名,无效证书将导致连接失败。

实现步骤

全局禁用ATS(不推荐)

若要全局禁用ATS,可在Info.plist文件中添加如下代码:

1
2
3
4
5
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>

这种方式会禁用整个应用的App Transport Security,允许应用无限制地通过HTTP(未加密)和HTTPS(加密)进行网络连接,可能会使应用及其用户面临安全漏洞,苹果在审核应用时可能会对此进行审查。

指定特定域名例外

推荐的做法是仅为特定需要使用HTTP的域名添加例外。在Info.plist文件中添加如下代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
<key>NSAppTransportSecurity</key>
<dict>
<key>NSExceptionDomains</key>
<dict>
<key>example.com</key>
<dict>
<key>NSIncludesSubdomains</key>
<true/>
<key>NSExceptionAllowsInsecureHTTPLoads</key>
<true/>
</dict>
</dict>
</dict>

上述代码允许应用与example.com及其子域名通过HTTP进行连接。

使用Xcode GUI添加配置

若不想直接编辑Info.plist文件,可通过Xcode的GUI界面进行配置:

  1. 点击左侧导航栏中的Info.plist文件。
  2. 在主区域添加配置:
    • 在最后一行点击“+”号。
    • 输入组名“App Transport Security Settings”。
    • 右键点击该组,选择“Add Row”。
    • 输入“Allow Arbitrary Loads”。
    • 将右侧的值设置为“YES”。

Cordova项目配置

对于Cordova项目,若要在ios.json中添加配置,可按如下操作:

1
2
3
4
5
6
7
8
9
"*-Info.plist": {
"parents": {
"NSAppTransportSecurity": [
{
"xml": "<dict><key>NSAllowsArbitraryLoads</key><true />&lt;/dict>"
}
]
}
}

核心代码

允许特定域名的HTTP请求

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<key>NSAppTransportSecurity</key>
<dict>
<key>NSExceptionDomains</key>
<dict>
<key>example.com</key>
<dict>
<key>NSIncludesSubdomains</key>
<true/>
<key>NSExceptionAllowsInsecureHTTPLoads</key>
<true/>
<key>NSExceptionMinimumTLSVersion</key>
<string>TLSv1.1</string>
</dict>
</dict>
</dict>

Swift 4和Xcode 10的配置

1
2
3
4
5
<key>App Transport Security Settings</key>
<dict>
<key>Allow Arbitrary Loads</key>
<true/>
</dict>

最佳实践

  • 优先使用HTTPS连接,若服务器支持,应将HTTP请求改为HTTPS请求。
  • 尽量避免全局禁用ATS,而是为特定域名添加例外。
  • 若必须禁用ATS,需在App Store Connect审核备注中详细说明原因,并确保应用和用户数据的安全。
  • 若使用NSExceptionDomains时发现某些资源无法加载,可使用远程调试工具检查并将外部域名添加到NSExceptionDomains中。

常见问题

全局禁用ATS的风险

全局禁用ATS会使应用及其用户面临安全风险,因为应用可以连接到不安全的服务器,敏感信息可能会被拦截或篡改。此外,苹果在审核应用时可能会对此进行审查,无正当理由禁用ATS的应用可能会受到审核限制。

指定域名例外仍无法解决问题

若指定域名例外后仍无法解决问题,可能是目标网站加载了来自外部域名的资源。可使用远程调试工具检查哪些资源无法加载,并将这些外部域名添加到NSExceptionDomains中。

如何检查服务器的ATS兼容性

可在终端中输入以下命令检查服务器的ATS兼容性:

1
/usr/bin/nscurl --ats-diagnostics --verbose https://www.example.com/whatever

该命令会检查请求是否失败,并尝试各种设置,告诉你哪些设置可以通过以及如何操作。


Transport security has blocked a cleartext HTTP
https://119291.xyz/posts/transport-security-blocked-cleartext-http/
作者
ww
发布于
2025年5月29日
许可协议