Keamanan Transportasi Aplikasi di Xamarin.iOS

App Transport Security (ATS) memberlakukan koneksi aman antara sumber daya internet (seperti server back-end aplikasi) dan aplikasi Anda.

Artikel ini akan memperkenalkan perubahan keamanan yang diterapkan App Transport Security pada aplikasi iOS 9 dan apa artinya untuk proyek Xamarin.iOS Anda, ini akan mencakup opsi konfigurasi ATS dan akan mencakup cara menolak ATS ATS jika diperlukan. Karena ATS diaktifkan secara default, koneksi internet yang tidak aman akan menimbulkan pengecualian di aplikasi iOS 9 (kecuali Anda telah secara eksplisit mengizinkannya).

Tentang Keamanan Transportasi Aplikasi

Seperti yang dinyatakan di atas, ATS memastikan bahwa semua komunikasi internet di iOS 9 dan OS X El Capitan sesuai dengan praktik terbaik koneksi yang aman, sehingga mencegah pengungkapan informasi sensitif yang tidak disengaja baik secara langsung melalui aplikasi Atau pustaka yang dikonsumsinya.

Untuk aplikasi yang ada, terapkan HTTPS protokol jika memungkinkan. Untuk aplikasi Xamarin.iOS baru, Anda harus menggunakan HTTPS secara eksklusif saat berkomunikasi dengan sumber daya internet. Selain itu, komunikasi API tingkat tinggi harus dienkripsi menggunakan TLS versi 1.2 dengan keseriusan penerusan.

Setiap koneksi yang dibuat dengan NSUrl Koneksi ion, CFUrl atau NSUrlSession akan menggunakan ATS secara default dalam aplikasi yang dibangun untuk iOS 9 dan OS X 10.11 (El Capitan).

Perilaku ATS default

Karena ATS diaktifkan secara default di aplikasi yang dibangun untuk iOS 9 dan OS X 10.11 (El Capitan), semua koneksi yang menggunakan NSUrl Koneksi ion, CFUrl, atau NSUrlSession akan tunduk pada persyaratan keamanan ATS. Jika koneksi Anda tidak memenuhi persyaratan ini, koneksi akan gagal dengan pengecualian.

Persyaratan Koneksi ATS

ATS akan memberlakukan persyaratan berikut untuk semua koneksi internet:

  • Semua cipher koneksi harus menggunakan keamatan penerusan. Lihat daftar sandi yang diterima di bawah ini.
  • Protokol Keamanan Lapisan Transportasi (TLS) harus versi 1.2 atau lebih tinggi.
  • Setidaknya sidik jari SHA256 dengan kunci RSA 2048 bit atau lebih besar, atau kunci Kurva Elips (ECC) 256 bit atau lebih besar harus digunakan untuk semua sertifikat.

Sekali lagi, karena ATS diaktifkan secara default di iOS 9, setiap upaya untuk membuat koneksi yang tidak memenuhi persyaratan ini akan mengakibatkan pengecualian dilemparkan.

Sandi yang Kompatibel dengan ATS

Jenis sandi keaman lanjutan berikut diterima oleh komunikasi internet aman ATS:

  • TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384
  • TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
  • TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384
  • TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA
  • TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256
  • TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA
  • TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
  • TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
  • TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384
  • TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256
  • TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA

Untuk informasi selengkapnya tentang bekerja dengan kelas komunikasi internet iOS, silakan lihat Referensi Kelas NSURL Koneksi ion Apple atau Referensi Kelas NSURLSession.

Mendukung ATS di Xamarin.iOS

Karena ATS diaktifkan secara default di iOS 9 dan OS X El Capitan, jika aplikasi Xamarin.iOS atau pustaka atau layanan apa pun yang digunakannya membuat koneksi ke internet, Anda harus mengambil beberapa tindakan atau koneksi Anda akan mengakibatkan pengecualian dilemparkan.

