2

状況:

開発用とステージング用に、これら 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 をバイパスしようとしたいくつかの方法は次のとおりです。

  1. my に以下を追加してplist、任意のロードを許可します。

    <key>NSAppTransportSecurity</key>
    <dict>
        <key>NSAllowsArbitraryLoads</key>
        <true/>
    </dict>
    
  2. ドメインの例外を明示的に定義します。

    <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>
    

これが私のスクリーンショットですplistここに画像の説明を入力

  1. また、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)
    
  2. URL を開いて、デバイスとシミュレーターに証明書をダウンロードします。

上記のすべての手順を実行しても、同じエラーが発生します。私が間違っていたことと、この問題を解決するために何ができるかを教えてください。ところで、サーバー側のソリューションを回避できれば素晴らしいことです。

前もって感謝します。

参考文献:

4

2 に答える 2

2

ホスト名だけでポリシーを定義します。

// Disable Policies
let policies: [String: ServerTrustPolicy] = [
    "example.entrydns.org": .DisableEvaluation
]
于 2016-08-12T09:57:01.063 に答える