状況:
開発用とステージング用に、これら 2 つの異なるサーバーに接続する必要があります。どちらのサーバーにも、信頼されていない SSL 証明書があります。例として、これら 2 つのサーバーの URL は次のとおりです。
ステージング サーバー:https://52.70.13.2:1010/
開発サーバー:https://example.entrydns.org:1012
API を呼び出そうとすると、次のエラーで空の応答が返されます。
NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9802)
または時々、
NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9813)
私はネットワークレイヤーにMoyaを使用しています。これは基本的にAlamofireの素敵なラッパーです。追加情報については、私が使用XCode 7.3
し、アプリは のみをサポートしています> iOS 9
。
私がしたこと:
私は、Apple が強制しようとしている App Transport Security の問題を十分に認識しています。開発のために無効にしたかったのですが、それでも無駄です。ATS をバイパスしようとしたいくつかの方法は次のとおりです。
my に以下を追加して
plist
、任意のロードを許可します。<key>NSAppTransportSecurity</key> <dict> <key>NSAllowsArbitraryLoads</key> <true/> </dict>
ドメインの例外を明示的に定義します。
<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>
また、Alamofire マネージャー共有インスタンスのサーバー信頼ポリシーを無効にしようとしました。コード例は次のとおりです。
// Disable Policies let policies: [String: ServerTrustPolicy] = [ "https://example.entrydns.org:1012/": .DisableEvaluation, "https://52.70.13.2:1010/": .DisableEvaluation ] let manager = Manager( configuration: NSURLSessionConfiguration.defaultSessionConfiguration(), serverTrustPolicyManager: ServerTrustPolicyManager(policies: policies) ) // --------------- let networkLogger = NetworkLoggerPlugin(verbose: true, responseDataFormatter: nil) let endpointClosure = { (target: ExampleAPI) -> Endpoint<ExampleAPI> in let url = target.baseURL.URLByAppendingPathComponent(target.path).absoluteString let endpoint: Endpoint<ExampleAPI> = Endpoint<ExampleAPI> (URL: url, sampleResponseClosure: {.NetworkResponse(200, target.sampleData)}, method: target.method, parameters: target.parameters, parameterEncoding: .URLEncodedInURL) return endpoint.endpointByAddingHTTPHeaderFields(target.header()) } let ExampleProvider = MoyaProvider<ExampleAPI>(manager: manager, plugins:[networkLogger], endpointClosure: endpointClosure)
URL を開いて、デバイスとシミュレーターに証明書をダウンロードします。
上記のすべての手順を実行しても、同じエラーが発生します。私が間違っていたことと、この問題を解決するために何ができるかを教えてください。ところで、サーバー側のソリューションを回避できれば素晴らしいことです。
前もって感謝します。