Xcode 7をインストールし、iOS 9でアプリを実行しようとしました。悪名高いエラーが発生しています:Connection failed! Error - -1200 An SSL error has occurred and a secure connection to the server cannot be made.
問題は、サーバーがTLSv1.2をサポートしており、NSURLSession
を使用していることです。
では何が問題なのでしょうか?
Appleは App Transport Security の完全な要件リストをリリースしました。
TLS v1.2で作業していたが、他の要件の一部が欠落していることが判明しました。
完全なチェックリストは次のとおりです:
受け入れられる暗号は次のとおりです:
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
IOS9では、Apple App Transport Security(ATS)と呼ばれる新しい機能が追加されました。
ATSは、HTTPSの使用など、ネットワークコール中にベストプラクティスを実施します。
Appleプレリリースドキュメント:
ATSは偶発的な開示を防ぎ、安全なデフォルト動作を提供し、採用が容易です。新しいアプリを作成するか、既存のアプリを更新するかに関係なく、できるだけ早くATSを採用する必要があります。
新しいアプリを開発する場合は、HTTPSのみを使用する必要があります。既存のアプリがある場合は、現時点でできるだけHTTPSを使用し、アプリの残りの部分をできるだけ早く移行する計画を作成する必要があります。
Info.plistに以下のキーを追加して、参照してください。
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
特定の例外を追加することもできますが、
<key>NSAppTransportSecurity</key>
<dict>
<key>NSExceptionDomains</key>
<dict>
<key>testdomain.com</key>
<dict>
<key>NSIncludesSubdomains</key>
<false/>
<key>NSExceptionAllowInsecureHTTPSLoads</key>
<false/>
<key>NSExceptionRequiresForwardSecrecy</key>
<true/>
<key>NSExceptionMinimumTLSVersion</key>
<string>TLSv1.2</string>
<key>NSThirdPartyExceptionAllowInsecureHTTPSLoads</key>
<false/>
<key>NSThirdPartyExceptionRequiresForwardSecrecy</key>
<true/>
<key>NSThirdPartyExceptionMinimumTLSVersion</key>
<string>TLSv1.2</string>
<key>NSRequiresCertificateTransparency</key>
<false/>
</dict>
...
</dict>
</dict>
this doc that Apple提供。
IOS 9の実行時に同様の問題があり、それを修正するためにNSAppTransportSecurity
辞書を追加し、NSAllowsArbitraryLoads
Bool
をtrue
に設定してinfo.plist
ファイルに追加しました。
これがお役に立てば幸いです!
私にとってプロキシは別のソースからインターネットを使用しようとするとブロックされていた問題を解決します。 Wifi、Lanなど.
IOS9でも同じ問題がありました: SSLlab 結果はサーバー上のプロトコル/暗号に問題はありませんでしたが、iOS/9.3.5でSSL-エラー:
Connection cannot be established.
私の愚かな間違いは、リダイレクトがあったこと、すなわちNGINX(およびApacheでも同様)でした:
rewrite /calendar $scheme://www.example.org/resources/calendar;
ユーザーが設定によって/calender
にアクセスした場合:
https://example.org/calendar
サーバーが別のドメインにリダイレクトされ、SSL接続の確立が中断されました。
次のようにリダイレクトを設定すると修正されました。
rewrite /calendar $scheme://$server_name/resources/calendar;