web-dev-qa-db-ja.com

IOS 9でCFNetwork SSLHandshakeが失敗しました

iOS 9 Beta 1を使用している人はこの問題を抱えていますか?

私は標準のNSURLConnectionを使用してWebサービスに接続し、Webサービスが呼び出されるとすぐに以下のエラーを受け取ります。これは現在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];
206
user3099837

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を使用するようにサーバーを更新することをお勧めします(まだ使用していない場合)。これは一時的な回避策と考えるべきです。

本日現在、プレリリース版のドキュメントでは、これらの構成オプションについて具体的な言及はありません。完了したら、回答を更新して関連ドキュメントにリンクします。

308
Steven Peterson

IOS 10以降では、TLS文字列は "TLSv1.0"の形式でなければなりません。それはただ "1.0"になることはできません。 (ため息)


他のAnswersの以下の組み合わせはうまくいきます。

TLS 1.0しか持たないホスト(YOUR_Host.COM)に接続しようとしているとしましょう。

これらをアプリのInfo.plistに追加してください。

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSExceptionDomains</key>
    <dict>
        <key>YOUR_Host.COM</key>
        <dict>
            <key>NSIncludesSubdomains</key>
            <true/>
            <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
            <true/>
            <key>NSTemporaryExceptionMinimumTLSVersion</key>
            <string>TLSv1.0</string>
            <key>NSTemporaryExceptionRequiresForwardSecrecy</key>
            <false/>
        </dict>
    </dict>
</dict>
64
Womble

詳細情報 iOS 9およびOSX 10.11でのApp Transportセキュリティ例外の構成

不思議なことに、あなたが誤ってURLを誤って設定しているかもしれないあなたのコードの間違いから保護するために接続がhttpプロトコルをhttpsに変更しようとしていることに気付くでしょう。いくつかのケースでは、これは実際にうまくいくかもしれませんが、それはまた混乱します。

この App Transport Securityでアプリを出荷 はいくつかの良いデバッグのヒントをカバーしています

ATSの失敗

ほとんどのATSエラーは、-9800シリーズのコードでCFエラーとして表示されます。これらはSecurity/SecureTransport.hヘッダに定義されています。

2015-08-23 06:34:42.700 SelfSignedServerATSTest[3792:683731] NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9813)

CFNETWORK_DIAGNOSTICS

失敗に関する詳細な情報をコンソールに表示するには、環境変数CFNETWORK_DIAGNOSTICSを1に設定します。

nscurl

このツールは、ATS例外のいくつかの異なる組み合わせを実行し、各ATS構成の下で特定のホストへの安全な接続を試み、結果を報告します。

nscurl --ats-diagnostics https://example.com
33
onmyway133