Untuk app yang ada, Apple menyarankan Anda untuk mendukung HTTPS protokol sesegera mungkin. Jika Anda tidak dapat karena Anda terhubung ke layanan web pihak ke-3 yang tidak mendukung HTTPS atau jika dukungan HTTPS tidak praktis, Anda dapat menolak ATS. Lihat bagian Memilih Keluar dari ATS di bawah ini untuk detail selengkapnya.

Untuk aplikasi Xamarin.iOS baru, Anda harus menggunakan HTTPS secara eksklusif saat berkomunikasi dengan sumber daya internet. Sekali lagi, mungkin ada situasi (seperti menggunakan layanan web pihak ke-3) di mana ini tidak dimungkinkan dan Anda harus menolak ATS.

Selain itu, ATS memberlakukan komunikasi API tingkat tinggi untuk dienkripsi menggunakan TLS versi 1.2 dengan ke rahasia maju. Lihat bagian Persyaratan Koneksi ion ATS dan Sandi yang Kompatibel dengan ATS di atas untuk detail selengkapnya.

Meskipun Anda mungkin tidak terbiasa dengan TLS (Keamanan Lapisan Transportasi) ini adalah penerus SSL (Secure Socket Layer) dan menyediakan kumpulan protokol kriptografi untuk memberlakukan keamanan melalui koneksi jaringan.

Tingkat TLS dikendalikan oleh layanan web yang Anda konsumsi dan oleh karena itu di luar kontrol aplikasi. HttpClient Baik dan ModernHttpClient harus secara otomatis menggunakan tingkat enkripsi TLS tertinggi yang didukung oleh server.

Tergantung pada server yang Anda ajukan (terutama jika itu adalah layanan pihak ke-3), Anda mungkin perlu menonaktifkan kerahasiaan penerusan atau memilih tingkat TLS yang lebih rendah. Lihat bagian Mengonfigurasi Opsi ATS di bawah ini untuk detail selengkapnya.

Penting

App Transport Security tidak berlaku untuk aplikasi Xamarin menggunakan implementasi HTTPClient Terkelola. Ini hanya berlaku untuk koneksi yang menggunakan implementasi HTTPClient CFNetwork atau implementasi HTTPClient NSURLSession.

Mengatur Implementasi HTTPClient

Untuk mengatur Implementasi HTTPClient yang digunakan oleh aplikasi iOS, klik dua kali Proyek di Penjelajah Solusi untuk membuka Opsi Proyek. Navigasi ke Build iOS dan pilih jenis klien yang diinginkan di bawah dropdown implementasi HttpClient:

Mengatur Opsi Build iOS

Handler Terkelola

Handler Terkelola adalah handler HttpClient yang dikelola sepenuhnya yang telah dikirim dengan versi Xamarin.iOS sebelumnya dan merupakan handler default.

Pro:

  • Ini adalah yang paling kompatibel dengan Microsoft .NET dan versi Xamarin yang lebih lama.

Kontra:

  • Ini tidak sepenuhnya terintegrasi dengan iOS (misalnya terbatas pada TLS 1.0).
  • Biasanya jauh lebih lambat daripada API asli.
  • Ini membutuhkan kode yang lebih terkelola dan membuat aplikasi yang lebih besar.

CFNetwork Handler

Handler berbasis CFNetwork didasarkan pada kerangka kerja asli CFNetwork .

Pro:

  • Menggunakan API asli untuk performa yang lebih baik dan ukuran yang dapat dieksekusi yang lebih kecil.
  • Menambahkan dukungan untuk standar yang lebih baru seperti TLS 1.2.

Kontra:

  • Memerlukan iOS 6 atau yang lebih baru.
  • Tidak tersedia watchOS.
  • Beberapa fitur dan opsi HttpClient tidak tersedia.

NSUrlSession Handler

Handler berbasis NSUrlSession didasarkan pada API asli NSUrlSession .

Pro:

  • Menggunakan API asli untuk performa yang lebih baik dan ukuran yang dapat dieksekusi yang lebih kecil.
  • Menambahkan dukungan untuk standar yang lebih baru seperti TLS 1.2.

Kontra:

  • Memerlukan iOS 7 atau yang lebih baru.
  • Beberapa fitur dan opsi HttpClient tidak tersedia.

