NSURLSession / NSURLConnection HTTPロードがiOS 9で失敗しました


137

iOS9で既存のアプリを実行しようとしましたが、の使用中にエラーが発生しましたAFURLSessionManager

__block NSURLSessionDataTask *task = [self.sessionManager dataTaskWithRequest:request completionHandler:^(NSURLResponse * __unused response, id responseObject, NSError *error) {
    if (error) {

    } else {

    }
}];

[task resume];

次のエラーが発生します。

Error Domain=NSURLErrorDomain Code=-999 "cancelled.

次のログも取得しています:

 NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9824
 CFNetwork SSLHandshake failed (-9824)

更新: ソリューションに複数の更新を追加しました: NSURLSession / NSURLConnection HTTPロードがiOS 9で失敗しました


最初の行でエラーが発生しているのは確かですか?
BSMP 2015年

1
同じ問題がありました。これは問題をカバーするよう
phillies2628

回答:


240

見つかったソリューション:

iOS9では、ATSはHTTPSの使用を含むネットワークコール中にベストプラクティスを実施します。

Appleのドキュメントから:

ATSは、偶発的な開示を防ぎ、安全なデフォルトの動作を提供し、導入が簡単です。新しいアプリを作成する場合でも、既存のアプリを更新する場合でも、できるだけ早くATSを採用する必要があります。新しいアプリを開発している場合は、HTTPSのみを使用する必要があります。既存のアプリがある場合は、できる限りHTTPSを使用し、残りのアプリをできるだけ早く移行するための計画を作成する必要があります。

ベータ1では、現在、これをinfo.plistで定義する方法はありません。解決策はそれを手動で追加することです:

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
</dict>

ここに画像の説明を入力してください

Update1:これは、iOS9 ATSサポートを採用する準備ができるまでの一時的な回避策です。

Update2:詳細については、次のリンクを参照してください: http ://ste.vn/2015/06/10/configuring-app-transport-security-ios-9-osx-10-11/

Update3: TLS 1.0しかないホスト(YOURHOST.COM)に接続しようとしている場合

これらをアプリのInfo.plistに追加します

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSExceptionDomains</key>
    <dict>
        <key>YOURHOST.COM</key>
        <dict>
            <key>NSIncludesSubdomains</key>
            <true/>
            <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
            <true/>
            <key>NSTemporaryExceptionMinimumTLSVersion</key>
            <string>1.0</string>
            <key>NSTemporaryExceptionRequiresForwardSecrecy</key>
            <false/>
        </dict>
    </dict>
</dict>

10
アプリケーショントランスポートセキュリティを完全に削除したため、iOS 9の主要な機能の1つがアプリから削除されたことに注意してください。これはハックであり、そのハックによってapが拒否されても驚かないでしょう。この辞書に特定のWebサイトを追加することは、おそらく許可されます。
gnasher729 2015年

2
@StevenPeterson Appleはケースバイケースでアプリ全体を除外することしかできません。Appleがこの機能であなたのアプリを祝福すると、彼らはあなたにこのキーを含めるように指示すると思います。Appleがこれをめったに行わないことを期待してください。
mattyohe

8
どうぞ、お願いします、お願いします、お願いします-単に例外をplistに追加して「機能するから」に進んではいけません。ユーザーのデータのセキュリティを考慮し、SSLおよびその他のセキュリティのベストプラクティスを実装します。
サンタクロース

8
@ gnasher729、私はATSを無効にするだけでなく、TLS 1.2をサポートするほうがよいことを理解しています。ただし、サードパーティのAPI / Webサービスに依存している場合はどうすればよいでしょうか。強制的にアップグレードすることはできないので、どうすればよいですか?
ウッドストック

7
この回答には微妙なバグがNSTemporaryExceptionMinimumTLSVersionあります。たとえば、1.0ではなくTLSv1.0である必要があります。NSAppTransportSecurity 例外ドメインディクショナリキーを参照してください
mbi

54

iOS9でSSLを処理する方法、1つのソリューションは次のようにすることです:

