207

iOS 9 ベータ 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];
4

11 に答える 11

310

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>

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

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

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

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

于 2015-06-08T23:58:56.327 に答える
66

iOS 10 以降では、TLS 文字列は「TLSv1.0」の形式でなければなりません。「1.0」だけではいけません。(はぁ)


他の回答の次の組み合わせが機能します。

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>
于 2015-06-17T03:52:34.733 に答える
33

詳細情報iOS 9 および OSX 10.11 での App Transport Security Exceptions の設定

不思議なことに、URL を誤って構成してしまった可能性があるコードのミスから保護するために、接続が http プロトコルを https に変更しようとすることに気付くでしょう。場合によっては、これが実際に機能することもありますが、混乱も招きます。

この「App Transport Security を使用してアプリを出荷する」では、いくつかの優れたデバッグのヒントについて説明します

ATS の失敗

ほとんどの ATS 障害は、-9800 シリーズのコードで CFError として表示されます。これらは、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
于 2015-08-17T08:41:00.097 に答える
2

バックエンドが安全な接続を使用している場合は、NSURLSession を使用して取得します

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

特にATSバージョンとSSL証明書情報を取得するには、サーバー構成を確認する必要があります:

サーバーがATSの最小要件(v1.2)を満たしていない場合(またはサーバー側を修正することをお勧めします)に備えて、設定して安全でない接続を許可するだけでなく、セキュリティNSExceptionAllowsInsecureHTTPLoads = YESの低下を許可する必要があります。

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

<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) キー 証明書が無効な場合、ハード エラーが発生し、接続できなくなります。

次の接続暗号は、前方秘匿性 (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 は最小限のプロトコル バージョンのみを提供することが判明しました Protocol : TLSv1 リンク

于 2015-12-09T21:40:29.220 に答える
2

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

この投稿によると、その種の規約の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>
于 2016-12-06T11:52:29.390 に答える
1

もう 1 つの便利なツールは 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
于 2016-08-11T14:28:11.483 に答える
0

プロジェクト .plistファイルに次の権限を追加します。

<key>NSAppTransportSecurity</key>
<dict>
    <!--Connect to anything (this is probably BAD)-->
    <key>NSAllowsArbitraryLoads</key>
    <true/>
</dict>
于 2016-03-30T10:59:30.247 に答える
0

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

于 2017-01-04T11:51:55.650 に答える
0

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>

于 2016-06-03T10:47:20.220 に答える
0

更新された回答 (WWDC 2016 以降):

iOS アプリでは、2016 年末までに安全な HTTPS 接続が必要になります。ATS をオフにしようとすると、将来的にアプリが拒否される可能性があります。

App Transport Security (ATS) は、Apple が iOS 9 で導入した機能です。ATS を有効にすると、非セキュア HTTP ではなく、HTTPS 接続を介してアプリが強制的に Web サービスに接続されます。

ただし、上記の回答で述べたように、開発者は引き続き ATS をオフにして、アプリが HTTP 接続経由でデータを送信できるようにすることができます。2016 年末に、Apple は、App Store にアプリを提出することを希望するすべての開発者に対してATS を必須にする予定です。リンク

于 2016-06-15T10:39:21.170 に答える