Keamanan transportasi telah memblokir HTTP cleartext

1451

Pengaturan apa yang harus saya masukkan info.plistke saya untuk mengaktifkan mode HTTP sesuai dengan pesan kesalahan berikut?

Keamanan transportasi telah memblokir sumber daya HTTP (http: //) cleartext karena tidak aman. Pengecualian sementara dapat dikonfigurasikan melalui file Info.plist aplikasi Anda.

Xcode

Asumsikan domain saya adalah example.com.

Astaga
sumber
15
Moderator Catatan : Sudah ada 36 jawaban untuk pertanyaan ini. Sebelum menambahkan yang lain , pastikan solusi Anda baru .
Matt
5
CATATAN: Solusi di sini menyarankan Anda untuk mematikan ATS ( Allow arbitary loads). Segera ini tidak akan mungkin karena Apple akan membutuhkan ATS (Awalnya akhir tahun - batas waktu telah diperpanjang) - developer.apple.com/news/?id=12212016b
Jakub Truhlář
@ Ya ampun mengapa Anda menambahkan tag iOS 10? apakah ada perubahan tambahan di iOS 10 dalam hal ini? Saya merasa bahwa itu diperkenalkan di iOS9 dan tag itu harus cukup dalam hal versi iOS
Julian Król

Jawaban:

469

Jika Anda menggunakan Xcode 8.0+ dan Swift 2.2+ atau bahkan Objective C:

Masukkan deskripsi gambar di sini

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
    <key>NSExceptionDomains</key>
    <dict>
        <key>example.com</key>
        <dict>
            <key>NSExceptionAllowsInsecureHTTPLoads</key>
            <true/>
            <key>NSIncludesSubdomains</key>
            <true/>
        </dict>
    </dict>
</dict>
Anit Kumar
sumber
29
Mengapa NSAllowsArbitraryLoadsdiatur true? Anda menumbangkan tujuan ATS. Lihat juga Kode paling berbahaya di dunia: memvalidasi sertifikat SSL dalam perangkat lunak non-browser . Perangkat lunak Anda baru saja membuat daftar.
jww
6
@jww Ini adalah tujuan dari posting ini. Situs yang saya perlu sambungkan untuk memutar audio belum menggunakan HTTPS dan saya tidak mencoba menunggu.
ThinkDigital
5
Ini tidak akan berfungsi di iOS 10.0+ atau MacOS 10.12+ Sebenarnya dikatakan memungkinkan semua beban arbitrer KECUALI yang disebutkan (example.com). Dengan demikian ia akan melakukan kebalikan dari apa yang diinginkan. NSAllowsArbirtraryLoads harus disetel ke false di sini. info lebih lanjut: Dokumen Apple
Freek Sanders
1
Setuju, mengapa semua orang membenarkan hal ini? tidak ada gunanya menggunakan NSAllowsArbitraryLoads jika Anda menetapkan domain pengecualian.
thibaut noah
1
NSAllowsArbitraryLoads tidak perlu benar, jadi harus dihapus. NSExceptionDomains cukup yang memungkinkan koneksi tidak aman ke domain itu saja. NSAllowsArbitraryLoads = true akan memungkinkan koneksi nonsecure ke domain apa pun jadi jika masih menyetelnya ke true membuat NSExceptionDomains tidak masuk akal karena memiliki semua domain yang sudah ada
mister_giga
950

Gunakan NSAppTransportSecurity:

Masukkan deskripsi gambar di sini

Anda harus mengatur kunci NSAllowsArbitraryLoads ke YA di bawah kamus NSAppTransportSecurity di file info.plist Anda.

Konfigurasi Plist

User123335511231
sumber
157
Biarkan itu diketahui: INI ADALAH WORKAROUND! Setiap kali Anda menggunakan HTTP melalui HTTPS Anda membuka perangkat pengguna Anda untuk kerentanan. Tentu itu tidak mungkin dalam banyak kasus tetapi pemrograman etis adalah praktik terbaik. Katakan saja ... - juga, +1 untuk kerja (untuk tujuan pengujian)
Jacksonkr
36
Ini BUKAN solusi - ini adalah HACK! Untuk menambahkan "pengecualian" domain
tunggal,
17
Meskipun solusi ini diketahui rentan, ini adalah satu - satunya solusi yang saya sarankan selama DEVELOPMENT . Mengetik di setiap domain yang tepat selama pengembangan itu konyol (terutama jika Anda menggunakan layanan web pihak ketiga).
reTs
6
Nama kunci-kunci itu telah berubah sekarang "Pengaturan Keamanan Transport Transport" di bawah "Izinkan Beban Sewenang-wenang"
vishal dharankar
11
Mengapa begitu banyak orang menentang solusi ini? Ini jelas BUKAN hack! Banyak aplikasi perlu berkomunikasi dengan internet yang sebenarnya di mana protokol keamanan tidak selalu di bawah kendali Anda. Misalnya, tampaknya sangat masuk akal untuk dapat menampilkan gambar dari server lain yang tidak memiliki sertifikat SSL.
Oren
825

Berikut adalah pengaturan secara visual:

pengaturan visual untuk NSAllowsArbitraryLoads in info.plist via Xcode GUI

William Cerniuk
sumber
10
Saya tidak punya opsi itu.
Pengguna
25
Jika Anda membuka Info.plist Anda secara langsung, Anda bisa menambahkan kamus NSAppTransportSecurity , dan kemudian membuat item NSAllowsArbitraryLoads di dalamnya (lihat jawaban yang diedit oleh Umar Farooq, di bawah).
Stoph
3
Sama di sini - domain pengecualian tidak berfungsi dengan 7.3 untuk saya.
RegularExpression
4
Pilihan ini tidak ada
XCode
3
Info dari @JoshPinter bekerja untuk saya dengan XCode 8.
Matthew Bellantoni
717

Lihat posting forum Keamanan Transport Aplikasi? .

Juga halaman Mengkonfigurasi Pengecualian Keamanan Transport Aplikasi di iOS 9 dan OSX 10.11 .

Misalnya, Anda dapat menambahkan domain tertentu seperti:

<key>NSAppTransportSecurity</key>
<dict>
  <key>NSExceptionDomains</key>
  <dict>
    <key>example.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>

Opsi malas adalah:

<key>NSAppTransportSecurity</key>
<dict>
  <!--Include to allow all connections (DANGER)-->
  <key>NSAllowsArbitraryLoads</key>
      <true/>
</dict>

catatan:

info.plist adalah file XML sehingga Anda dapat menempatkan kode ini lebih atau kurang di mana saja di dalam file.

KMLong
sumber
1
Bagaimana saya bisa melakukan itu, maksud saya apa cara menambahkan kode ini ke Info.plist karena saya tidak tahu di mana harus menempelkan kode ini?
lmiguelvargasf
2
@lmiguelvargasf buka info.plist Anda dengan editor teks biasa
Dan Beaulieu
7
Saya masih mendapatkan kesalahan: domain pengecualian diatur dan NSAllowsArbitraryLoads salah. Bahkan dengan NSAllowsArbitraryLoads true, kesalahan muncul. Apakah ada orang lain di sini yang mengalami masalah ini?
klaevv
3
Pada 1/30/2016 Apple doc menunjukkan bahwa kunci tidak lagi memiliki kata Sementara di dalamnya, misalnya: NSExceptionMemungkinkanInsecureHTTPLoads NSExceptionMinimumTLSVersion Lihat developer.apple.com/library/prerelease/ios/documentation/…
Philippe Monnet
3
Jika ada orang lain yang mencabut rambutnya karena melakukan perubahan sederhana ini ke info.plist tidak berfungsi .. tambahkan perubahan ke Project> Target> Info> Custom iOS Target Properties
BlueGuy
330

Ini diuji dan berfungsi pada iOS 9 GM seed - ini adalah konfigurasi untuk memungkinkan domain tertentu untuk menggunakan HTTP, bukan HTTPS:

<key>NSAppTransportSecurity</key>
<dict>
      <key>NSAllowsArbitraryLoads</key> 
      <false/>
       <key>NSExceptionDomains</key>
       <dict>
            <key>example.com</key> <!--Include your domain at this line -->
            <dict>
                <key>NSIncludesSubdomains</key>
                <true/>
                <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
                <true/>
                <key>NSTemporaryExceptionMinimumTLSVersion</key>
                <string>TLSv1.1</string>
            </dict>
       </dict>
</dict>

NSAllowsArbitraryLoadsharus false, karena itu melarang semua koneksi tidak aman, tetapi daftar pengecualian memungkinkan koneksi ke beberapa domain tanpa HTTPS.

Sound Blaster
sumber
7
INI harus ditandai sebagai jawabannya. Diuji dan bekerja di iOS 9 GM seed untuk memungkinkan domain tertentu untuk menggunakan http tanpa mengambil cara "malas" dan benar-benar membuka aplikasi Anda.
DiscDev
2
Bagaimana saya menambahkan ini ke info.plist saya?
JMStudios.jrichardson
8
Ok saya menambahkan entri itu ke info.plist saya dan saya masih mendapatkan kesalahan ini - "App Transport Security telah memblokir sumber daya HTTP (http: //) yang sudah dihapus karena tidak aman. Pengecualian sementara dapat dikonfigurasi melalui Info aplikasi Anda file .plist. "
KMC
2
@RomanShapovalov jika Anda harus menggunakan alamat IP, coba tambahkan .xip.io di akhir alamat IP dan tambahkan xip.io ke NSExceptionDomains Anda. Lihat xip.io . Saya terhubung langsung ke IP ketika mengembangkan (tetapi tidak melepaskan) dan ini berfungsi baik untuk saya.
tpankake
2
Tidak bekerja untuk saya sampai saya menyadari saya telah memasukkannya ke dalam info. salah daftar proyek pengujian saya. Pastikan Anda meletakkannya di yang benar!
Chucky
144

Ini adalah solusi cepat (tetapi tidak disarankan) untuk menambahkan ini di daftar:

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

Yang berarti (menurut dokumentasi Apple ):

NSAllowsArbitraryLoads
Nilai Boolean yang digunakan untuk menonaktifkan App Transport Security untuk domain apa pun yang tidak tercantum dalam kamus NSExceptionDomains. Domain yang terdaftar menggunakan pengaturan yang ditentukan untuk domain itu.

Nilai default NO memerlukan perilaku App Transport Security default untuk semua koneksi.

Saya sangat merekomendasikan tautan:

yang membantu saya memahami alasan dan semua implikasinya.

XML (dalam file Info.plist) di bawah ini akan:

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <false/>
    <key>NSExceptionDomains</key>
    <dict>
        <key>PAGE_FOR_WHICH_SETTINGS_YOU_WANT_TO_OVERRIDE</key>
        <dict>
            <key>NSExceptionAllowsInsecureHTTPLoads</key>
            <true/>
        </dict>
    </dict>
</dict>

larang panggilan sewenang-wenang untuk semua halaman, tetapi untuk PAGE_FOR_WHICH_SETTINGS_YOU_WANT_TO_OVERRIDEmemungkinkan koneksi menggunakan protokol HTTP.

Untuk XML di atas Anda dapat menambahkan:

<key>NSIncludesSubdomains</key>
<true/>

jika Anda ingin mengizinkan koneksi tidak aman untuk subdomain dari alamat yang ditentukan.

Pendekatan terbaik adalah memblokir semua muatan yang berubah-ubah (disetel ke false) dan menambahkan pengecualian agar hanya alamat yang kami tahu baik-baik saja.

Untuk pembaca yang tertarik

Pembaruan 2018:

Apple tidak merekomendasikan untuk mematikan ini - informasi lebih lanjut dapat ditemukan di 207 sesi WWDC 2018 dengan lebih banyak hal yang dijelaskan sehubungan dengan keamanan

Meninggalkan jawaban asli karena alasan historis dan fase pengembangan

Julian Król
sumber
1
NSAllowsArbitraryLoadsharusfalse
Sound Blaster
@ SoundBlaster untuk kasus apa dan apa yang Anda lihat salah dalam jawaban saya untuk memilih?
Julian Król
dengan menambahkan plist (NSAppTransportSecurity NSAllowsArbitraryLoads), semua layanan web berfungsi dengan baik kecuali satu layanan web satu layanan web mengembalikan kesalahan server internal (500) di iOS 9 tetapi bekerja dengan baik di iOS8 atau lambat
amit gupta
@SoundBlaster melakukan perubahan, sekarang Anda seharusnya tidak keberatan :)
Julian Król
Terima kasih, bagaimana Anda sebenarnya menambahkannya <key>NSIncludesSubdomains</key> <true/>? Apakah setiap pengaturan harus dikelilingi oleh <dict>? bagaimana Anda mengedit file plist ini? Apa formatnya? : D Terima kasih.
Agen Zebra
116