アップルの発言: ここに画像の説明を入力してください ここに画像の説明を入力してください

ここに画像の説明を入力してください

iOS 9およびOSX 10.11では、アプリのInfo.plistファイルで例外ドメインを指定しない限り、データをリクエストする予定のすべてのホストでTLSv1.2 SSLが必要です。

Info.plist構成の構文は次のようになります。

<key>NSAppTransportSecurity</key>
<dict>
  <key>NSExceptionDomains</key>
  <dict>
    <key>yourserver.com</key>
    <dict>
      <!--Include to allow subdomains-->
      <key>NSIncludesSubdomains</key>
      <true/>
      <!--Include to allow insecure HTTP requests-->
      <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
      <true/>
      <!--Include to specify minimum TLS version-->
      <key>NSTemporaryExceptionMinimumTLSVersion</key>
      <string>TLSv1.1</string>
    </dict>
  </dict>
</dict>

アプリケーション(サードパーティのWebブラウザなど)が任意のホストに接続する必要がある場合は、次のように構成できます。

<key>NSAppTransportSecurity</key>
<dict>
    <!--Connect to anything (this is probably BAD)-->
    <key>NSAllowsArbitraryLoads</key>
    <true/>
</dict>

これを行う必要がある場合は、TLSv1.2とSSLを使用するようにサーバーを更新することをお勧めします(まだ使用していない場合)。これは一時的な回避策と考える必要があります。

現在のところ、プレリリースのドキュメントでは、これらの構成オプションについて特定の方法で言及されていません。完了したら、関連するドキュメントにリンクするように回答を更新します。

詳細については、iOS9AdaptationTipsにアクセスしてください


4
SSLとTLSは、HTTPSプロトコルで使用される異なる暗号化レイヤーです。したがって、SSLを完全に無効にし、TLS v1.2以降を使用する必要があります。詳細については、次のリソースから始めることをお勧めします。SSL/ TLSセキュリティ2015-簡略化されたクイックガイド
コンラッドテイラー

2
NSAllowsArbitraryLoadsをtrueに設定した一番下の例では、運を上げるだけです。私のサーバーはTLS v1.2を排他的に使用していますが、それを機能させるためにこれを行う必要があります。とてもイライラします。
スクーター2015

1
では、プロキシサービスなど、新しいアプリが確実にApp Storeで承認されるようにするために使用できる回避策はありますか?
Josh、

41

AppleのApp Transport Securityに関するTechnoteは非常に便利です。これは、問題に対するより安全な解決策を見つけるのに役立ちました。

うまくいけば、これは他の誰かを助けるでしょう。完全に有効なTLSv12 HTTPS URLであると思われるAmazon S3 URLへの接続に問題がありました。NSExceptionRequiresForwardSecrecyS3が使用する別の少数の暗号を有効にするには、無効にする必要があることがわかりました。

私たちの中でInfo.plist

<key>NSAppTransportSecurity</key>
<dict>
  <key>NSExceptionDomains</key>
  <dict>
    <key>amazonaws.com</key>
    <dict>
      <key>NSIncludesSubdomains</key>
      <true/>
      <key>NSExceptionRequiresForwardSecrecy</key>
      <false/>
    </dict>
  </dict>
</dict>

これは私の正確な問題であり、すぐに修正されました!感謝!:)
Alex Zak

これは私が抱えていた問題も解決します。ただし、ケースごとに異なる設定が必要になる場合があります。良いニュースは、彼のテクニカルノートには、一般的に正しい設定を見つけるのに役立つnsurlの使用方法に関する情報も含まれていることです。
ecotax 2015年

Amazon S3の前でCDNを使用した場合、cloudfront.netでも同じことをする必要がありました。
Raymond26

7

