iOS9で「SSLエラーが発生し、サーバーへの安全な接続を確立できない」というエラーが発生する


回答:


123

iOS9の場合、アップルはiOS 9で根本的な決定を行い、App Transport Security(ATS)の一環として、iOSアプリからのすべての非セキュアHTTPトラフィックを無効にしました。

ATSを無効にするには、Info.plistを開いて次の行を追加します。

<key>NSAppTransportSecurity</key>
  <dict>
      <key>NSAllowsArbitraryLoads</key>
      <true/>
  </dict>

45
上記の行をplistに追加しましたが、それでも次のエラーが発生します。SSLエラーが発生し、サーバーへの安全な接続を確立できません。NSLocalizedRecoverySuggestion =それでもサーバーに接続しますか?、_kCFNetworkCFStreamSSLErrorOriginalValue = -9819 HTTPSリクエストを呼び出しています。HTTPSの他のオプションはありますか?
AiOsN 2015年

1
AiOsN =ここで同じ問題、解決策を見つけましたか?
フランク

5
NSAllowsArbitraryLoadsがATSを有効または無効にするスイッチであるというのは、よくある誤解のようです。https://要求を実行したらすぐに、ATS要件を満たしていることを確認する必要があります。サーバーにインストールされた有効な証明書(ワイルドカードなし、サーバーのドメイン名と正確に一致)、サーバーはTLS 1.2をサポートします秘密。
クリスチャン

@クリスチャンこれらのATS要件のソースは何ですか?ワイルドカード証明書をサポートしないことについて何も見つかりません。
Bart

@Bartosz申し訳ありませんが、公式ドキュメントを紹介することはできません。これは、サーバーインフラストラクチャの更新時に確認したものにすぎません。
クリスチャン

64

任意のロード(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>

2
すべてのセキュリティ問題を無視するよりもはるかに優れています。AmazonのS3サービスは弱い暗号化を使用しており、サーバーに直接ロードすると問題が発生しましたが、これによりs3.amazonaws.comのURLだけを開いて残りをインラインに保つことができました。驚くばかり!
mix3d、2015

3
アクセスしようとしたサーバーはTLSv1.0を使用していました。SLLエラーをバイパスするには、tls1.0にNSExceptionMinimumTLSVersionを追加する必要がありました
Ispas Claudiu

この答えは私にとってうまくいきました。WKWebViewを使用していて、APIサーバーにSSLリクエストを送信しようとしました。
ファンジン

こんにちは@ステファン、私は奇妙な状況に遭遇しました。私の電話のiOSバージョンは12.1.2ですが、「SSLエラーが発生し、サーバーへの安全な接続を確立できません」というエラーが発生しました。私がしたことは私のplistファイルを更新したことです。アプリは正常に動作し、再びinfo.plistで行った変更を削除しました。今では問題なく動いています。そのため、このエラーの実際の理由を見つけることができません。なにか提案を?
Mansuu ....

@Mansuu ....上記のコメントで提案されているように、TLSv1.0を使用しようとしましたか?
ステファンBruckert

15

iOS 9では、最近の脆弱性を回避するために、HTTPSを使用している接続を強制的にTLS 1.2にしています。iOS 8では、暗号化されていないHTTP接続もサポートされていたため、古いバージョンのTLSでも問題は発生しませんでした。回避策として、このコードスニペットをInfo.plistに追加できます。

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
</dict>

* App Transport Security(ATS)を参照

ここに画像の説明を入力してください


1
Swift 4以降の場合、App Transport Security Settings-> Allow Arbitrary Loads = YES
mehdigriche

14

特定のドメインをターゲットにしている場合は、これをアプリケーションの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>

これは私にはうまくいきませんでした。はい、「example.com」の正しいドメインを入れました。
Alyoshak 2017年

1
それは私にとって仕事です。「任意のロードを許可する」機能のみを使用して例を実行したが、停止した後。「NSExceptionRequiresForwardSecrecy」キー-> falseおよび「NSIncludesSubdomains」-> trueキーを使用すると、完全に機能します。どうもありがとう!
linhadiretalipe 2017年

1
これも私にとってはうまくいきました!https接続を使用していますが、問題は解決していません。現在、「NSExceptionRequiresForwardSecrecy」はサポートされていません。私が読んだことから、これは以前に指定する必要はありませんでしたが、彼らもこれを現在必須にしているようです。PS:iOS 10.2.1で試していました
Vaibhav Misra 2017

6

iOS 9.0.2は有効なHTTPSエンドポイントへのリクエストを中断するようです。私の現在の疑いは、SHA-256証明書が必要であるか、このエラーで失敗することです。

再現するには、サファリを使用して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)