Bagi Anda yang menginginkan konteks lebih banyak tentang mengapa hal ini terjadi, selain cara memperbaikinya, maka baca di bawah ini.

Dengan diperkenalkannya iOS 9, untuk meningkatkan keamanan koneksi antara aplikasi dan layanan web, koneksi aman antara aplikasi dan layanan webnya harus mengikuti praktik terbaik . Perilaku praktik terbaik diberlakukan oleh App Transport Security untuk:

  • mencegah pengungkapan yang tidak disengaja, dan
  • memberikan perilaku default yang aman.

Sebagaimana dijelaskan dalam App Transport Security Technote , saat berkomunikasi dengan layanan web Anda, App Transport Security sekarang memiliki persyaratan dan perilaku berikut:

  • Server harus mendukung setidaknya protokol Transport Layer Security (TLS) versi 1.2.
  • Cipher koneksi terbatas pada yang menyediakan kerahasiaan ke depan (lihat daftar cipher di bawah ini.)
  • Sertifikat harus ditandatangani menggunakan SHA256 atau algoritma hash signature yang lebih baik, dengan kunci RSA 2048 bit atau lebih besar atau 256 bit atau lebih besar Elliptic-Curve (ECC) key.
  • Sertifikat yang tidak valid mengakibatkan kegagalan keras dan tidak ada koneksi.

