iOS9 mendapatkan kesalahan "telah terjadi kesalahan SSL dan sambungan aman ke server tidak dapat dibuat"

Jawaban:

123

Untuk iOS9, Apple membuat keputusan radikal dengan iOS 9, menonaktifkan semua lalu lintas HTTP yang tidak aman dari aplikasi iOS, sebagai bagian dari App Transport Security (ATS) .

Untuk menonaktifkan ATS, Anda dapat mengikuti langkah-langkah ini dengan membuka Info.plist , dan menambahkan baris berikut:

<key>NSAppTransportSecurity</key>
  <dict>
      <key>NSAllowsArbitraryLoads</key>
      <true/>
  </dict>
Tony TRAN
sumber
46
Saya menambahkan baris di atas dalam plist, tetapi masih mendapatkan kesalahan berikut: Telah terjadi kesalahan SSL dan koneksi aman ke server tidak dapat dibuat. NSLocalizedRecoverySuggestion = Apakah Anda ingin tetap terhubung ke server ?, _kCFNetworkCFStreamSSLErrorOriginalValue = -9819 Saya menelepon permintaan HTTPS. Apakah ada opsi lain untuk HTTPS?
AiOsN
1
AiOsN = masalah yang sama di sini, apakah Anda menemukan solusinya?
Franck
5
Tampaknya salah tafsir yang umum, bahwa NSAllowsArbitraryLoads adalah tombol untuk mengaktifkan atau menonaktifkan ATS. Segera setelah Anda melakukan permintaan https: //, Anda harus memastikan, bahwa Anda memenuhi persyaratan ATS: sertifikat valid yang dipasang di server (tanpa karakter pengganti, sama persis dengan nama domain server), server mendukung TLS 1.2 dengan penerusan kerahasiaan.
Christian
@ Christian Apa sumber persyaratan ATS ini? Saya tidak dapat menemukan apa pun tentang tidak mendukung sertifikat wildcard.
Bart
@Bartosz Maaf, saya tidak bisa mengarahkan Anda ke dokumen resmi, itu hanya sesuatu yang kami amati saat memperbarui infrastruktur server kami.
Kristen
64

Meskipun mengizinkan beban sewenang-wenang ( NSAllowsArbitraryLoads = true) adalah solusi yang baik, Anda tidak boleh sepenuhnya menonaktifkan ATS melainkan mengaktifkan koneksi HTTP yang ingin Anda izinkan:

<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>
Stéphane Bruckert
sumber
2
Jauh lebih baik daripada mengabaikan semua masalah keamanan. Layanan Amazon S3 menggunakan enkripsi yang lemah, dan memuat langsung ke server mereka menyebabkan masalah, tetapi ini memungkinkan kami untuk hanya membuka url s3.amazonaws.com, menjaga sisanya tetap sebaris. Hebat!
mix3d
3
Server yang saya coba jangkau menggunakan TLSv1.0. Saya harus menambahkan NSExceptionMinimumTLSVersion untuk tls1.0 untuk melewati kesalahan SLL
Ispas Claudiu
Jawaban ini berhasil untuk saya. Saya menggunakan WKWebView dan mencoba membuat permintaan SSL ke server API.
Fan Jin
Hai @ Stéphane, saya mendapat situasi yang aneh. Ponsel saya menggunakan iOS versi 12.1.2, tetapi saya mendapat pesan kesalahan "Terjadi kesalahan SSL dan koneksi aman ke server tidak dapat dibuat". Apa yang saya lakukan adalah memperbarui file plist saya. Aplikasi berjalan dengan baik dan sekali lagi saya menghapus perubahan yang saya buat di info.plist. Sekarang sudah berjalan dengan baik. Jadi, saya tidak dapat menemukan alasan sebenarnya untuk kesalahan ini. Ada saran?
Mansuu ....
@Mansuu .... apakah Anda mencoba menggunakan TLSv1.0 seperti yang disarankan dalam komentar di atas?
Stéphane Bruckert
15

iOS 9 memaksa koneksi yang menggunakan HTTPS menjadi TLS 1.2 untuk menghindari kerentanan baru-baru ini. Di iOS 8 bahkan koneksi HTTP yang tidak terenkripsi didukung, sehingga versi TLS yang lebih lama juga tidak membuat masalah. Sebagai solusinya, Anda dapat menambahkan cuplikan kode ini ke Info.plist Anda:

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

* dirujuk ke App Transport Security (ATS)

masukkan deskripsi gambar di sini

TechSeeko
sumber
1
Untuk Swift 4+, Pengaturan Keamanan Transportasi Aplikasi -> Izinkan Beban Sewenang-wenang = YA
mehdigriche
14