Mendiagnosis Masalah ATS

Saat mencoba terhubung ke internet, baik secara langsung atau dari tampilan web di iOS 9, Anda mungkin mendapatkan kesalahan dalam formulir:

App Transport Security telah memblokir beban sumber daya HTTP (http://www.-the-blocked-domain.com) cleartext karena tidak aman. Pengecualian sementara dapat dikonfigurasi melalui file Info.plist aplikasi Anda.

Di iOS9, App Transport Security (ATS) memberlakukan koneksi aman antara sumber daya internet (seperti server back-end aplikasi) dan aplikasi Anda. Selain itu, ATS memerlukan komunikasi menggunakan HTTPS protokol dan komunikasi API tingkat tinggi untuk dienkripsi menggunakan TLS versi 1.2 dengan keamatan maju.

Karena ATS diaktifkan secara default di aplikasi yang dibangun untuk iOS 9 dan OS X 10.11 (El Capitan), 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.

Apple juga menyediakan Aplikasi Sampel TLSTool yang dapat dikompilasi (atau ditranskodekan secara opsional ke Xamarin dan C#) dan digunakan untuk mendiagnosis masalah ATS/TLS. Silakan lihat bagian Memilih Keluar dari ATS di bawah ini untuk informasi tentang cara menyelesaikan masalah ini.

Mengonfigurasi Opsi ATS

Anda dapat mengonfigurasi beberapa fitur ATS dengan mengatur nilai untuk kunci tertentu dalam file Info.plist aplikasi Anda. Kunci berikut tersedia untuk mengontrol ATS (diindentasi untuk menunjukkan bagaimana kunci tersebut ditumpuk):

NSAppTransportSecurity
    NSAllowsArbitraryLoads
    NSAllowsArbitraryLoadsInWebContent
    NSExceptionDomains
    <domain-name-for-exception-as-string>
        NSExceptionMinimumTLSVersion
        NSExceptionRequiresForwardSecrecy
        NSExceptionAllowsInsecureHTTPLoads
        NSRequiresCertificateTransparency
        NSIncludesSubdomains
        NSThirdPartyExceptionMinimumTLSVersion
        NSThirdPartyExceptionRequiresForwardSecrecy
        NSThirdPartyExceptionAllowsInsecureHTTPLoads

Setiap kunci memiliki jenis dan arti berikut:

  • NSAppTransportSecurity (Dictionary) - Berisi semua kunci pengaturan dan nilai untuk ATS.
  • NSAllowsArbitraryLoads (Boolean) - Jika YES ATS akan dinonaktifkan untuk domain apa pun yang tidak tercantum di NSExceptionDomains. Untuk domain yang tercantum, pengaturan keamanan yang ditentukan akan digunakan.
  • NSAllowsArbitraryLoadsInWebContent (Boolean) - Jika YES akan memungkinkan halaman web dimuat dengan benar sementara perlindungan Apple Transport Security (ATS) masih diaktifkan untuk sisa aplikasi.
  • NSExceptionDomains (Dictionary) - Kumpulan domain yang dan pengaturan keamanan yang harus digunakan ATS untuk domain tertentu.
  • <domain-name-for-exception-as-string> (Dictionary) - Kumpulan pengecualian untuk domain tertentu (misalnya. www.xamarin.com).
  • NSExceptionMinimumTLSVersion (String) - Versi TLS minimal sebagai TLSv1.0, TLSv1.1 atau TLSv1.2 (yang merupakan default).
  • NSExceptionRequiresForwardSecrecy (Boolean) - Jika NO domain tidak harus menggunakan cipher dengan keamanan penerusan. Nilai defaultnya adalah YES.
  • NSExceptionAllowsInsecureHTTPLoads (Boolean) - Jika NO (default) semua komunikasi dengan domain ini harus dalam HTTPS protokol.
  • NSRequiresCertificateTransparency (Boolean) - Jika YES Secure Sockets Layer (SSL) domain harus menyertakan data transparansi yang valid. Nilai defaultnya adalah NO.
  • NSIncludesSubdomains (Boolean) - Jika YES pengaturan ini menimpa semua subdomain domain ini. Nilai defaultnya adalah NO.
  • NSThirdPartyExceptionMinimumTLSVersion (String) - Versi TLS yang digunakan saat domain adalah layanan pihak ke-3 di luar kontrol pengembang.
  • NSThirdPartyExceptionRequiresForwardSecrecy (Boolean) - Jika YES domain pihak ke-3 memerlukan kerahasiaan ke depan.
  • NSThirdPartyExceptionAllowsInsecureHTTPLoads (Boolean) - Jika YES ATS akan mengizinkan komunikasi yang tidak aman dengan domain pihak ke-3.

Memilih Keluar dari ATS

Meskipun Apple sangat menyarankan penggunaan HTTPS protokol dan mengamankan komunikasi ke informasi berbasis internet, mungkin ada kalanya hal ini tidak selalu memungkinkan. Misalnya, jika Anda berkomunikasi dengan layanan web pihak ke-3 atau menggunakan iklan yang ditayangkan internet di aplikasi Anda.

Jika aplikasi Xamarin.iOS Anda harus membuat permintaan ke domain yang tidak aman, perubahan berikut pada file Info.plist aplikasi Anda akan menonaktifkan default keamanan yang diterapkan ATS untuk domain tertentu:

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSExceptionDomains</key>
    <dict>
        <key>www.the-domain-name.com</key>
        <dict>
            <key>NSExceptionMinimumTLSVersion</key>
            <string>TLSv1.0</string>
            <key>NSExceptionRequiresForwardSecrecy</key>
            <false/>
            <key>NSExceptionAllowsInsecureHTTPLoads</key>
            <true/>
            <key>NSIncludesSubdomains</key>
            <true/>
        </dict>
    </dict>
</dict>

Di dalam Visual Studio untuk Mac, klik Info.plist dua kali file di Penjelajah Solusi, beralihlah ke tampilan Sumber dan tambahkan tombol di atas:

Tampilan Sumber file Info.plist setelah menambahkan kunci yang ditentukan.

Jika aplikasi Anda perlu memuat dan menampilkan konten web dari situs yang tidak aman, tambahkan yang berikut ini ke file Info.plist aplikasi Anda untuk memungkinkan halaman web dimuat dengan benar saat perlindungan Apple Transport Security (ATS) masih diaktifkan untuk aplikasi lainnya:

<key>NSAppTransportSecurity</key>
<dict>
    <key> NSAllowsArbitraryLoadsInWebContent</key>
    <true/>
</dict>

Secara opsional, Anda dapat membuat perubahan berikut pada file Info.plist aplikasi Anda untuk sepenuhnya menonaktifkan ATS untuk semua domain dan komunikasi internet:

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

Di dalam Visual Studio untuk Mac, klik Info.plist dua kali file di Penjelajah Solusi, beralihlah ke tampilan Sumber dan tambahkan tombol di atas:

Tampilan Sumber file Info.plist setelah menentukan NSAllowsArbitraryLoadsInWebContent dan NSAllowsArbitraryLoads.

Penting

Jika aplikasi Anda memerlukan koneksi ke situs web yang tidak aman, Anda harus selalu memasukkan domain sebagai pengecualian menggunakan NSExceptionDomains alih-alih menonaktifkan ATS sepenuhnya menggunakan NSAllowsArbitraryLoads. NSAllowsArbitraryLoads hanya boleh digunakan dalam situasi darurat ekstrem.

Sekali lagi, menonaktifkan ATS hanya boleh digunakan sebagai upaya terakhir, jika beralih ke koneksi aman tidak tersedia atau tidak praktis.

Ringkasan

Artikel ini telah memperkenalkan App Transport Security (ATS) dan menjelaskan caranya memberlakukan komunikasi yang aman dengan internet. Pertama, kami membahas perubahan yang diperlukan ATS untuk aplikasi Xamarin.iOS yang berjalan di iOS 9. Kemudian kami membahas pengontrolan fitur dan opsi ATS. Akhirnya, kami membahas memilih keluar dari ATS di aplikasi Xamarin.iOS Anda.