Pemilih implementasi HttpClient dan SSL/TLS untuk iOS/macOS
Pemilih Implementasi HttpClient untuk Xamarin.iOS, Xamarin.tvOS, dan Xamarin.Mac mengontrol implementasi mana yang HttpClient
akan digunakan. Anda dapat beralih ke implementasi yang menggunakan transportasi asli iOS, tvOS, atau macOS (NSUrlSession
atau CFNetwork
, tergantung pada OS). Yang terbalik adalah TLS 1.2-support, biner yang lebih kecil, dan unduhan yang lebih cepat; kelemahannya adalah mengharuskan perulangan peristiwa berjalan agar operasi asinkron dijalankan.
Proyek harus mereferensikan rakitan System.Net.Http .
Peringatan
April 2018 – Karena peningkatan persyaratan keamanan, termasuk kepatuhan PCI, penyedia cloud utama dan server web diharapkan berhenti mendukung versi TLS yang lebih lama dari 1.2. Proyek Xamarin yang dibuat di versi Visual Studio sebelumnya default untuk menggunakan versi TLS yang lebih lama.
Untuk memastikan aplikasi Anda terus bekerja dengan server dan layanan ini, Anda harus memperbarui proyek Xamarin Anda dengan pengaturan yang NSUrlSession
ditunjukkan di bawah ini, lalu membangun kembali dan menyebarkan ulang aplikasi Anda kepada pengguna Anda.
Memilih tumpukan HttpClient
Untuk menyesuaikan yang HttpClient
digunakan oleh aplikasi Anda:
- Klik dua kali Nama Proyek di Penjelajah Solusi untuk membuka Opsi Proyek.
- Beralih ke pengaturan Build untuk proyek Anda (misalnya, Build iOS untuk aplikasi Xamarin.iOS).
- Dari menu dropdown Implementasi HttpClient, pilih
HttpClient
jenis sebagai salah satu hal berikut: NSUrlSession (disarankan), CFNetwork, atau Terkelola.
Tip
Untuk TLS 1.2, opsi NSUrlSession
disarankan.
NSUrlSession
Handler NSURLSession
berbasis didasarkan pada kerangka kerja asli NSURLSession
yang tersedia di iOS 7 dan yang lebih baru.
Ini adalah pengaturan yang direkomendasikan.
Pro
- Ini menggunakan API asli untuk performa yang lebih baik dan ukuran yang dapat dieksekusi yang lebih kecil.
- Dukungan untuk standar terbaru seperti TLS 1.2.
Kontra
- Memerlukan iOS 7 atau yang lebih baru.
- Beberapa
HttpClient
fitur/opsi tidak tersedia.
CFNetwork
Handler CFNetwork
berbasis didasarkan pada kerangka kerja asli CFNetwork
yang tersedia di iOS 6 dan yang lebih baru.
Pro
- Ini menggunakan API asli untuk performa yang lebih baik dan ukuran yang dapat dieksekusi yang lebih kecil.
- Dukungan untuk standar yang lebih baru seperti TLS 1.2.
Kontra
- Memerlukan iOS 6 atau yang lebih baru.
- Tidak tersedia di watchOS.
- Beberapa fitur/opsi HttpClient tidak tersedia.
Terkelola
Handler Terkelola adalah handler HttpClient yang dikelola sepenuhnya yang telah dikirim dengan versi Xamarin sebelumnya.
Pro
- Ini memiliki set fitur yang paling kompatibel dengan Microsoft .NET dan versi Xamarin yang lebih lama.
Kontra
- Ini tidak sepenuhnya terintegrasi dengan OS Apple dan terbatas pada TLS 1.0. Ini mungkin tidak dapat terhubung ke server web atau layanan cloud yang aman di masa mendatang.
- Biasanya jauh lebih lambat pada hal-hal seperti enkripsi daripada API asli.
- Ini membutuhkan kode yang lebih terkelola, sehingga membuat aplikasi yang lebih besar dapat didistribusikan.
Mengatur HttpMessageHandler secara terprogram
Selain konfigurasi di seluruh proyek yang ditunjukkan di atas, Anda juga dapat membuat instans dan menyuntikkan yang HttpClient
diinginkan HttpMessageHandler
melalui konstruktor, seperti yang ditunjukkan dalam cuplikan kode ini:
// This will use the default message handler for the application; as
// set in the Project Options for the project.
HttpClient client = new HttpClient();
// This will create an HttpClient that explicitly uses the CFNetworkHandler
HttpClient client = new HttpClient(new CFNetworkHandler());
// This will create an HttpClient that explicitly uses NSUrlSessionHandler
HttpClient client = new HttpClient(new NSUrlSessionHandler());
Ini memungkinkan untuk menggunakan yang berbeda HttpMessageHandler
dari apa yang dideklarasikan dalam dialog Opsi Proyek.
Implementasi SSL/TLS
SSL (Secure Socket Layer) dan penerusnya, TLS (Transport Layer Security), memberikan dukungan untuk HTTP dan koneksi jaringan lainnya melalui System.Net.Security.SslStream
. Implementasi Xamarin.iOS, Xamarin.tvOS, atau Xamarin.Mac System.Net.Security.SslStream
akan memanggil implementasi SSL/TLS asli Apple alih-alih menggunakan implementasi terkelola yang disediakan oleh Mono. Implementasi asli Apple mendukung TLS 1.2.
Peringatan
Rilis Xamarin.Mac 4.8 yang akan datang hanya akan mendukung macOS 10.9 atau yang lebih tinggi. Versi Xamarin.Mac sebelumnya mendukung macOS 10.7 atau yang lebih tinggi, tetapi versi macOS yang lebih lama ini tidak memiliki infrastruktur TLS yang memadai untuk mendukung TLS 1.2. Untuk menargetkan macOS 10.7 atau macOS 10.8, gunakan Xamarin.Mac 4.6 atau yang lebih lama.
Keamanan Transportasi Aplikasi
App Transport Security (ATS) Apple memberlakukan koneksi aman antara sumber daya internet (seperti server back-end aplikasi) dan aplikasi Anda. ATS memastikan bahwa semua komunikasi internet sesuai dengan praktik terbaik koneksi yang aman, sehingga mencegah pengungkapan informasi sensitif yang tidak disengaja baik secara langsung melalui aplikasi atau pustaka yang dikonsumsinya.
Karena ATS diaktifkan secara default di aplikasi yang dibangun untuk iOS 9, tvOS 9 dan OS X 10.11 (El Capitan) dan yang lebih baru, semua koneksi yang menggunakan NSUrlConnection
, CFUrl
atau NSUrlSession
akan tunduk pada persyaratan keamanan ATS. Jika koneksi Anda tidak memenuhi persyaratan ini, koneksi akan gagal dengan pengecualian.
Berdasarkan pilihan Implementasi HttpClient Stack dan SSL/TLS, Anda mungkin perlu melakukan modifikasi pada aplikasi anda untuk bekerja dengan benar dengan ATS.
Untuk mengetahui lebih lanjut tentang ATS, silakan lihat panduan Keamanan Transportasi Aplikasi kami.
Masalah yang diketahui
Bagian ini akan membahas masalah yang diketahui dengan dukungan TLS di Xamarin.iOS.
Proyek gagal dimuat dengan kesalahan "Nilai yang diminta AppleTLS tidak ditemukan"
Xamarin.iOS 9.8 memperkenalkan beberapa pengaturan baru yang berisi file .csproj untuk aplikasi Xamarin.iOS. Perubahan ini dapat menyebabkan masalah ketika proyek dibuka dengan versi Xamarin.iOS yang lebih lama. Cuplikan layar berikut adalah contoh pesan kesalahan yang mungkin ditampilkan dalam skenario ini:
Kesalahan ini disebabkan oleh pengenalan MtouchTlsProvider
pengaturan ke file proyek di Xamarin.iOS 9.8. Jika tidak dimungkinkan untuk memperbarui ke Xamarin.iOS 9.8 (atau lebih tinggi), pekerjaannya adalah mengedit aplikasi file .csproj secara manual, menghapus MtouchTlsprovider
elemen, lalu menyimpan file proyek yang diubah.
Cuplikan berikut adalah contoh MtouchTlsProvider
tampilan pengaturan di dalam file .csproj :
<MtouchTlsProvider>Default</MtouchTlsProvider>