今度はグーグルに行ってみてください(もちろん、彼らはSHA-256証明書を持っているからです):

location.href = "https://google.com"
// no problemo

トランスポートセキュリティに例外を追加すると(上記の@stéphane-bruckertの回答で概説されています)、これを修正できます。完全に無効にすることも機能するとNSAppTransportSecurity思いますが、完全に無効にすることはアプリのレビューを危険にさらす可能性があることを読んだことがあります。

[編集]私が接続しているドメインをNSExceptionDomainsdictで列挙するだけで、このNSExceptionAllowsInsecureHTTPLoads設定をtrueのままにしてもこの問題が解決することがわかりました。:\


2

問題はサーバー側のssl証明書です。何かが干渉しているか、証明書がサービスと一致していません。たとえば、サイトにwww.mydomain.comのssl証明書があり、使用するサービスがmyservice.mydomain.comで実行されている場合です。それは別のマシンです。


同じIPアドレス(ドメインとサーバー)の一部のURLでのみ問題が発生します
user6631314


0

Xcodeプロジェクト-> goto info.plistをクリックし、[+]ボタンをクリックして、[追加(App Transport Security Settings)]、[許可]、[任意のロードを許可]の順に設定します。ありがとう


@AbdulYasinは、plistをチェックし、天気の変化が更新されているかどうかをチェックしますか?
Shanmugasundharam

1
この「くつろいだ」答えは、この回避策に関連する説明とセキュリティリスクを完全に省略しています。
マヌエル、


0

私の場合、コンピューターの日付が現在の日付より遅れているため、シミュレーターでこの問題に直面しました。SSLエラーが発生した場合は、このケースも確認してください。


0

再生時にエラーが発生しました

finished with error [-1200] Error Domain=NSURLErrorDomain Code=-1200 "An SSL error has occurred and a secure connection to the server cannot be made." UserInfo={NSErrorFailingURLStringKey=https://remote-abcabc-svc.an.abc.com:1935/abr/_definst_/smil:v2/video/492F2F82592F59EA74ABAA6B9D6E6F42/F6B1BD452132329FBACD32730862CAE0/091EAD80FE9BEDD52A2F33840CA3CBAC.v3.eng.smil/playlist.m3u8, NSLocalizedRecoverySuggestion=Would you like to connect to the server anyway?, _kCFStreamErrorDomainKey=3, _NSURLErrorFailingURLSessionTaskErrorKey=LocalDataTask <692A1174-DA1C-4267-9560-9020A79F8458>.<1>, _NSURLErrorRelatedURLSessionTaskErrorKey=(
    "LocalDataTask <692A1174-DA1C-4267-9560-9020A79F8458>

plistファイルの例外ドメインにエントリを追加し、NSAllowsArbitraryLoadsがtrueに設定されていることを確認しましたが、それでもエラーが発生していました。

次に、httpではなくhttpsでURLを再生していることに気付きました。

ビデオのURLをhttpに設定して問題を解決しました。


0

一部のネットワークコールでこのエラーが発生し、他のネットワークコールでは発生しませんでした。公衆無線LANに接続していた。その無料のwifiは特定のURLを改ざんしているようで、エラーが発生しました。

LTEに接続すると、エラーは解消されました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.