Cara menandatangani aplikasi untuk macOS Catalina 10.15

gambar

[Catatan transl .: menerjemahkan pos yang menyebabkan diskusi luas tentang Habré, saya menjadi tertarik pada aturan baru untuk pengembang perangkat lunak yang diperkenalkan oleh Apple. Artikel ini berbicara tentang pengalaman pribadi dalam menguasai aturan dengan salah satu pengembang game.]

Pendahuluan


Dalam versi baru macOS, Apple membuat persyaratan tertentu untuk aplikasi yang dulunya merupakan rekomendasi: file eksekusi 64-bit, penandatanganan dan notaris. Aplikasi yang tidak memenuhi persyaratan ini tidak akan lagi diluncurkan.

Ini dilakukan untuk melindungi pekerjaan pengguna dan mencegah penyebaran program jahat, tetapi pada saat yang sama membuat hidup sangat sulit, terutama bagi orang-orang yang Mac bukan platform pengembangan utama, tetapi yang tetap ingin memulai atau terus mendukung Mac .

Ini terutama berlaku untuk pengembang game yang menerbitkan game Mac di Steam. Hingga perubahan terbaru, game yang diluncurkan dari Steam tidak perlu masuk dan disahkan, tetapi sekarang mereka harus mematuhi aturan yang sama dengan yang lainnya.

Saya baru saja selesai mencari tahu bagaimana menerapkan persyaratan ini untuk Airships saya : Conquer the Skies game. Airships berfungsi di Jawa, dan karenanya membutuhkan JVM, tetapi secara umum, semua hal lain akan berlaku untuk sebagian besar pengembang.

Inilah yang saya pelajari tentang menandatangani dan membuat notaris aplikasi Mac yang tidak dikompilasi secara langsung oleh Xcode. Harap dicatat bahwa informasi tersebut diperoleh dari penelitian saya sendiri dan mungkin tidak 100% akurat. Pertanyaan dan koreksi dipersilahkan.

Latar belakang


Artikel ini membahas penandatanganan dan notaris. Mendapatkan file program yang dapat dieksekusi 64-bit adalah tugas kompiler atau lingkungan pengembangan Anda.

Pada macOS, aplikasi biasanya dikemas dalam bundel - folder yang berisi file yang dapat dieksekusi, serta sumber daya tambahan dan metadata. Menandatangani bundel berarti membuat checksum kriptografi dari isi bundel dan kemudian membuat tanda tangan kriptografis dengan sertifikat yang dikeluarkan Apple kepada pengembang. Tanda tangan adalah pernyataan bahwa Anda secara pribadi menjamin perilaku aplikasi yang benar. Jika isi bundel berubah, checksum berubah, dan tanda tangan berhenti sesuai dengan mereka, memperingatkan sistem operasi bahwa perubahan tidak sah telah dilakukan pada bundel.

Penandatanganan aplikasi telah ada selama bertahun-tahun. Beberapa saat kemudian, aplikasi juga menjadi perlu untuk disahkan. Notaris berarti bahwa Anda mengirimkan aplikasi Apple yang ditandatangani, dan perusahaan melakukan pemeriksaan tambahan dan mendaftarkan aplikasi tersebut. Jika notaris berhasil, Anda "tetap" notaris ke aplikasi Anda, sehingga mesin offline tanpa akses ke Internet juga dapat memastikan bahwa aplikasi telah diaktakan.

Ini adalah semacam metafora untuk bekerja dengan dokumen kertas. Pengembang mengumpulkan dalam bundel semua bagian yang membentuk aplikasi. Kemudian ia membuat daftar semua elemen bundel (checksum) dan menandatangani daftar ini (dengan tanda tangan digital), yang ia tempelkan ke bundel. Kemudian ia menyerahkan bundel yang ditandatangani kepada notaris Mr. Yablokov, yang memeriksa apakah semuanya sesuai dengan bundel itu, dan kemudian mendaftarkannya. Dia memberi pengembang tanda terima yang dijepitkan stapler ke bundel. Yaitu, jika pengembang mengatakan bahwa aplikasi tersebut aman, dan Mr. Yablokov juga mengatakan bahwa itu aman, maka kemungkinan besar itu adalah. Dan jika orang jahat mencoba mengubah isinya, maka daftar elemen bundel akan berhenti sesuai dengan itu, dan pengguna akan tahu bahwa itu tidak perlu untuk menggunakannya.