Jika Anda hanya menargetkan domain tertentu, Anda dapat mencoba dan menambahkan ini di Info.plist aplikasi Anda:

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSExceptionDomains</key>
    <dict>
        <key>example.com</key>
        <dict>
            <key>NSExceptionRequiresForwardSecrecy</key>
            <false/>
            <key>NSIncludesSubdomains</key>
            <true/>
        </dict>
    </dict>
</dict>
Nathan Noble
sumber
Ini tidak berhasil untuk saya. Ya, saya memasukkan domain yang benar untuk "example.com".
Alyoshak
1
Ini bekerja untuk saya. ketika saya melakukan contoh hanya dengan "Izinkan Beban sewenang-wenang" bekerja tetapi setelah dihentikan. Ketika saya menggunakan kunci "NSExceptionRequiresForwardSecrecy" -> false dan "NSIncludesSubdomains" -> true, ini berfungsi dengan sempurna. Terima kasih banyak!
linhadiretalipe
1
Ini berhasil untuk saya juga! Meskipun saya menggunakan koneksi https, saya masih menghadapi masalah. Tidak ada dukungan untuk 'NSExceptionRequiresForwardSecrecy' saat ini. Dari apa yang saya baca, ini tidak perlu disebutkan sebelumnya, tetapi sepertinya mereka telah membuat ini wajib sekarang juga. PS: Saya mencoba dengan iOS 10.2.1
Vaibhav Misra
6

Tampaknya iOS 9.0.2 melanggar permintaan ke titik akhir HTTPS yang valid. Kecurigaan saya saat ini adalah membutuhkan sertifikat SHA-256 atau gagal dengan kesalahan ini.

Untuk mereproduksi, periksa UIWebView Anda dengan safari, dan coba buka titik akhir HTTPS arbitrer:

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)

Sekarang coba buka google (karena tentu saja mereka memiliki sertifikat SHA-256):

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

Menambahkan pengecualian ke keamanan transportasi (seperti yang dijelaskan oleh jawaban @ stéphane-bruckert di atas) berfungsi untuk memperbaiki ini. Saya juga berasumsi bahwa menonaktifkan sepenuhnya NSAppTransportSecurityakan berfungsi juga, meskipun saya telah membaca bahwa menonaktifkannya sepenuhnya dapat membahayakan ulasan aplikasi Anda.

[EDIT] Saya telah menemukan bahwa hanya menghitung domain yang saya sambungkan di NSExceptionDomainsdict sudah memperbaiki masalah ini, bahkan ketika membiarkan NSExceptionAllowsInsecureHTTPLoadsset ke true. : \

steve
sumber
2

Masalahnya adalah sertifikat ssl di sisi server. Mungkin ada sesuatu yang mengganggu atau sertifikat tidak cocok dengan layanan. Misalnya ketika sebuah situs memiliki sertifikat ssl untuk www.mydomain.com sementara layanan yang Anda gunakan berjalan di myservice.mydomain.com. Itu adalah mesin yang berbeda.

Helge Becker
sumber
Saya mendapatkan masalah dengan beberapa url tetapi tidak yang lain di alamat ip yang sama (domain dan server)
user6631314
0

Proyek Xcode -> goto info.plist dan Klik + Tombol lalu Tambahkan (Pengaturan Keamanan Transportasi Aplikasi) Perluas, Izinkan Beban Sewenang-wenang, YA. Terima kasih

Shanmugasundharam
sumber
@AbdulYasin periksa plist Anda dan periksa apakah perubahan cuaca diperbarui atau tidak?
Shanmugasundharam
1
Jawaban "santai" ini sama sekali menghilangkan penjelasan dan risiko keamanan yang terkait dengan solusi ini.
Manuel
0

Dalam kasus saya, saya menghadapi masalah ini di simulator saya karena tanggal komputer saya ketinggalan dari tanggal saat ini. Jadi, periksa juga kasus ini saat Anda menghadapi kesalahan SSL.

Teena nath Paul
sumber
0

Saya mendapatkan kesalahan di bawah saat pemutaran

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>

Saya memastikan bahwa saya menambahkan entri di domain pengecualian di file plist dan NSAllowsArbitraryLoads disetel ke true dan saya masih melihat kesalahan.

Kemudian saya menyadari bahwa saya memainkan URL dengan https dan bukan http.

Saya mengatur url video ke http dan masalah terpecahkan.

Naren
sumber
0

Saya mendapatkan kesalahan ini untuk beberapa panggilan jaringan dan bukan yang lain. Saya terhubung ke wifi umum. Wifi gratis itu sepertinya merusak URL tertentu dan karenanya terjadi kesalahan.

Ketika saya terhubung ke LTE, kesalahan itu hilang!

Madu
sumber