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];
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を使用するようにサーバーを更新することをお勧めします(まだ使用していない場合)。これは一時的な回避策と考えるべきです。
本日現在、プレリリース版のドキュメントでは、これらの構成オプションについて具体的な言及はありません。完了したら、回答を更新して関連ドキュメントにリンクします。
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>
詳細情報 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
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>
あなたのバックエンドが安全な接続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が必要です。
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 リンク
別の便利なツールは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
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>
私がテストしたデバイスは、間違った時間に設定されていました。だから私はすぐに使い果たされる証明書でページにアクセスしようとすると、証明書がデバイスの有効期限が切れていたのでアクセスを拒否します。修正するには、デバイスに適切な時間を設定してください。
最新の回答(ポスト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>
このエラーは、バグのある/クラッシュの多いCordova iOSバージョンを使用しているときに、ログに表示されることがありました。それは私がcordova iOSをアップグレードまたはダウングレードしたときに消えました。
接続していたサーバーがTLSv1.2 SSLを使用していたので、それが問題ではないことがわかりました。