Bagikan melalui


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:

  1. Klik dua kali Nama Proyek di Penjelajah Solusi untuk membuka Opsi Proyek.
  2. Beralih ke pengaturan Build untuk proyek Anda (misalnya, Build iOS untuk aplikasi Xamarin.iOS).
  3. Dari menu dropdown Implementasi HttpClient, pilih HttpClient jenis sebagai salah satu hal berikut: NSUrlSession (disarankan), CFNetwork, atau Terkelola.

Choose HttpClient implementation from Managed, CFNetwork, or NSUrlSession

Tip

Untuk TLS 1.2, opsi NSUrlSession disarankan.

NSUrlSession

Handler NSURLSessionberbasis 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 CFNetworkberbasis 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:

Screenshot of error while trying to load project, requested value legacy not found

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>