1. ホーム
  2. アイオス

[解決済み】CFNetwork SSLHandshakeが失敗する iOS 9

2022-04-13 10:04:55

質問

iOS 9 beta 1でこの問題が発生した人はいますか?

ウェブサービスに接続するために標準的なNSURLConnectionを使用していますが、ウェブサービスに電話をかけるとすぐに以下のエラーが発生します。 これは現在iOS 8.3で動作しています。

ベータ版のバグでしょうか?iOS 9の開発の初期段階であることは承知しています。

以下はエラーの全容です。

CFNetwork SSLHandshakeに失敗しました (-9824) NSURLSession/NSURLConnection の HTTP ロードに失敗しました (kCFStreamErrorDomainSSL, -9824)

 NSURLRequest * urlRequest = [NSURLRequest requestWithURL:[NSURL URLWithString:@"https://mywebserviceurl"]];
        NSURLResponse * response = nil;
        NSError * error = nil;
        NSData * data = [NSURLConnection sendSynchronousRequest:urlRequest
                                                  returningResponse:&response
                                                              error:&error];

解決方法は?

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>NSExceptionAllowsInsecureHTTPLoads</key>
      <true/>
      <!--Include to specify minimum TLS version-->
      <key>NSExceptionMinimumTLSVersion</key>
      <string>TLSv1.1</string>
    </dict>
  </dict>
</dict>

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

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

もし、この作業を行わなければならないのであれば、TLSv1.2とSSLを使うようにサーバーを更新するのが一番でしょう。これは一時的な回避策と考えるべきでしょう。

今日現在、プレリリース版のドキュメントでは、これらの設定オプションについて具体的な言及は一切ありません。言及されるようになったら、関連するドキュメントにリンクするよう、この回答を更新します。