Persyaratan


Apa yang diperlukan untuk menandatangani dan membuat notaris aplikasi:

  • Komputer Mac yang cukup baru untuk menjalankan Xcode 11 di atasnya, yaitu cukup baru untuk menjalankan macOS 10.14.3. Jika Anda belum menginstal Xcode, maka ruang kosong 25 GB diperlukan untuk instalasi.
  • Jika Anda belum menjadi pengembang Apple resmi, maka login ID Apple dan sekitar $ 110 diperlukan untuk keanggotaan.

Otentikasi dua faktor


Jika Anda belum memilikinya, aktifkan otentikasi dua faktor untuk ID Apple Anda. Ini dapat dilakukan dari perangkat-i apa pun atau dari Mac. Pada Mac, buka panel kontrol iCloud dari pengaturan Preferensi Sistem. Di bagian atas harus ada panel yang menyarankan untuk mengaktifkan 2FA.

Pembelian Keanggotaan


Masuk ke https://developer.apple.com/ menggunakan ID Apple Anda dan buka tab Keanggotaan. Beli atau tingkatkan keanggotaan Program Pengembang Apple Anda jika perlu. Harap perhatikan bahwa pemrosesan pembelian membutuhkan waktu pada sistem internal Apple, jadi jika Anda tidak dapat menghasilkan sertifikat (lihat di bawah), minum secangkir teh sebentar dan tenang.

ID aplikasi


Anda mungkin perlu mendaftarkan ID bundel aplikasi di backend pengembang. ID bundel dapat ditemukan di YourApp.app/Contents/Info.plist. (Anda dapat membuka bundel aplikasi dengan mengeklik kanannya dan memilih "Tampilkan Konten Paket.") Pengidentifikasi harus berupa com.yourcompanyname.applicationname, misalnya, Airships game saya memiliki com.zarkonnen.airships.

Untuk mendaftarkan ID, masuk ke https://developer.apple.com/ , pilih "Sertifikat, ID & Profil" di panel kiri, dan kemudian pilih "Pengidentifikasi" di halaman berikutnya. Kemudian Anda dapat mengklik tombol "+" untuk menambahkan pengenal aplikasi.

Kata sandi aplikasi


Untuk masuk dari baris perintah, Anda memerlukan kata sandi aplikasi, jadi buka https://appleid.apple.com/account/manage dan hasilkan.

Xcode dan alat


Instal Xcode melalui App Store App Mac. Kemudian instal juga alat-alat baris perintah Xcode dari https://developer.apple.com/download/more . Anda memerlukan Alat Baris Perintah untuk Xcode 11 atau versi Xcode yang Anda gunakan.

Sertifikat


Luncurkan Xcode, buka Preferensi, buka tab Akun. Jika perlu, tambahkan ID Apple Anda ke daftar akun. Kemudian klik tombol "Kelola Sertifikat ..." di sudut kanan bawah. Sertifikat yang Anda miliki untuk menandatangani aplikasi ditampilkan. Anda memerlukan sertifikat "Aplikasi ID Pengembang"; jika tidak ada dalam daftar, maka buatlah. Klik "Selesai" dan kemudian "Unduh" di jendela Preferensi: Akun untuk mengunduh sertifikat secara lokal.

Persiapan Aplikasi


Agar aplikasi berfungsi dengan benar pada sistem baru, file dan pustaka yang dapat dieksekusi harus 64-bit.

Selain itu, Mac OS melakukan operasi yang disebut "translokasi": untuk alasan keamanan, ia memindahkan bundel aplikasi yang sedang berjalan ke lokasi acak. Dalam kasus aplikasi saya, ini memanifestasikan dirinya dalam kenyataan bahwa itu tidak dapat menemukan file data yang terletak di sebelah bundel aplikasi. Anda bisa mendapatkan lokasi asli bundel aplikasi, tetapi saya memecahkan masalahnya dengan hanya meletakkan segala sesuatu di bundel.

Izin (Hak)


