chr*_*son 9 ssl ios app-transport-security xcode9.2
我无法在Xcode 9.2中禁用App Transport Security(ATS).我(多年来)在针对我的本地服务器环境运行构建时禁用ATS,如下所示:
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
Run Code Online (Sandbox Code Playgroud)
在Xcode 9.2中,一个简单的请求(在http模式下针对本地Rails应用程序运行):
let session = URLSession(configuration: .default)
let url = URL(string: "http://store.dev/api/products.json")!
let task = session.dataTask(with: url) { data, response, error in
print(data)
print(response)
print(error)
}
task.resume()
Run Code Online (Sandbox Code Playgroud)
失败并显示错误消息
错误域= NSURLErrorDomain代码= -1200"发生SSL错误,无法与服务器建立安全连接." UserInfo = {_ kCFStreamErrorCodeKey = -9802,NSLocalizedRecoverySuggestion =您是否还要连接到服务器?,NSUnderlyingError = 0x60c00024afb0 {错误域= kCFErrorDomainCFNetwork代码= -1200"(null)"UserInfo = {_ kCFStreamPropertySSLClientCertificateState = 0,_kCFNetworkCFStreamSSLErrorOriginalValue = -9802, _kCFStreamErrorDomainKey = 3,_kCFStreamErrorCodeKey = -9802}},NSLocalizedDescription =发生了SSL错误,无法建立与服务器的安全连接.,NSErrorFailingURLKey = https://store.dev/api/products.json,NSErrorFailingURLStringKey = https: //store.dev/api/products.json,_kCFStreamErrorDomainKey = 3}
这个完全相同的请求(同样的项目)在Xcode 9.1上取得了成功.
在这两种情况下,我都是针对iOS 11.1部署目标而构建的.您可以看到Xcode正在将URL从http更改为https,这是我不想要的.
以下是在Xcode 9.1中工作的超级基础项目的链接,但在9.2(https://github.com/chrismanderson/ats-sample)中失败.
我也尝试过仅为本store.dev
地域禁用ATS ,并且它再次适用于Xcode 9.1但不适用于9.2.
我最初并没有将它整合在一起,但我认为正在发生的事情是,在iOS 11中,Apple正在支持HSTS.我相信支持HSTS预加载列表,结合Google最近将.dev TLD添加到HSTS预加载列表,可能会导致iOS尝试强制您使用https,这是失败的(我错过了您尝试使用用于测试的.dev本地域,这实际上是关键元素).
我认为您唯一的解决方案是将本地测试域更改为.dev域以外的域.如果您这样做,您应该能够连接,并且它不会尝试强制您在本地开发环境中进行https.
简而言之,Google已获得.dev顶级域名的权利,并且最近将其添加到HSTS预加载列表中,以强制与.dev域的所有通信都是安全的.在支持HSTS预加载列表的设备上,这会导致所有流量通过HTTPS重定向,这将导致不支持HTTPS的服务器出错.
归档时间: |
|
查看次数: |
3714 次 |
最近记录: |