Dengan kata lain, permintaan layanan web Anda harus: a.) Menggunakan HTTPS dan b.) Dienkripsi menggunakan TLS v1.2 dengan kerahasiaan ke depan.

Namun, seperti yang disebutkan dalam posting lain, Anda dapat mengganti perilaku baru ini dari Keamanan Transport Aplikasi dengan menentukan domain tidak aman di Info.plistaplikasi Anda.


Untuk mengganti, Anda perlu menambahkan NSAppTransportSecurity> NSExceptionDomainsproperti kamus ke Info.plist. Selanjutnya, Anda akan menambahkan domain layanan web Anda ke NSExceptionDomainskamus.

Misalnya, jika saya ingin mem-bypass perilaku App Transport Security untuk layanan web di host www.yourwebservicehost.com maka saya akan melakukan hal berikut:

  1. Buka aplikasi Anda dalam Xcode.

  2. Temukan Info.plistfile di Project Navigator dan klik "mouse kanan" dan pilih opsi menu Open As > Source Code . File daftar properti akan muncul di panel kanan.

  3. Letakkan blok properti berikut di dalam kamus properti utama (di bawah yang pertama <dict>).


<key>NSAppTransportSecurity</key>
<dict>
    <key>NSExceptionDomains</key>
    <dict>
        <key>www.example.com</key>
        <dict>
            <key>NSExceptionAllowsInsecureHTTPLoads</key>
            <true/>
            <key>NSExceptionMinimumTLSVersion</key>
            <string>TLSv1.1</string>
            <key>NSIncludesSubdomains</key>
            <true/>
        </dict>
    </dict>