Ini adalah izin khusus yang ditambahkan oleh pengembang bersama dengan penandatanganan kode, yang memungkinkan aplikasi yang ditandatangani untuk melakukan tindakan tertentu. Jika Anda mengkompilasi aplikasi menggunakan Xcode, maka ia akan melakukan semuanya sendiri; jika tidak, Anda harus membuat file plist yang berisi semua hak yang Anda butuhkan. File Plist dapat dibuat menggunakan Xcode, dan di https://developer.apple.com/documentation/bundleresources/entitlements ada daftar hak.

Untuk membuat file plist baru menggunakan Xcode, pilih "File Baru" dan kemudian klik "Daftar Properti" di daftar yang muncul. Tambahkan elemen dengan hak yang Anda butuhkan ke kamus root; mereka memiliki arti boolean: YA.


Dalam kasus gim saya, karena ini ditulis dalam Java, saya membutuhkan izin berikut untuk JVM agar berfungsi: com.apple.security.cs.allow-jit, com.apple.security.cs.allow-unsign-executable-memory, com. apple.security.cs.disable-executable-page-protection, com.apple.security.cs.disable-library-validation, com.apple.security.cs.allow-dyld-environment-variable. Untuk pengguna, mereka terlihat mengintimidasi, jadi jika Anda tidak membutuhkannya, maka jangan menambahkannya.

Kemudian di artikel, kami akan menganggap bahwa Anda telah menempatkan hak Anda dalam file yang disebut entitlements.plist.

Menandatangani


Ini adalah proses pembuatan tanda tangan digital yang memberi tahu: orang yang memiliki akses ke sertifikat tanda tangan menjanjikan bahwa bundel aplikasi khusus ini dapat diandalkan dan tidak berbahaya. Setiap perubahan dalam bundel aplikasi (kecuali untuk melampirkan konfirmasi notaris, lihat di atas) setelah menandatanganinya membatalkan tanda tangan dan mengharuskan penandatanganan kembali bundel.

Ini juga berarti bahwa aplikasi Anda tidak boleh mengubah apa pun dalam konten bundel aplikasi, misalnya, jangan menaruh cache di sana.

Setiap file yang dapat dieksekusi dan perpustakaan dinamis dalam bundel aplikasi ditandatangani secara terpisah. Dalam beberapa kasus, perpustakaan mungkin sudah ditandatangani. Artinya, lebih sopan dan tenang untuk menandatangani bundel dengan menandatangani setiap elemen secara bergantian, dan kemudian menandatangani seluruh bundel. Jika ada elemen yang memiliki tanda tangan, maka ia akan tetap di tempatnya.

Cara kasar, tetapi efektif adalah dengan memaksa penandatanganan dalam, yaitu, tanda tangan Anda akan diterapkan ke semua elemen dari bundel aplikasi, menggantikan semua tanda tangan sebelumnya. Inilah yang akan kami lakukan, karena lebih sederhana dan karena tanda tangan sebelumnya mungkin tidak valid atau tidak cukup kuat.

Anda akan membutuhkan perintah menakutkan berikut:

codesign -s "Developer ID Application: <YourName>" --timestamp --options runtime -f --entitlements entitlements.plist --deep YourApp.app

Opsi --timestamp berarti cap waktu yang valid, yang diperlukan untuk notaris yang berhasil, disematkan dengan tanda tangan.

Opsi - opsi --options runtime berarti bahwa tanda tangan menyertakan "runtime yang diperkeras", yang juga diperlukan untuk notaris yang berhasil.

Anda dapat mempelajari tanda tangan oleh tim

codesign -d -vvvv YourApp.app

Anda juga harus menjalankan aplikasi untuk memastikan aplikasi tetap berfungsi setelah masuk.

Jika Anda ingin menandatangani elemen dengan cara yang lebih sopan, hapus perintah -f dan --deep dari perintah, pertama tandatangani semua file yang dapat dieksekusi dan pustaka di dalam aplikasi, dan kemudian seluruh aplikasi.

Notaris


Setelah menandatangani aplikasi, Anda harus memberikannya ke sistem Apple untuk notaris untuk mengatakan: "Lihat, saya menandatangani hal ini."

Untuk melakukan ini, pertama kompres aplikasi menjadi file zip khusus menggunakan perintah ditto:

/usr/bin/ditto -c -k --keepParent YourApp.app YourApp.zip

Cukup dengan membungkus aplikasi dalam zip menggunakan Finder atau baris perintah tidak akan berfungsi.

Kemudian kirim zip untuk notaris:

