Saya memiliki kode sederhana berikut untuk terhubung ke halaman web SSL
NSMutableURLRequest *urlRequest=[NSMutableURLRequest requestWithURL:url];
[ NSURLConnection sendSynchronousRequest: urlRequest returningResponse: nil error: &error ];
Kecuali itu memberikan kesalahan jika sertifikat itu ditandatangani sendiri. Error Domain=NSURLErrorDomain Code=-1202 UserInfo=0xd29930 "untrusted server certificate".
Apakah ada cara untuk mengaturnya untuk menerima koneksi (seperti di browser Anda dapat menekan accept) atau cara untuk memotongnya?
-(void)connection:(NSURLConnection *)connection willSendRequestForAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge
metode harus digunakan sebagai gantinya.Jika Anda tidak ingin (atau tidak dapat) menggunakan API pribadi, ada pustaka sumber terbuka (lisensi BSD) yang disebut ASIHTTPRequest yang menyediakan pembungkus di sekitar level yang lebih rendah
CFNetwork APIs
. Mereka baru-baru ini memperkenalkan kemampuan untuk mengizinkanHTTPS connections
menggunakan sertifikat yang ditandatangani sendiri atau tidak dipercaya dengan-setValidatesSecureCertificate:
API. Jika Anda tidak ingin menarik seluruh pustaka, Anda bisa menggunakan sumber itu sebagai referensi untuk mengimplementasikan fungsi yang sama sendiri.sumber
Idealnya, seharusnya hanya ada dua skenario kapan aplikasi iOS perlu menerima sertifikat yang tidak dipercaya.
Skenario A: Anda terhubung ke lingkungan pengujian yang menggunakan sertifikat yang ditandatangani sendiri.
Skenario B: Anda sedang Proxy
HTTPS
trafik menggunakanMITM Proxy like Burp Suite, Fiddler, OWASP ZAP, etc.
The Proxies akan mengembalikan sertifikat yang ditandatangani oleh CA yang ditandatangani sendiri sehingga proxy dapat menangkapHTTPS
traffic.Host produksi tidak boleh menggunakan sertifikat yang tidak dipercaya untuk alasan yang jelas .
Jika Anda perlu agar simulator iOS menerima sertifikat yang tidak tepercaya untuk tujuan pengujian, sangat disarankan agar Anda tidak mengubah logika aplikasi agar menonaktifkan validasi sertifikat bawaan yang disediakan oleh
NSURLConnection
API. Jika aplikasi ini dirilis ke publik tanpa menghapus logika ini, itu akan rentan terhadap serangan man-in-the-middle.Cara yang disarankan untuk menerima sertifikat yang tidak tepercaya untuk tujuan pengujian adalah dengan mengimpor sertifikat Certificate Authority (CA) yang menandatangani sertifikat ke iOS Simulator atau perangkat iOS Anda. Saya menulis posting blog cepat yang menunjukkan bagaimana melakukan ini di mana iOS Simulator di:
menerima sertifikat yang tidak dipercaya menggunakan simulator ios
sumber
NSURLRequest
memiliki metode pribadi yang disebutsetAllowsAnyHTTPSCertificate:forHost:
, yang akan melakukan apa yang Anda inginkan. Anda bisa mendefinisikanallowsAnyHTTPSCertificateForHost:
metode padaNSURLRequest
melalui kategori, dan mengaturnya untuk kembaliYES
untuk host yang ingin Anda timpa.sumber
Untuk melengkapi jawaban yang diterima, untuk keamanan yang jauh lebih baik, Anda dapat menambahkan sertifikat server atau sertifikat CA root Anda sendiri ke gantungan kunci ( https://stackoverflow.com/a/9941559/1432048 ), namun melakukan hal ini sendirian tidak akan membuat NSURLConnection otentikasi server yang Anda tandatangani sendiri secara otomatis. Anda masih perlu menambahkan kode di bawah ini ke delegasi NSURLConnection Anda, disalin dari kode sampel Apple AdvancedURLConnections , dan Anda perlu menambahkan dua file (Credentials.h, Credentials.m) dari kode sampel apple ke proyek Anda.
sumber
Saya tidak dapat mengambil kredit untuk ini, tetapi yang saya temukan ini bekerja dengan sangat baik untuk kebutuhan saya.
shouldAllowSelfSignedCert
adalahBOOL
variabel saya . Cukup tambahkan keNSURLConnection
delegasi Anda dan Anda harus rockin untuk memotong cepat berdasarkan basis koneksi.sumber
Di iOS 9, koneksi SSL akan gagal untuk semua sertifikat yang tidak sah atau ditandatangani sendiri. Ini adalah perilaku default fitur Keamanan Transportasi Aplikasi baru di iOS 9.0 atau lebih baru, dan pada OS X 10.11 dan yang lebih baru.
Anda dapat mengganti perilaku ini di
Info.plist
, dengan mengaturNSAllowsArbitraryLoads
keYES
dalamNSAppTransportSecurity
kamus. Namun, saya sarankan mengganti pengaturan ini untuk tujuan pengujian saja.Untuk informasi, lihat App Transport Technote di sini .
sumber
Pemecahan masalah kategori yang diposting oleh Nathan de Vries akan melewati pemeriksaan API AppStore pribadi, dan berguna dalam kasus di mana Anda tidak memiliki kendali atas
NSUrlConnection
objek. Salah satu contoh adalahNSXMLParser
yang akan membuka URL yang Anda berikan, tetapi tidak mengeksposNSURLRequest
atauNSURLConnection
.Di iOS 4 solusinya tampaknya masih berfungsi, tetapi hanya pada perangkat, Simulator tidak lagi menggunakan
allowsAnyHTTPSCertificateForHost:
metode ini.sumber
Anda harus menggunakan
NSURLConnectionDelegate
untuk mengizinkan koneksi HTTPS dan ada panggilan balik baru dengan iOS8.Usang:
Alih-alih itu, Anda perlu mendeklarasikan:
Dengan
willSendRequestForAuthenticationChallenge
Anda dapat menggunakanchallenge
seperti yang Anda lakukan dengan metode yang sudah usang, misalnya:sumber
Saya memposting beberapa kode inti (berdasarkan pada karya orang lain yang saya catat) yang memungkinkan Anda mengautentikasi dengan benar terhadap sertifikat yang dihasilkan sendiri (dan cara mendapatkan sertifikat gratis - lihat komentar di bawah Cocoanetics )
Kode saya di sini github
sumber
Jika Anda ingin tetap menggunakan sendSynchronousRequest saya bekerja dalam solusi ini:
Anda dapat melihatnya di sini: Objective-C SSL Synchronous Connection
sumber
Dengan AFNetworking, saya berhasil menggunakan layanan web https dengan kode di bawah ini,
sumber
Anda dapat menggunakan Kode ini
Gunakan
-connection:willSendRequestForAuthenticationChallenge:
sebagai ganti dari Metode-Metode Kuno iniUsang:
sumber