</dict>

Jika Anda perlu memberikan pengecualian untuk domain tambahan maka Anda akan menambahkan properti kamus lain di bawah NSExceptionDomains.

Untuk mengetahui lebih lanjut tentang kunci yang dirujuk di atas, baca teknik yang telah disebutkan ini .

makanya
sumber
1
Ini berfungsi di 2 aplikasi saya, tetapi tidak berfungsi pada aplikasi ke-3. Adakah orang lain yang mengalami situasi menggunakan perbaikan di atas dan masih mendapatkan pesan kesalahan yang sama? (dan ya saya perbarui kamus untuk menggunakan domain API saya, bukan yang ada dalam kode)
helloB
Terbaik! Apple mengonfirmasi bahwa solusi ini menggunakan
YannSteph
Ini berfungsi untuk file pengeditan aplikasi Cordova / Phonegap / Ionic ./platforms/ios/<project>/<project>-Info.plistdengan NSAllowsArbitraryLoads=falsedan banyak domain pengecualian untuk layanan dengan beragam kombinasi TLS / HTTP / HTTPS. Awalnya digunakan NSAllowsArbitraryLoads=truekemudian disesuaikan, pemecahan masalah aturan melalui coba-coba untuk mematuhi pedoman dan mengajukan persetujuan. Catatan config.xml <access origin=.../>pernyataan mengisi sebagian file ini, tetapi saat ini membutuhkan penyesuaian dengan pengeditan langsung atau melalui XCode untuk mendapatkan rincian yang benar.
Jimmont
Juga <access origin="*"/>(dalam config.xml) set NSAllowsArbitraryLoads=true(untuk aplikasi Cordova / Phonegap / hybrid
jimmont
Mengapa NSExceptionAllowsInsecureHTTPLoadsdiatur true? Anda menumbangkan tujuan ATS. Lihat juga Kode paling berbahaya di dunia: memvalidasi sertifikat SSL dalam perangkat lunak non-browser . Perangkat lunak Anda baru saja membuat daftar.
jww
67

Saya tidak suka mengedit daftar langsung. Anda dapat dengan mudah menambahkannya ke plist menggunakan GUI:

  • Klik pada Info.plist di Navigator di sebelah kiri.
  • Sekarang ubah data di area utama:

    • Pada baris terakhir tambahkan +
    • Masukkan nama grup: Pengaturan Keamanan Transport Transport
    • Klik kanan pada grup dan pilih Add Row
    • Masukkan Boleh Beban Sewenang-wenang
    • Setel nilai di sebelah kanan ke YA

Contoh

Vincent
sumber
Untuk memperjelas: jika "Izinkan Beban Sewenang-wenang" adalah YA, dan ada "Domain Pengecualian", maka beban yang diizinkan terbatas pada yang ada di Domain Pengecualian. Apakah itu benar?
apakah itu cara yang aman untuk melakukannya jika saya ingin merilis aplikasi?
Lamour
Tidak. Dengan mengizinkan pemuatan sewenang-wenang, aplikasi Anda dapat terhubung ke domain apa pun secara bebas. Dalam sudut pandang keamanan, Anda harus mengontrol & membatasi domain / situs web mana yang harus terhubung dengan aplikasi, untuk menghindari penggunaan jaringan yang tidak terduga.
Raptor
Sebagian besar aplikasi hanya merutekan ke server yang dikenal. Ini dikendalikan oleh pengembang. Jadi masalah keamanan diketahui.
Vincent
Mengapa NSAllowsArbitraryLoadsdiatur YES? Anda menumbangkan tujuan ATS. Lihat juga Kode paling berbahaya di dunia: memvalidasi sertifikat SSL dalam perangkat lunak non-browser . Perangkat lunak Anda baru saja membuat daftar.
jww
25

Dokumen Apple 1

Dokumen Apple 2

Ada dua solusi untuk ini:

Solusi 1:

  1. Dalam Info.plistfile, tambahkan kamus dengan kunci ' NSAppTransportSecurity'
  2. Tambahkan elemen lain di dalam kamus dengan kunci 'Allow Arbitrary Loads'

Plist struktur akan muncul seperti yang ditunjukkan pada gambar di bawah ini.

Solusi 1

Solusi 2:

  1. Dalam Info.plistfile, tambahkan kamus dengan kunci ' NSAppTransportSecurity'
  2. Tambahkan elemen lain di dalam kamus dengan kunci ' NSExceptionDomains'
  3. Tambahkan elemen dengan kunci 'MyDomainName.com'tipe NSDictionary
  4. Tambahkan elemen dengan kunci ' NSIncludesSubdomains' dari jenis Booleandan nilai yang ditetapkan sebagaiYES
  5. Tambahkan elemen dengan kunci ' NSTemporaryExceptionAllowsInsecureHTTPLoads' dari jenis Booleandan nilai yang ditetapkan sebagaiYES

Plist struktur akan muncul seperti yang ditunjukkan pada gambar di bawah ini.

Solusi 2

Solusi 2 lebih disukai karena hanya memungkinkan domain yang dipilih sedangkan solusi 1 memungkinkan semua koneksi HTTP tidak aman.

Jayprakash Dubey
sumber
Mengapa NSAllowsArbitraryLoadsdiatur YES? Anda menumbangkan tujuan ATS. Lihat juga Kode paling berbahaya di dunia: memvalidasi sertifikat SSL dalam perangkat lunak non-browser . Perangkat lunak Anda baru saja membuat daftar.
jww
20

Keamanan transportasi tersedia di iOS 9.0 atau yang lebih baru. Anda mungkin memiliki peringatan ini ketika mencoba memanggil WS di dalam aplikasi Anda:

Aplikasi Transport Security telah memblokir sumber daya HTTP (http: //) cleartext karena tidak aman. Pengecualian sementara dapat dikonfigurasikan melalui file Info.plist aplikasi Anda.

Menambahkan berikut ini ke Info.plist Anda akan menonaktifkan ATS:

<key>NSAppTransportSecurity</key>
<dict>
     <key>NSAllowsArbitraryLoads</key><true/>
</dict>
Malek Belkahla
sumber
1
NSAllowsArbitraryLoads pasti salah, jika benar itu memungkinkan semua koneksi tidak aman
Thiago Arreguy
dengan menambahkan dalam plist, semua layanan web bekerja dengan baik kecuali satu layanan web satu layanan web mengembalikan kesalahan server internal (500) di iOS 9 tetapi bekerja dengan baik di iOS8 atau lebih baru
amit gupta
1
Diterima di toko?
Vrashabh Irde
Saran yang sangat buruk; lihat Kode paling berbahaya di dunia: memvalidasi sertifikat SSL dalam perangkat lunak non-browser . Diberikan pertanyaan jika penuh dengan cara yang disarankan untuk melakukan sesuatu, "aku juga" jawaban seperti ini tidak diperlukan.
jww
15

Contoh Pengembangan

Berikut adalah screenshot dari sebuah plist yang membuat ATS tetap utuh (= aman), tetapi memungkinkan koneksi ke localhost dapat dilakukan melalui HTTP, bukan HTTPS . Ia bekerja di Xcode 7.1.1.

Masukkan deskripsi gambar di sini

Sebastian
sumber
Apakah ada cara untuk membuat localhost aman, yaitu menggunakan HTTPS, dalam reaksi bawaan sehingga kita tidak harus menggunakan NSExceptionAllowsInsecureHTTPLoads - YESkonfigurasi default ?
milkersarac
13

Buka Info.plist Anda

  1. Klik kanan pada ruang kosong dan Klik Tambah Baris
  2. Tulis Nama Kunci sebagai NSAppTransportSecurity, Di Bawahnya
  3. Pilih Exception Domains, Tambahkan item baru ke ini
  4. Tuliskan nama domain Anda yang perlu diakses
  5. Ubah jenis Domain dari String ke Kamus, tambahkan Item baru
  6. NSTingguanExceptionMemungkinkanInsecureHTTPLoads, itu akan menjadi boolean dengan nilai sebenarnya. Lihatlah gambar untuk mengikutinya dengan benar
Shailendra Suriyal
sumber
1
Mengapa NSAllowsArbitraryLoadsdiatur true? Anda menumbangkan tujuan ATS. Lihat juga Kode paling berbahaya di dunia: memvalidasi sertifikat SSL dalam perangkat lunak non-browser . Perangkat lunak Anda baru saja membuat daftar.
jww
13

Menurut Apple, umumnya menonaktifkan ATS akan menyebabkan penolakan aplikasi, kecuali jika Anda memiliki alasan yang kuat untuk melakukannya. Meskipun begitu, Anda harus menambahkan pengecualian untuk domain yang dapat Anda akses dengan aman.

Apple memiliki alat luar biasa yang memberi tahu Anda dengan tepat pengaturan apa yang harus digunakan: Di Terminal, masukkan

/usr/bin/nscurl --ats-diagnostics --verbose https://www.example.com/whatever

dan nscurl akan memeriksa apakah permintaan ini gagal, dan kemudian mencoba berbagai pengaturan dan memberi tahu Anda yang mana yang lewat, dan apa yang harus dilakukan. Misalnya, untuk beberapa URL pihak ketiga yang saya kunjungi, perintah ini memberi tahu saya bahwa kamus ini lewat:

{
    NSExceptionDomains = {
        "www.example.com" = {
            NSExceptionRequiresForwardSecrecy = false;
        };
    };
}

Untuk membedakan antara situs Anda sendiri dan situs pihak ketiga yang berada di luar kendali Anda, gunakan, misalnya, tombol NSThirdPartyExceptionRequiresForwardSecrecy.

gnasher729
sumber
1
alat hebat untuk memeriksa sebelum benar-benar menguji dengan aplikasi. menghemat waktu. tetapi sumber daya apa pun untuk dibaca untuk memahami putusan perintah ini.
damithH
1
Alat yang menarik. Dalam kasus saya itu melebih-lebihkan banyak hal. Ini mencantumkan tiga kunci termasuk NSExceptionAllowsInsecureHTTPLoads = true;, tetapi ternyata tidak diperlukan.
Chris Prince
11

Mencari tahu pengaturan apa yang digunakan dapat dilakukan secara otomatis, sebagaimana disebutkan dalam teknik ini :

/usr/bin/nscurl --ats-diagnostics --verbose https://your-domain.com
ecotax
sumber
Anda memang membutuhkan OS X 10.11 (El Capitan) untuk ini, tampaknya.
ecotax
10

CATATAN: Domain pengecualian di plist Anda harus dalam RENDAH-KASUS.

Contoh: Anda telah memberi nama mesin Anda "MyAwesomeMacbook" di bawah Pengaturan-> Berbagi; server Anda (untuk tujuan pengujian) berjalan di MyAwesomeMacbook.local: 3000, dan aplikasi Anda perlu mengirim permintaan ke http: //MyAwesomeMacbook.local: 3000 / file ..., daftar Anda, Anda harus menentukan "myawesomemacbook. lokal "sebagai domain pengecualian.

-

Info Anda akan berisi ...

<key>NSAppTransportSecurity</key>
<dict>
  <key>NSExceptionDomains</key>
  <dict>
    <key>myawesomemacbook.local</key>
    <dict>
      <!--Include to allow subdomains-->
      <key>NSIncludesSubdomains</key>
      <true/>
      <!--Include to allow HTTP requests-->
      <key>NSExceptionAllowsInsecureHTTPLoads</key>
      <true/>
    </dict>
  </dict>
</dict>
ObjectiveTC
sumber
9

Menggunakan:

PList Screenshot untuk mengerti lebih baik

Tambahkan item baru, NSAppTransportSecurity , dalam file plist dengan jenis Kamus , kemudian tambahkan sub item NSAllowsArbitraryLoads dalam kamus tipe Boolean , dan tetapkan nilai bool YA . Ini bekerja untuk saya.

Tejinder
sumber
1
NSAllowsArbitraryLoads pasti salah, jika benar itu memungkinkan semua koneksi tidak aman
Thiago Arreguy
dengan menambahkan di plist semua layanan web berfungsi dengan baik kecuali satu layanan web satu layanan web mengembalikan kesalahan server internal (500) di iOS 9 tetapi bekerja dengan baik di iOS8 atau lebih tinggi @ThiagoArreguy
amit gupta
Saran yang sangat buruk; lihat Kode paling berbahaya di dunia: memvalidasi sertifikat SSL dalam perangkat lunak non-browser . Diberikan pertanyaan jika penuh dengan cara yang disarankan untuk melakukan sesuatu, "aku juga" jawaban seperti ini tidak diperlukan.
jww
Saya Tahu ini saran yang buruk, tapi itu hanya solusi untuk saat ini dalam mode pengembangan saja. Apple telah memberikan kami fleksibilitas, jika itu sangat buruk, mereka tidak akan mengizinkan ini.
Tejinder
9

Pada 2015-09-25 (setelah pembaruan Xcode pada 2015-09-18):

Saya menggunakan metode non-malas, tetapi tidak berhasil. Berikut ini adalah percobaan saya.

Pertama,

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSExceptionDomains</key>
    <dict>
        <key>www.xxx.yyy.zzz</key>
        <dict>
            <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
            <true/>
            <key>NSTemporaryExceptionMinimumTLSVersion</key>
            <string>TLSv1.1</string>
            <key>NSIncludesSubdomains</key>
            <true/>
        </dict>
    </dict>
</dict>

Dan kedua,

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSExceptionDomains</key>
    <dict>
        <key>www.xxx.yyy.zzz</key>
        <dict>
            <key>NSExceptionAllowsInsecureHTTPLoads</key>
            <true/>
            <key>NSExceptionMinimumTLSVersion</key>
            <string>TLSv1.1</string>
            <key>NSIncludesSubdomains</key>
            <true/>
        </dict>
    </dict>
</dict>

Akhirnya, saya menggunakan metode malas:

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

Mungkin agak tidak aman, tetapi saya tidak dapat menemukan solusi lain.

Heedoo
sumber
Mengapa NSAllowsArbitraryLoadsdiatur true? Anda menumbangkan tujuan ATS. Lihat juga Kode paling berbahaya di dunia: memvalidasi sertifikat SSL dalam perangkat lunak non-browser . Perangkat lunak Anda baru saja membuat daftar.
jww
9

Di swift 4 dan xocde 10 adalah mengubah NSAllowsArbitraryLoads untuk Memungkinkan Beban Sewenang-wenang. jadi akan terlihat seperti ini:

<key>App Transport Security Settings</key>
<dict>
     <key>Allow Arbitrary Loads</key><true/>
</dict>
Faris
sumber
6

Mungkin layak disebutkan bagaimana menuju ke sana ...

Info.plist adalah salah satu file di bawah Main.storyboard atau viewController.swift.

Ketika Anda mengkliknya pertama kali, biasanya dalam format tabel, jadi klik kanan file dan 'open as' Source code dan kemudian tambahkan kode di bawah ini sampai akhir, yaitu:

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

Salin tempelkan kode tepat di atas

 "</dict>
</plist>"

yang pada akhirnya.

Naishta
sumber
Mengapa NSAllowsArbitraryLoadsdiatur true? Anda menumbangkan tujuan ATS. Lihat juga Kode paling berbahaya di dunia: memvalidasi sertifikat SSL dalam perangkat lunak non-browser . Perangkat lunak Anda baru saja membuat daftar.
jww
5

Pembaruan untuk Xcode 7.1, menghadapi masalah 27.10.15:

Nilai baru di Info.plist adalah "Pengaturan Keamanan Transport Transport". Dari sana, kamus ini harus berisi:

  • Izinkan Beban Sewenang-wenang = YA
  • Domain Pengecualian (masukkan di sini domain http Anda)
MkaysWork
sumber
4

Bagi mereka yang datang ke sini mencoba mencari alasan mengapa WKWebView mereka selalu berwarna putih dan tidak memuat apa pun (persis seperti yang dijelaskan di sini bagaimana cara membuat WKWebView bekerja dengan cepat dan untuk Aplikasi MacOS ):

Jika semua ilmu roket di atas tidak berfungsi untuk Anda periksa yang jelas: pengaturan kotak pasir

pengaturan kotak pasir]

Menjadi baru untuk cepat dan kakao, tetapi cukup berpengalaman dalam pemrograman saya menghabiskan sekitar 20 jam untuk menemukan solusi ini. Tak satu pun dari lusinan tutorial hipster-iOS atau intisari apel - tidak ada yang menyebutkan kotak centang kecil ini.

Alekseev Vladimir
sumber
Ya Tuhan, terima kasih banyak! Anda menyelamatkan saya pencarian 20 jam yang sama!
Brecht Machiels
2
tidak melihat bagian itu di bagian Kemampuan target (Xcode 9.4.1)
shim
3

Secara default, iOS hanya membolehkan API HTTPS. Karena HTTP tidak aman, Anda harus menonaktifkan keamanan transportasi App. Ada dua cara untuk menonaktifkan ATS: -

1. Menambahkan kode sumber dalam project info.plist dan menambahkan kode berikut dalam tag root.

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

2. Menggunakan info proyek.

Klik proyek pada proyek di panel kiri, pilih proyek sebagai target dan pilih tab info. Anda harus menambahkan kamus di struktur berikut.

masukkan deskripsi gambar di sini

varunrathi28
sumber
3

Bagaimana memperbaikinya?

masukkan deskripsi gambar di sini

Berikut langkah-langkah untuk memperbaikinya.

masukkan deskripsi gambar di sini masukkan deskripsi gambar di sini masukkan deskripsi gambar di sini masukkan deskripsi gambar di sini masukkan deskripsi gambar di sini

Kamani Jasmin
sumber
1

Menggunakan NSExceptionDomainsmungkin tidak menerapkan efek secara bersamaan karena situs target dapat memuat sumber daya (misalnya jsfile) dari domain eksternal berakhir http. Itu dapat diatasi dengan menambahkan domain eksternal ini NSExceptionDomainsjuga.

Untuk memeriksa sumber daya mana yang tidak dapat dimuat coba gunakan debugging jarak jauh. Ini tutorialnya: http://geeklearning.io/apache-cordova-and-remote-debugging-on-ios/

Nurlan Akashayev
sumber
0

Untuk Cordova, jika Anda ingin menambahkannya ke ios.json Anda, lakukan hal berikut:

"NSAppTransportSecurity": [
   {
      "xml": "<dict><key>NSAllowsArbitraryLoads</key><true /></dict>"
   }
]

Dan itu harus di dalam:

"*-Info.plist": {
   "parents": {
   }
}
zeusstl
sumber
Hanya <akses asal = "*" /> di config.xml tidak berfungsi. Tidak yakin apakah keduanya diperlukan, tetapi solusi ios.json menyegel kesepakatan bagi saya.
zeusstl
Mengapa NSAllowsArbitraryLoadsdiatur true? Anda menumbangkan tujuan ATS. Lihat juga Kode paling berbahaya di dunia: memvalidasi sertifikat SSL dalam perangkat lunak non-browser . Perangkat lunak Anda baru saja membuat daftar.
jww
-1

Seperti banyak yang telah dicatat, ini adalah masalah fitur yang datang dengan iOS 9.0. Mereka telah menambahkan sesuatu yang disebut Keamanan Transportasi Aplikasi, dan saya juga merasa terganggu ketika itu merusak Aplikasi saya.

Anda dapat membalutnya dengan kunci NSAllowsArbitraryLoads ke YA di bawah kamus NSAppTransportSecurity dalam file .plist Anda, tetapi pada akhirnya Anda harus menulis ulang kode yang membentuk URL Anda untuk membentuk HTTPS: // awalan.

Apple telah menulis ulang kelas NSUrlConnection di iOS 9.0. Anda dapat membacanya di NSURLConnection .

Selain itu, Anda mungkin harus mundur dari iOS 9.0 hingga Anda punya waktu untuk mengimplementasikan solusi yang benar.

Mark DeWald
sumber