xcrun altool --notarize-app --primary-bundle-id "<id>" -u "<appleid>" -p "<app-specific password>" --file YourApp.zip

Contoh:

xcrun altool --notarize-app --primary-bundle-id "com.zarkonnen.airships" -u "dave@hotmail.com" -p "bwnh-pbbt-llpt-xxxx" --file Airships.zip

ID bundel dapat ditemukan dengan melihat YourApp.app/Contents/Info.plist. (Anda dapat membuka bundel aplikasi dengan mengeklik kanannya dan memilih "Tampilkan Konten Paket".)

Notaris bisa memakan waktu cukup lama. Ini biasanya beberapa detik atau menit, tetapi kadang-kadang bisa satu jam. Tuangkan teh lagi untuk Anda, atau sesuatu yang lebih kuat, pilih sendiri. Cepat atau lambat Anda akan mendapatkan sesuatu seperti ini:

No errors uploading 'YourApp.zip'.
RequestUUID = 29926ae6-f551-4d54-b283-e29d6f9b9156


Sekarang kita dapat menggunakan perintah berikut untuk memeriksa status bundel yang dikirim:

xcrun altool --notarization-info <RequestUUID> -u -u "<appleid>" -p "<app-specific password>"

Contoh:

xcrun altool --notarization-info 29926ae6-f551-4d54-b283-e29d6f9b9156 -u "dave@hotmail.com" -p "bwnh-pbbt-llpt-xxxx"

Sesuatu yang serupa akan ditampilkan:

           Tanggal: 2019-10-08 06:59:58 +0000
           Hash: 0774fb95035408bacecebd64935a611ecd27b45ad9cbf3cc1aa48fa1e0eaa649
     LogFileURL: https: //osxapps-ssl.itunes.apple.com/itunes-assets/Enigma123 / ...
         Status: sukses
    Kode Status: 0
 Pesan Status: Paket Disetujui 

Saya ulangi, konfirmasi biasanya memakan waktu sekitar 15 menit, tetapi kadang-kadang butuh beberapa jam untuk aplikasi yang sama. Ya seperti itu.

Jika status gagal, maka lihat kesalahan yang tercantum oleh URL file log. Jika Anda berhasil, lihatlah juga, karena mungkin ada peringatan, dan peringatan ini mungkin menjadi kesalahan ketika Apple memperketat persyaratannya lagi.

Lampiran


Akhirnya, kami akan "mempercepat" konfirmasi notaris ke bundel aplikasi sehingga bahkan Mac dapat memeriksanya tanpa koneksi internet. Untuk melakukan ini, Anda harus menjalankan perintah pendek yang mengejutkan:

xcrun stapler staple "YourApp.app"

Selamat, Anda telah mendaftar dan mengaktakan aplikasi Mac. Sekarang Anda dapat mendistribusikan bundel aplikasi dengan cara apa pun yang nyaman bagi Anda jika tidak berubah dalam proses.

Jawa


Jika Anda berada di kapal yang sama dengan saya dan Anda perlu menambahkan ke bundel dengan aplikasi JVM, kemudian lanjutkan membaca.

Ada beberapa opsi untuk menggabungkan bundel JVM dengan aplikasi Java. Saya akan merekomendasikan AppBundler, yang merupakan tugas semut yang melakukan semua pekerjaan untuk Anda. Awalnya, AppBundler dapat diunduh dari java.net, tetapi berkat pengabaian Oracle terhadap platform Java lainnya, sekarang Anda harus mengunduh versi terbaru dari https://github.com/TheInfiniteKind/appbundler .

Di sana Anda dapat menemukan sumber dan dokumentasi, tetapi bukan toples, karena diasumsikan bahwa Anda menggunakan Maven. Jika Anda tidak menggunakan Maven, maka toples dapat diambil dari sini: https://jar-download.com/artifacts/com.panayotis/appbundler