2日間の試行と失敗の後、私にとってうまくいったのはこのコード{ womble です。

1つの変更で、この post に従って、私たちはその種の規約の NSExceptionDomains 辞書に関連付けられたサブキーの使用をやめるべきです

  NSTemporaryExceptionMinimumTLSVersion

そして新しい条約で使う

  NSExceptionMinimumTLSVersion

代わりに。

アップルのドキュメント

私のコード

<key>NSAppTransportSecurity</key>
    <dict>
        <key>NSExceptionDomains</key>
        <dict>
            <key>YOUR_Host.COM</key>
            <dict>
                <key>NSExceptionAllowsInsecureHTTPLoads</key>
                <true/>
                <key>NSExceptionMinimumTLSVersion</key>
                <string>TLSv1.0</string>
                <key>NSExceptionRequiresForwardSecrecy</key>
                <false/>
                <key>NSIncludesSubdomains</key>
                <true/>
            </dict>
        </dict>
    </dict>
2
yehoni amran

あなたのバックエンドが安全な接続antを使っているのなら、NSURLSessionを使います。

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

特にATSのバージョンとSSL証明書を取得するには、サーバーの設定を確認する必要があります。

安全でない接続を許可する の代わりにNSExceptionAllowsInsecureHTTPLoads = YESを設定することで、代わりに 低セキュリティの許可を許可する がATSの最小要件(v1.2)を満たさない場合サーバー側を修正します。

単一サーバーへの低セキュリティの許可

<key>NSExceptionDomains</key>
<dict>
    <key>api.yourDomaine.com</key>
    <dict>
        <key>NSExceptionMinimumTLSVersion</key>
        <string>TLSv1.0</string>
        <key>NSExceptionRequiresForwardSecrecy</key>
        <false/>
    </dict>
</dict>

opensslクライアントを使用して証明書を調査し、opensslクライアントを使用してサーバー構成を取得します。

openssl s_client  -connect api.yourDomaine.com:port //(you may need to specify port or  to try with https://... or www.)

・・最後に見つける

SSL-Session:
    Protocol  : TLSv1
    Cipher    : AES256-SHA
    Session-ID: //
    Session-ID-ctx: 
    Master-Key: //
    Key-Arg   : None
    Start Time: 1449693038
    Timeout   : 300 (sec)
    Verify return code: 0 (ok)

App Transport Security(ATS)には、Transport Layer Security(TLS)プロトコルバージョン1.2が必要です。

ATSを使用して接続するための要件:

App Transport Security(ATS)を使用するためのWebサービス接続の要件には、サーバー、接続暗号、および証明書が含まれます。

証明書は、次の種類の鍵のいずれかで署名されている必要があります。

  • 少なくとも256のダイジェスト長を持つSecure Hash Algorithm 2(SHA-2)キー(つまり、SHA-256以上)
  • 少なくとも256ビットのサイズの楕円曲線暗号(ECC)鍵

  • 長さが2048ビット以上のRivest-Shamir-Adleman(RSA)キー無効な証明書は、ハードエラーになり、接続できません。

次の接続暗号は、Forward Secrecy(FS)をサポートし、ATSと連携します。

TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384 TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA

更新:opensslは最小限のプロトコルバージョンを提供するだけであることが判明しましたプロトコル:TLSv1 リンク

2
Idali

別の便利なツールはnmapです(brew install nmap)。

nmap --script ssl-enum-ciphers -p 443 google.com

出力する

Starting Nmap 7.12 ( https://nmap.org ) at 2016-08-11 17:25 IDT
Nmap scan report for google.com (172.217.23.46)
Host is up (0.061s latency).
Other addresses for google.com (not scanned): 2a00:1450:4009:80a::200e
PORT    STATE SERVICE
443/tcp open  https
| ssl-enum-ciphers: 
|   TLSv1.0: 
|     ciphers: 
|       TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA (secp256r1) - A
|       TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA (secp256r1) - A
|       TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA (secp256r1) - A
|       TLS_RSA_WITH_AES_128_CBC_SHA (rsa 2048) - A
|       TLS_RSA_WITH_3DES_EDE_CBC_SHA (rsa 2048) - C
|       TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA (secp256r1) - A
|       TLS_RSA_WITH_AES_256_CBC_SHA (rsa 2048) - A
|     compressors: 
|       NULL
|     cipher preference: server
|   TLSv1.1: 
|     ciphers: 
|       TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA (secp256r1) - A
|       TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA (secp256r1) - A
|       TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA (secp256r1) - A
|       TLS_RSA_WITH_AES_128_CBC_SHA (rsa 2048) - A
|       TLS_RSA_WITH_3DES_EDE_CBC_SHA (rsa 2048) - C
|       TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA (secp256r1) - A
|       TLS_RSA_WITH_AES_256_CBC_SHA (rsa 2048) - A
|     compressors: 
|       NULL
|     cipher preference: server
|   TLSv1.2: 
|     ciphers: 
|       TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA (secp256r1) - A
|       TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 (secp256r1) - A
|       TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 (secp256r1) - A
|       TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA (secp256r1) - A
|       TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384 (secp256r1) - A
|       TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 (secp256r1) - A
|       TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256 (secp256r1) - A
|       TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA (secp256r1) - A
|       TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 (secp256r1) - A
|       TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (secp256r1) - A
|       TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA (secp256r1) - A
|       TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 (secp256r1) - A
|       TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (secp256r1) - A
|       TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256 (secp256r1) - A
|       TLS_RSA_WITH_3DES_EDE_CBC_SHA (rsa 2048) - C
|       TLS_RSA_WITH_AES_128_CBC_SHA (rsa 2048) - A
|       TLS_RSA_WITH_AES_128_CBC_SHA256 (rsa 2048) - A
|       TLS_RSA_WITH_AES_128_GCM_SHA256 (rsa 2048) - A
|       TLS_RSA_WITH_AES_256_CBC_SHA (rsa 2048) - A
|       TLS_RSA_WITH_AES_256_CBC_SHA256 (rsa 2048) - A
|       TLS_RSA_WITH_AES_256_GCM_SHA384 (rsa 2048) - A
|     compressors: 
|       NULL
|     cipher preference: client
|_  least strength: C

Nmap done: 1 IP address (1 Host up) scanned in 5.48 seconds
1
Ryan Heitner

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>
0
ALOK KUMAR

私がテストしたデバイスは、間違った時間に設定されていました。だから私はすぐに使い果たされる証明書でページにアクセスしようとすると、証明書がデバイスの有効期限が切れていたのでアクセスを拒否します。修正するには、デバイスに適切な時間を設定してください。

0
Warpzit

最新の回答(ポストWWDC 2016):

iOSアプリは2016年末までに安全なHTTPS接続を必要とするでしょう。ATSをオフにしようとすると、あなたのアプリは将来拒否されるかもしれません。

ATSは、AppleがiOS 9で導入した機能です。ATSが有効になっていると、非セキュアHTTPではなくHTTPS接続でWebサービスに接続するようにアプリに強制します。

ただし、開発者は依然としてATSをオフにして、上記の回答で説明したように、アプリケーションがHTTP接続を介してデータを送信できるようにすることができます。 2016年末に、Appleは ATSを必須にします App Storeにアプリを送信することを希望するすべての開発者に対して/を設定します。リンク

あなたのプロジェクトの.plistファイルにこのパーミッションを追加してください:

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

このエラーは、バグのある/クラッシュの多いCordova iOSバージョンを使用しているときに、ログに表示されることがありました。それは私がcordova iOSをアップグレードまたはダウングレードしたときに消えました。

接続していたサーバーがTLSv1.2 SSLを使用していたので、それが問題ではないことがわかりました。

0
im3r3k