私としてAmazon S3でこの問題が発生している場合は、これをinfo.plistに最上位タグの直接の子として貼り付けてみてください

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSExceptionDomains</key>
    <dict>
        <key>amazonaws.com</key>
        <dict>
              <key>NSThirdPartyExceptionMinimumTLSVersion</key>
              <string>TLSv1.0</string>
              <key>NSThirdPartyExceptionRequiresForwardSecrecy</key>
              <false/>
              <key>NSIncludesSubdomains</key>
              <true/>
        </dict>
        <key>amazonaws.com.cn</key>
        <dict>
              <key>NSThirdPartyExceptionMinimumTLSVersion</key>
              <string>TLSv1.0</string>
              <key>NSThirdPartyExceptionRequiresForwardSecrecy</key>
              <false/>
              <key>NSIncludesSubdomains</key>
              <true/>
        </dict>
    </dict>
</dict>

あなたはより多くの情報を見つけることができます:

http://docs.aws.amazon.com/mobile/sdkforios/developerguide/ats.html#resolving-the-issue


2
神のご
加護があり

5

ここから解決策を見つけました。 そして、それは私のために働いています。

これを確認してください。

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSExceptionDomains</key>
         <dict>
             <key>myDomain.com</key>
                    <dict>
                      <!--Include to allow subdomains-->
                      <key>NSIncludesSubdomains</key>
                      <true/>
                      <!--Include to allow HTTP requests-->
                      <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
                      <true/>
                      <!--Include to specify minimum TLS version-->
                      <key>NSTemporaryExceptionMinimumTLSVersion</key>
                      <string>TLSv1.1</string>
                </dict>
          </dict>
</dict>

4

.plistファイルに次のフィールドを追加するだけです

ここに画像の説明を入力してください

構文は次のようになります。

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
</dict>

これにより、すべてのhttpリクエストが許可されます。動作しますが、推奨されません。
KVISH 2016年

2

更新:

Xcode 7.1以降、NSAppTransportSecurity辞書を手動でに入力する必要はありませんinfo.plist

オートコンプリートされ、ディクショナリであることを認識してから、Allows Arbitraryロードもオートコンプリートします。 info.plistスクリーンショット


これにより、すべてのhttpリクエストが許可されます。動作しますが、推奨されません。
KVISH 2016年

2

NSURLConnectionの解決Httpの読み込みに失敗したバグinfo.plistに次のDictを追加するだけです。

<key>NSAppTransportSecurity</key>
    <dict>
        <key>NSAllowsArbitraryLoads</key>
        <true/>
        <key>NSAllowsArbitraryLoadsInWebContent</key>
        <true/>
    </dict>

1

info.plistにいくつかのキーを追加することで解決しました。私が従った手順は次のとおりです。

プロジェクトのinfo.plistファイルを開きました

NSAppTransportSecurityというキーを辞書として追加しました。

NSAllowsArbitraryLoadsというサブキーをブール値として追加し、次の図のようにその値をYESに設定しました。ここに画像の説明を入力してください

プロジェクトをクリーンアップすると、以前と同様にすべてが正常に実行されます。

参照リンク:https : //stackoverflow.com/a/32609970


1

これは私がこのエラーを抱えたときに私のために働いたものです:

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSExceptionDomains</key>
    <dict>
        <key>example.com</key>
        <dict>
            <key>NSExceptionRequiresForwardSecrecy</key>
            <false/>
            <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
            <true/>
            <key>NSIncludesSubdomains</key>
            <true/>
            <key>NSTemporaryExceptionMinimumTLSVersion</key>
            <string>TLSv1.0</string>
        </dict>
    </dict>
</dict>

1

この関数をRCTHTTPRequestHandler.mファイルに追加してみてください。

- (void)URLSession:(NSURLSession *)session didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition disposition, NSURLCredential *credential))completionHandler { completionHandler(NSURLSessionAuthChallengeUseCredential, [NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust]); }



0

あなたは追加する必要がありますApp Transport Security Settingsinfo.plistして追加Allow Arbitrary LoadsしますApp Transport Security Settings

ここに画像の説明を入力してください

<key>NSAppTransportSecurity</key>
    <dict>
        <key>NSAllowsArbitraryLoads</key>
        <true/>
    </dict>
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.