既存のプロジェクトを iOS 9 にアップグレードしたため、エラーが発生し続けます。
SSL エラーが発生したため、サーバーへの安全な接続を確立できません。
既存のプロジェクトを iOS 9 にアップグレードしたため、エラーが発生し続けます。
SSL エラーが発生したため、サーバーへの安全な接続を確立できません。
iOS9 に関して、Apple は iOS 9 で抜本的な決定を下し、App Transport Security (ATS)の一部として、iOS アプリからのすべてのセキュリティで保護されていない HTTP トラフィックを無効にしました。
ATS を単純に無効にするには、Info.plistを開き、次の行を追加して、この手順に従います。
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
任意のロード ( NSAllowsArbitraryLoads = true
) を許可することは適切な回避策ですが、ATS を完全に無効にするのではなく、許可する HTTP 接続を有効にする必要があります。
<key>NSAppTransportSecurity</key>
<dict>
<key>NSExceptionDomains</key>
<dict>
<key>yourserver.com</key>
<dict>
<!--Include to allow subdomains-->
<key>NSIncludesSubdomains</key>
<true/>
<!--Include to allow HTTP requests-->
<key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
<true/>
<!--Include to specify minimum TLS version-->
<key>NSTemporaryExceptionMinimumTLSVersion</key>
<string>TLSv1.1</string>
</dict>
</dict>
</dict>
特定のドメインのみをターゲットにしている場合は、アプリケーションの Info.plist にこれを追加してみてください。
<key>NSAppTransportSecurity</key>
<dict>
<key>NSExceptionDomains</key>
<dict>
<key>example.com</key>
<dict>
<key>NSExceptionRequiresForwardSecrecy</key>
<false/>
<key>NSIncludesSubdomains</key>
<true/>
</dict>
</dict>
</dict>
iOS 9 では、最近の脆弱性を回避するために、HTTPS を使用する接続を強制的に TLS 1.2 にします。iOS 8 では、暗号化されていない HTTP 接続もサポートされていたため、古いバージョンの TLS でも問題は発生しませんでした。回避策として、次のコード スニペットを Info.plist に追加できます。
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
iOS 9.0.2 では、有効な HTTPS エンドポイントへのリクエストが中断されているようです。私の現在の疑いは、SHA-256 証明書が必要であるか、このエラーで失敗することです。
再現するには、Safari で UIWebView を検査し、任意の HTTPS エンドポイントに移動してみてください。
location.href = "https://d37gvrvc0wt4s1.cloudfront.net/js/v1.4/rollbar.min.js"
// [Error] Failed to load resource: An SSL error has occurred and a secure connection to the server cannot be made. (rollbar.min.js, line 0)
次に、Google にアクセスしてみてください (もちろん、SHA-256 証明書があるため):
location.href = "https://google.com"
// no problemo
トランスポート セキュリティに例外を追加すると (上記の @stéphane-bruckert の回答で概説されているように)、これを修正できます。また、完全に無効にすることも機能するNSAppTransportSecurity
と思いますが、完全に無効にするとアプリのレビューが危険にさらされる可能性があると読みました.
NSExceptionDomains
[編集] dictで接続しているドメインを列挙するだけで、NSExceptionAllowsInsecureHTTPLoads
true に設定したままでもこの問題が解決することがわかりました。:\
問題は、サーバー側の SSL 証明書です。何かが干渉しているか、証明書がサービスと一致していません。たとえば、サイトに www.mydomain.com の ssl 証明書があり、使用しているサービスが myservice.mydomain.com で実行されている場合などです。あれは別の機械です。
Xcode プロジェクト -> info.plist に移動し、[+] ボタンをクリックしてから [追加] (App Transport Security 設定) を展開し、[任意の読み込みを許可] を [はい] に設定します。ありがとう