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 |
|
这种方式会禁用整个应用的App Transport Security,允许应用无限制地通过HTTP(未加密)和HTTPS(加密)进行网络连接,可能会使应用及其用户面临安全漏洞,苹果在审核应用时可能会对此进行审查。
指定特定域名例外
推荐的做法是仅为特定需要使用HTTP的域名添加例外。在Info.plist
文件中添加如下代码:
1 |
|
上述代码允许应用与example.com
及其子域名通过HTTP进行连接。
使用Xcode GUI添加配置
若不想直接编辑Info.plist
文件,可通过Xcode的GUI界面进行配置:
- 点击左侧导航栏中的
Info.plist
文件。 - 在主区域添加配置:
- 在最后一行点击“+”号。
- 输入组名“App Transport Security Settings”。
- 右键点击该组,选择“Add Row”。
- 输入“Allow Arbitrary Loads”。
- 将右侧的值设置为“YES”。
Cordova项目配置
对于Cordova项目,若要在ios.json
中添加配置,可按如下操作:
1 |
|
核心代码
允许特定域名的HTTP请求
1 |
|
Swift 4和Xcode 10的配置
1 |
|
最佳实践
- 优先使用HTTPS连接,若服务器支持,应将HTTP请求改为HTTPS请求。
- 尽量避免全局禁用ATS,而是为特定域名添加例外。
- 若必须禁用ATS,需在App Store Connect审核备注中详细说明原因,并确保应用和用户数据的安全。
- 若使用
NSExceptionDomains
时发现某些资源无法加载,可使用远程调试工具检查并将外部域名添加到NSExceptionDomains
中。
常见问题
全局禁用ATS的风险
全局禁用ATS会使应用及其用户面临安全风险,因为应用可以连接到不安全的服务器,敏感信息可能会被拦截或篡改。此外,苹果在审核应用时可能会对此进行审查,无正当理由禁用ATS的应用可能会受到审核限制。
指定域名例外仍无法解决问题
若指定域名例外后仍无法解决问题,可能是目标网站加载了来自外部域名的资源。可使用远程调试工具检查哪些资源无法加载,并将这些外部域名添加到NSExceptionDomains
中。
如何检查服务器的ATS兼容性
可在终端中输入以下命令检查服务器的ATS兼容性:
1 |
|
该命令会检查请求是否失败,并尝试各种设置,告诉你哪些设置可以通过以及如何操作。