Sejak saya meningkatkan proyek saya yang sudah ada dengan iOS 9, saya terus mendapatkan kesalahan:
Telah terjadi kesalahan SSL dan koneksi aman ke server tidak dapat dibuat.
Sejak saya meningkatkan proyek saya yang sudah ada dengan iOS 9, saya terus mendapatkan kesalahan:
Telah terjadi kesalahan SSL dan koneksi aman ke server tidak dapat dibuat.
Jawaban:
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>
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>
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)
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>
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 NSAppTransportSecurity
akan 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 NSExceptionDomains
dict sudah memperbaiki masalah ini, bahkan ketika membiarkan NSExceptionAllowsInsecureHTTPLoads
set ke true. : \
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.
Saya mendapatkan kesalahan yang sama ketika saya menentukan URL HTTPS saya sebagai: https://www.mywebsite.com . Namun itu berfungsi dengan baik ketika saya menentukannya tanpa tiga W sebagai: https://mywebsite.com .
Proyek Xcode -> goto info.plist dan Klik + Tombol lalu Tambahkan (Pengaturan Keamanan Transportasi Aplikasi) Perluas, Izinkan Beban Sewenang-wenang, YA. Terima kasih
Masalah saya adalah NSURLConnection
dan itu sudah tidak digunakan lagi di iOS9 jadi saya mengubah semua API menjadi NSURLSession
dan itu memperbaiki masalah saya.
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.
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.