Ikuti instruksi dalam dokumentasi pada halaman github untuk mengonfigurasi bundel. Secara pribadi, saya menggunakan NetBeans, dan untuk menyelesaikan masalah, saya memasukkan baris berikut ke build.xml:

 <target name = "- post-jar">
   <taskdef name = "bundleapp" 
     classpath = "lib / appbundler-1.1.0.jar"
     classname = "com.oracle.appbundler.AppBundlerTask" />
   <bundleapp 
       jvmrequired = "1.7"
       outputdirectory = "/ home / zar / Desktop"
       name = "Airships"
       displayname = "Airships"
       executableName = "Airships"
       identifier = "com.zarkonnen.airships"
       shortversion = "1"
       versi = "1"
       mainclassname = "com.zarkonnen.airships.Main"
       hak cipta = "2019 David Stark"
       applicationCategory = "public.app-category.games">
       <classpath dir = "dist" />
       <runtime dir = "/ home / zar / Desktop / jdk-11.0.4.jdk / Contents / Home" />
       <arch name = "x86_64" />
       <option value = "- Dapple.laf.useScreenMenuBar = true" />
       <option value = "- Dcom.apple.macos.use-file-dialog-Packages = true" />
       <option value = "- Dcom.apple.macos.useScreenMenuBar = true" />
       <option value = "- Dcom.apple.mrj.application.apple.menu.about.name = Airships" />
       <option value = "- Xdock: name = Airships" />
       <option value = "- Dcom.apple.smallTabs = true" />
       <option value = "- Dfile.encoding = UTF-8" />
       <option value = "- Xmx1024M" name = "Xmx" />
   </bundleapp>
 </target> 

Ini adalah tugas yang dilakukan setelah membuat file jar. Ini menggunakan appbundler-1.1.0.jar untuk membuat bundel aplikasi dengan JVM tertanam.

JDK yang saya gunakan dapat diunduh dari https://www.oracle.com/technetwork/java/javase/downloads/jdk11-downloads-5066655.html . Saya memilih versi 11 karena memiliki LTS (dukungan jangka panjang), tetapi menggunakan ketentuan lisensi Oracle yang lama, sementara versi 13 memiliki serangkaian pembatasan lisensi baru yang aneh.

Ada juga OpenJDK JVM yang lebih bebas secara hukum, tetapi saya tidak bisa membuatnya bekerja dengan bundler aplikasi.

Catatan: JVM adalah "Java Virtual Machine". JRE adalah "Java Runtime Environment" yang mencakup JVM plus elemen tambahan, seperti Java updater. JDK adalah "Java Development Kit" yang terdiri dari JRE plus hal-hal yang diperlukan untuk menulis program Java, seperti kompiler. Sebelum Java 8, JRE tersedia untuk pengguna akhir secara terpisah, tetapi sejak itu hanya JDK yang tersedia, dan oleh karena itu kami mengaitkan lingkungan pengembangan Java dengan permainan komputer.

Anda harus bisa menandatangani dan mensahkan bundel yang dihasilkan secara mendalam. Dokumentasi AppBundler memiliki sejumlah opsi tambahan, seperti menambahkan ikon, asosiasi tipe file, dan menghasilkan JVM yang dipreteli untuk aplikasi tersebut.

Bacaan lebih lanjut



Selain itu


  • Pengguna Reddit AMemoryOfEternity mengajukan pertanyaan di forum pengembang Steam dan ternyata sementara pemberitahuan untuk aplikasi Steam tidak diperlukan sama sekali. Mereka harus 64-bit, tetapi tidak jelas apakah wajib untuk menandatanganinya. Tautan, membutuhkan akses ke Steamworks
  • Apple untuk sementara mengendurkan aturan notaris, jadi untuk saat ini memungkinkan Anda untuk mengesahkan aplikasi yang tidak memiliki runtime yang mengeras, memiliki sub-komponen, tidak memiliki ID pengembang, tidak memiliki cap waktu, dll. Hal-hal seperti itu masih akan ditampilkan dalam laporan notaris sebagai peringatan, jadi untuk menjaga masa depan, lebih baik untuk mencoba menyingkirkannya.
  • Menurut Valve, agar Steam API berfungsi, Anda perlu memberikan hak com.apple.security.cs.allow-dyld-environment-variable: “Steam menyuntikkan API dylib melalui DYLD_INSERT_LIBRARY, yang diblokir secara default oleh hardened runtime, tetapi API dylib sendiri ditandatangani. dan harus diuji, jadi cukup tambahkan izin "com.apple.security.cs.allow-dyld-environment-variable" untuk dapat menetapkan variabel lingkungan DYLD. "

Source: https://habr.com/ru/post/id471816/


All Articles