绕过App Transport Security以允许不安全的HTTP服务器

时间:2016-08-12 08:38:31

标签: swift ios9 alamofire app-transport-security moya

情况:

我必须连接到这两个不同的服务器以进行开发和暂存使用。两台服务器都有不受信任的SSL证书。 例如,这两个服务器的URL是:

转移服务器:"IN"

开发服务器:https://52.70.13.2:1010/

每当我尝试调用API时,我都会得到空响应并出现以下错误:

https://example.entrydns.org:1012

或有时,

NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9802)

我使用Moya作为我的网络图层,这基本上只是Alamofire的一个不错的包装器。有关其他信息,我使用NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9813) ,该应用仅支持XCode 7.3

我做了什么:

我非常了解Apple希望强制执行的App Transport Security问题。我想禁用它进行开发但仍然徒劳无功。我尝试绕过ATS的一些方法如下:

  1. 在我的> iOS 9中添加以下内容以允许任意加载。

    plist
  2. 明确定义域例外。

    <key>NSAppTransportSecurity</key>
    <dict>
        <key>NSAllowsArbitraryLoads</key>
        <true/>
    </dict>
    
  3. 以下是我<key>NSAppTransportSecurity</key> <dict> <key>NSExceptionDomains</key> <dict> <key>example.entrydns.org</key> <dict> <key>NSIncludesSubdomains</key> <true/> <key>NSExceptionAllowsInsecureHTTPLoads</key> <true/> <key>NSExceptionRequiresForwardSecrecy</key> <true/> <key>NSExceptionMinimumTLSVersion</key> <string>TLSv1.1</string> <key>NSThirdPartyExceptionAllowsInsecureHTTPLoads</key> <false/> <key>NSThirdPartyExceptionRequiresForwardSecrecy</key> <true/> <key>NSThirdPartyExceptionMinimumTLSVersion</key> <string>TLSv1.1</string> <key>NSRequiresCertificateTransparency</key> <false/> </dict> </dict> </dict> 的屏幕截图: enter image description here

    1. 我还尝试禁用Alamofire管理器共享实例的服务器信任策略。这是示例代码:

      plist
    2. 打开网址并在我的设备和模拟器上下载证书。

    3. 即使经过上述所有步骤,我仍然遇到同样的错误。我做错了什么以及我能做些什么来解决这个问题?顺便说一句,如果我能避免服务器端解决方案,那就太好了。

      提前致谢。

      参考文献:

2 个答案:

答案 0 :(得分:2)

仅使用主机名定义您的政策。

// Disable Policies
let policies: [String: ServerTrustPolicy] = [
    "example.entrydns.org": .DisableEvaluation
]

答案 1 :(得分:0)

我是ServerTrustPolicyManager的子类,以便处理自签名的https认证。

internal class MyServerTrustPolicyManager: ServerTrustPolicyManager {
    // In order to trust all self-signed https certifications.
    open override func serverTrustPolicy(forHost host: String) -> ServerTrustPolicy? {
        return ServerTrustPolicy.disableEvaluation
    }
}



然后,创建一个高于SessionManager的自定义ServerTrustPolicyManager

// Create a `SessionManager` of Alamofire based on custom trust policy manager
func getHttpManager(timeout: TimeInterval) -> SessionManager {
    let sessionConfig = URLSessionConfiguration.default
    sessionConfig.timeoutIntervalForRequest = timeout
    sessionConfig.timeoutIntervalForResource = timeout

    sessionConfig.requestCachePolicy = .reloadIgnoringLocalCacheData
    sessionConfig.httpAdditionalHeaders = Alamofire.SessionManager.defaultHTTPHeaders

    // Use customize policy
    let trustPolicies = MyServerTrustPolicyManager(policies: [:])

    let manager = Alamofire.SessionManager(configuration: sessionConfig, delegate: SessionDelegate(), serverTrustPolicyManager: trustPolicies)
    return manager
}