"Interaksi pengguna tidak diperbolehkan" mencoba menandatangani aplikasi OSX menggunakan codesign

145

Pembuatan otomatis kami berjalan di Jenkins. Build itu sendiri berjalan di atas slave, dengan slave dieksekusi melalui SSH.

Saya mendapatkan kesalahan:

00:03:25.113 [codesign-app] build/App.app: User interaction is not allowed.

Saya telah mencoba setiap saran yang saya lihat sejauh ini di posting lain di sini:

  • Menggunakan keamanan membuka kunci-rantai segera sebelum masuk untuk membuka kunci rantai.
  • Memindahkan kunci masuk ke gantungan kunci sendiri.
  • Memindahkan kunci masuk ke gantungan kunci login.
  • Memindahkan kunci masuk ke gantungan kunci sistem.
  • Secara manual mengatur daftar-gantungan kunci hanya gantungan kunci yang berisi kunci.

Dalam semua kasus, saya mendapatkan kesalahan yang sama.

Dalam upaya untuk mendiagnosis masalah ini, saya mencoba menjalankan perintah "keamanan membuka-gantungan kunci" di terminal lokal saya dan menemukan bahwa itu tidak benar-benar membuka kunci-kunci - jika saya melihat di Akses Keychain, simbol kunci masih ada. Ini adalah kasus apakah saya meneruskan kata sandi pada baris perintah atau apakah saya membiarkannya meminta saya untuk itu. Membuka kunci rantai yang sama menggunakan GUI akan meminta saya untuk kata sandi dan kemudian membukanya. Selain itu, jika saya menjalankan "keamanan kunci-gantungan kunci", saya lakukan melihat kunci tombol segera setelah menjalankan perintah. Ini membuat saya berpikir bahwa membuka kunci-kunci tidak benar-benar berfungsi. Saya mengalami perilaku yang sama pada Lion (yang kami gunakan untuk build slave) dan Mavericks (yang sedang saya kembangkan.)

Selanjutnya, saya mencoba menambahkan -v ke semua perintah keamanan:

list-keychains "-d" "system" "-s" "/Users/tester/.secret/App.keychain"
Listing keychains to see if it was added: ((
        "/Library/Keychains/System.keychain"
))
unlock-keychain "-p" "**PASSWORD**" "/Users/tester/.secret/App.keychain"
build/App.app: User interaction is not allowed.

Dari sini, tampaknya gantungan kunci daftar adalah yang tidak berfungsi. Mungkin tidak berhasil. : /

Ada pertanyaan serupa di sini . Solusinya menarik - set "SessionCreate" menjadi true di launchctl. Tapi saya tidak membangun pada master - proses build saya dimulai dari SSH pada mesin slave build. Mungkin ada cara baris perintah untuk melakukan apa yang launchctl lakukan ketika Anda menjalankan "SessionCreate"?

Trejkaz
sumber
Bagaimana cara mengatur kata sandi gantungan kunci di circleci?
Sachin Kumaram
@SachinKumaram terdengar seperti pertanyaan baru yang layak?
Trejkaz

Jawaban:

205

Saya juga telah berjuang ini. Tidak ada yang membantu sampai saya mencoba saran di http://devnet.jetbrains.com/thread/311971 . Terima kasih ashish agrawal!

Login pengguna bangunan Anda melalui GUI dan buka Akses Keychain. Pilih kunci pribadi penandatanganan Anda, klik kanan, pilih Dapatkan Info, ubah ke tab Kontrol Akses dan pilih "Izinkan semua aplikasi mengakses item ini".

tab kontrol akses

bmauter
sumber
2
Sama-sama. Anda mungkin juga mempertimbangkan untuk menambahkan kode tanda ke daftar aplikasi di bagian bawah daripada membiarkan semua aplikasi seperti yang saya lakukan. Sudah ada di screenshot saya, tapi saya pikir awalnya tidak.
bmauter
3
Saya harus menyembunyikan direktori / usr dengan apple.stackexchange.com/a/34872/6052 untuk dapat menambahkan codesignke daftar "Selalu Izinkan".
Perbatasan Heath
24
hanya catatan bahwa selain ini Anda harus melakukan semuanya security unlock-keychain, juga
cwd
13
Selain itu, Anda mungkin ingin memindahkan kunci Anda dari login ke sistem sehingga dapat diakses ketika Anda melakukan build jarak jauh pada mesin Anda.
Krystian
8
Adakah yang tahu cara untuk melakukan ini dari baris perintah? Mesin build jarak jauh saya tidak akan membiarkan saya melakukan ini di atas berbagi layar untuk alasan keamanan .
devios1
78

Yah, saya kira saya bisa menjawab pertanyaan saya sendiri hari ini, karena setelah menusuknya selama dua setengah hari, salah satu hal yang saya coba tampaknya berhasil. Saya hanya akan mundur darinya sekarang dan berharap itu terus bekerja.

Pada dasarnya, sepertinya -d systemtidak berfungsi. Jadi banyak jawaban untuk pertanyaan lain di sekitar sini mungkin harus diperbarui untuk mencerminkan hal itu.

security -v list-keychains -s "$KEYCHAIN" "$HOME/Library/Keychains/login.keychain"
security list-keychains # so we can verify that it was added if it fails again
security -v unlock-keychain -p "$KEYCHAIN_PASSWORD" "$KEYCHAIN"
codesign --sign "$SIGNER_IDENTITY" --force --signature-size 9600 \
         --resource-rules src/AppResourceRules.plist --timestamp --verbose \
         "$APP"
Trejkaz
sumber
17
Terima kasih. Saya sudah bisa mempersempit ini. Jalankan saja perintah berikut ini tepat sebelum mencoba membangun: security -v unlock-keychain -p "$ KEYCHAIN_PASSWORD" "$ HOME / Library / Gantungan Kunci / login.keychain"
pir800
3
Jadi tidak ada cara untuk mengakses codesignmelalui ssh tanpa benar-benar menyimpan kata sandi login di dalam beberapa skrip?
chakrit
2
@chakrit dalam contoh di atas, saya hanya melewatkan kata sandi gantungan kunci, bukan kata sandi masuk. Saya menyadari bahwa bagi banyak pengguna, gantungan kunci masuk adalah satu-satunya gantungan kunci, tetapi dalam kasus kami, kami menyimpan kunci penandatanganan di dalam keystore terpisah untuk membuatnya lebih mudah disinkronkan untuk membuat mesin. Tapi ya, banyak dari hal-hal ini tampaknya agak merepotkan untuk pembuatan otomatis, membuat saya bertanya-tanya apakah Apple bahkan membuat pembuatan otomatis.
Trejkaz
@Trejkaz oh oke, minimal berbagi kata sandi gantungan kunci tidak seburuk itu.
chakrit
Dalam kasus penggunaan saya membangun jarak jauh otomatis, menyimpan kata sandi gantungan kunci ke .envfile tidak terlalu buruk, karena .envfile tersebut sudah berisi kunci sensitif misalnya. AWS dan Heroku. Dalam kasus kami kredensial tanda kode build terkait disimpan di Keychain yang baru dibuat yang kemudian dihapus setelah build. Kemudian dibuat kembali untuk bangunan berikutnya. Namun, logingantungan kunci masih harus dibuka, begitu security unlock-keychain -p pass login.keychainjuga tautan yang hilang di sini. Terima kasih!
Petrus Repo
19

Tidak ada jawaban lain yang bekerja untuk saya.

Apa yang akhirnya menyelamatkan saya adalah pos ini

Singkatnya, ini bisa disebabkan oleh batas waktu default 5 menit, yang akan memicu kesalahan ini setelah lama dibangun.

Memperbaiki:

security set-keychain-settings -t 3600 -l ~/Library/Keychains/login.keychain
yonix
sumber
2
Di El Capitan, Anda dapat melakukannya melalui antarmuka pengguna juga. Cukup buka aplikasi gantungan kunci, klik kanan pada gantungan kunci Anda (masuk, sistem dll.) Dan klik pada sesuatu yang cocok dengan pengaturan perubahan untuk yang terbaik dari <your_keychain>.
rubybeginner
Ini selalu mengatur akses gantungan kunci Sistem saya kembali Confirmbahkan setelah saya mengubah akses. : /
Alex Zavatone
Itu membantu saya !!
Nori
Saya sudah berjuang dengan itu selama 2 hari, sebelum saya menemukan komentar Anda, terima kasih !!!
Gilad Novik
16

Cobalah untuk menelepon security unlock-keychaindan codesignsebagai perintah satu baris. Ini membantu saya. Sesuatu seperti:

security unlock-keychain -p <password> /Users/<user>/Library/Keychains/login.keychain && codesign --force --verify --verbose --sign "<certificate id>" <app name>
ZhekaKozlov
sumber
4
Itu sama dengan melakukannya pada dua baris. Saya kira perbedaannya adalah bahwa jika perintah pertama gagal, itu tidak akan menjalankan yang kedua.
Trejkaz
1
Bagi saya mereka tidak sama. Saya memanggil mereka melalui semut sshexecdan setiap kali itu membuat sesi ssh baru.
ZhekaKozlov
2
Anda dapat melakukan lebih dari satu baris melalui sesi ssh tunggal juga, jika Anda benar-benar menginginkannya. Jadi ... masih sama, selain dari perawatan kesalahan.
Trejkaz
13

Menggunakan Keamanan untuk membuat Keychain untuk / usr / bin / codesign

Mengimpor sertifikat dan membuatnya bekerja dengan codesign terprogram tidak masalah menggunakan login atau gantungan kunci Sistem atau berdoa kepada beberapa dewa codesign. Anda hanya perlu mengatur izin yang benar. Saya merekomendasikan membuat gantungan kunci baru khusus untuk keperluan codesign.

Hari-hari ini codesignuntuk tidak menghasilkan errSecInternalComponentAnda perlu mendapatkan daftar partisi (ACL) yang benar. Saya akan berjalan melalui langkah-langkah:

Buat Keychain

security create-keychain -p "${KEYCHAIN_PASSWORD}" "${KEYCHAIN_NAME}"

pada titik ini gantungan kunci tidak terkunci tetapi tidak akan muncul Keychain Access.

Tambahkan Keychain baru ke daftar pencarian

security list-keychains -s "${KEYCHAIN_NAME}" "${OLD_KEYCHAIN_NAMES[@]}"

Tambahkan Keychain baru ke daftar. Jika Anda tidak pertama-tama mengambil daftar asli dari list-keychainsAnda tidak akan lagi ada login.keychaindalam daftar pencarian Anda.

Buka kunci rantai kunci

security unlock-keychain -p "${KEYCHAIN_PASSWORD}" "${KEYCHAIN_NAME}"

Ini berlebihan jika Anda membuat Keychain di atas, tetapi jika Keychain sudah ada maka perlu.

Hapus default dari Gantungan Kunci

security set-keychain-settings "${TESTING_KEYCHAIN}"

Dengan tidak menentukan argumen apa pun, ini akan mengatur batas waktu kunci otomatis menjadi tidak terbatas dan menghapus kunci otomatis saat tidur.

Impor sertifikat penandatanganan Anda dari .p12

security import "${DIST_CER}" -P "${CERTIFICATE_PASSWORD}" -k "${KEYCHAIN_NAME}" -T /usr/bin/codesign

Impor sertifikat dan berikan codesignakses melalui -Topsi.

Atur ACL pada gantungan kunci

security set-key-partition-list -S apple-tool:,apple: -s -k "${KEYCHAIN_PASSWORD}" "${KEYCHAIN_NAME}"

Ini adalah persyaratan yang banyak orang lewatkan. Anda dapat melihat apa yang dilakukan macOS dengan menggunakan dump-keychain. Yang mana dalam hal penandaan kode memerlukan apple:dan apple-tool:. -smengacu pada sertifikat penandatanganan.

Gitlab-Runner, Jenkins dan sejenisnya

Satu hal yang sangat penting untuk setiap pelari tipe CI atau sistem pembangunan adalah untuk memastikan proses dimulai dari launchddengan benar. Pastikan daftar Anda berisi <SessionCreate> </true>.

Tidak benar mencocokkan pemilik gantungan kunci dengan proses pembuatan dan memastikan sesi keamanan dibuat akan menghasilkan semua jenis sakit kepala. Berbicara secara diagnostik, Anda dapat memperkenalkan list-keychainsdan melihat apakah hasilnya sesuai dengan harapan Anda.

Ini dari halaman launchd.plistmanual:

SessionCreate <boolean>

Kunci ini menentukan bahwa pekerjaan tersebut harus ditelurkan ke dalam sesi audit keamanan baru dan bukan sesi default untuk konteksnya. Lihat audit (2) untuk detailnya.

UserName <string>

Kunci opsional ini menetapkan pengguna untuk menjalankan pekerjaan sebagai. Kunci ini hanya berlaku untuk layanan yang dimuat ke domain sistem istimewa.

GroupName <string>

Kunci opsional ini menetapkan grup untuk menjalankan pekerjaan sebagai. Kunci ini hanya berlaku untuk layanan yang dimuat ke domain sistem istimewa. Jika UserName diatur dan GroupName tidak, maka grup akan diatur ke grup utama pengguna.

Akhirnya codesign

Anda dapat mencari hash sertifikat penandatanganan menggunakan find-identity

security find-identity -p codesigning -v

Menyandikan kerangka kerja, dylib, dll.

/usr/bin/codesign --verbose=4 -f -s "$SIGNER_HASH" "$SIGNABLE"

Codesign bundel aplikasi

/usr/bin/codesign --verbose=4 -f -s "$SIGNER_HASH" --entitlements entitlements.xcent "$SIGNABLE"

Catatan akhir - jika Anda melihat bagaimana Xcode melakukannya mereka mengatur CODESIGN_ALLOCATEuntuk menggunakan yang ada dalam Xcode, bukan di /usr/bin.

export CODESIGN_ALLOCATE="$( xcrun --find codesign_allocate )"

Jalur pencarian diatur ke ${PLATFORM_PATH}:${TOOLCHAIN_PATH}:${PATH}, di mana jalur PLATFORM adalah direktori / usr / bin untuk SDK target yang diberikan dan TOOLCHAIN_PATH adalah / usr / bin untuk alat host Xcode.

Cameron Lowell Palmer
sumber
3
Sobat Anda pasti bisa menulis artikel tentang itu, saya sudah mencari ini sejak 2 hari. Saya tidak tahu berapa banyak barang dan posting stackoverflow yang saya baca. Terima kasih banyak!
Damien
Terima kasih untuk panduan bermanfaat ini!
Taras Nikulin
ACL pada gantungan kunci adalah bagian yang hilang bagi saya. terima kasih untuk penjelasan yang jelas pak!
Keuha
11

Masukkan kunci Anda di gantungan kunci Sistem

Alistra
sumber
Tetapi masih meminta nama pengguna dan kata sandi
Durai Amuthan.H
Bagaimana cara memasukkan kunci dalam sistem keychain ....... akan menyalin paste dari pekerjaan akses gantungan kunci?
Ashish Karpe
Seret dan lepas @AshishKarpe
Alistra
Apakah Tarik dan lepaskan masih mendapatkan galat yang sama: === BUILD TARGET PatientPortal PROYEK PatientPortal DENGAN KONFIGURASI Debug === Periksa ketergantungan Tidak ada profil untuk 'com.abc.xyz360' ditemukan: Xcode tidak dapat menemukan pencocokan profil pencocokan dengan com .abc.xyz360 '. Diperlukan penandatanganan kode untuk jenis produk 'Aplikasi' di SDK 'iOS 10.2'
Ashish Karpe
Dikatakan Anda tidak memiliki profil bawaan yang terpasang pada mesin, bukan berarti Anda kehilangan kunci @AshishKarpe
Alistra
5

Jadi ini adalah perintah yang berfungsi. -Aadalah untuk mencegah Mac dari meminta kata sandi. Mengimpor ke system.keychain tidak memerlukan GUI.

sudo security import <cert.p12> -k "/Library/Keychains/System.keychain" -P <passphrase> -A

Merlin Ran
sumber
3

Gantungan kunci saya terkunci. Itu menolak kemajuan saya untuk mengubah fakta itu ...

Keychain Access-> Keychain First Aid-> Repair, dan voilá !

Alex Gray
sumber
2

Membuka kunci rantai tidak cukup. Anda juga harus mengatur akses kunci pribadi ke "Izinkan semua aplikasi mengakses item ini". Dan untuk melakukan itu dari command line memerlukan mengimpor kembali kunci. Jadi untuk mengambil beberapa hal sekaligus:

Buka kunci rantai masuk jika terkunci. Seharusnya tidak dikunci, tapi bagaimanapun juga begini caranya:

security -v unlock-keychain -p "$KEYCHAIN_PASSWORD" "~/Library/Keychains/login.keychain"

Jika karena alasan tertentu mesin build Anda memiliki kunci masuk login, dan Anda tidak ingin mengekspos kata sandi itu dalam sebuah skrip, maka Anda harus menggunakan gantungan kunci yang berbeda. Anda dapat membuat satu di tempat dan menggunakannya di perintah sebelumnya dan berikut. Untuk membuat satu di tempat:

security create-keychain -p 'temporaryPassword' MyKeychain.keychain
security list-keychains -d user -s login.keychain MyKeychain.keychain

Kemudian impor sertifikat Anda dan kunci pribadi terkait ke gantungan kunci login menggunakan parameter -A. Perhatikan bahwa Anda tidak perlu sudo untuk semua ini ...

security import <cert.p12> -k "~/Library/Keychains/login.keychain" -P <passphrase> -A

Parameter -A adalah apa yang akan membuat kunci pribadi Anda diatur ke "Izinkan semua aplikasi mengakses item ini"

Jadi, dengan menggunakan semua ini, Anda harus dapat membuat skrip yang menginstal sertifikat yang diperlukan untuk membuat rilis ipa dan menandatanganinya tanpa cepat. Anda dapat menyimpan file .p12 di repo Anda, sehingga mesin apa pun dapat membangun ipa Anda tanpa memerlukan pengaturan manual.

Radu Simionescu
sumber
2

Selain membuka kunci gantungan kunci (sebagaimana disebutkan dalam jawaban lain), Anda harus mengizinkan akses dari semua aplikasi ke token autentikasi Xcode di gantungan kunci:

  • Pilih gantungan kunci "login"
  • Pilih kategori "Semua Item"
  • Cari kata kunci "xcode"
  • Pilih "Izinkan semua aplikasi untuk mengakses item ini" untuk semua token Xcode
  • Jangan lupa untuk menambahkan kunci pembuka kunci langkah (dari jawaban sebelumnya)

Tangkapan layar

Vitaliy Gozhenko
sumber
1

Impor kunci Anda ke gantungan kunci Sistem. Anda dapat menggunakan perintah ini:

sudo security import YourKey.p12 -k /Library/Keychains/System.keychain -P PasswordToYourKey -T /usr/bin/codesign
Lukasz Czerwinski
sumber
1

Jadi saya mencoba setiap jawaban di sini dan ada sesuatu yang tidak bertambah. Akhirnya saya menemukan ketika saya me-reboot layanan CI saya, itu berjalan di bawah pengguna yang berbeda dari yang saya harapkan. Mengubah ke pengguna yang benar-benar memiliki akses ke kunci dalam rantai masuk mereka memperbaiki segalanya. Ini mungkin bukan masalah umum, tetapi ingin mendokumentasikan alasan spesifik saya untuk kesalahan ini, kalau-kalau itu terjadi pada orang lain.

Kevin DiTraglia
sumber
Saya memiliki masalah yang persis sama. Terima kasih atas jawaban Anda. :)
Paweł K
0

Bagi saya tidak ada yang berhasil tampaknya harus menginstal ulang Xcode lagi. Jenkins terus memberikan kesalahan yang sama. Anda akan menghemat banyak waktu jika Anda hanya memindahkan instalasi Xcode ke Trash dan menginstal ulang. Pastikan Anda menjalankan perintah codesign dari baris perintah setidaknya sekali.

Bahkan setelah jika Anda mendapatkan kesalahan yang sama cobalah mengatur 'Buka Kunci Keychain?' properti dalam Jenkins dan berikan path ke login.keychain Anda di bawah / Pengguna /${USER}/Library/Keychains/login.keychain

Saya harap Tuhan bersamamu setelah itu.

Kaushik Bhatt
sumber
0

Dalam kasus saya, ini disebabkan oleh gantungan kunci yang dibuat dengan batas waktu default 300-an dan kompilasi xcode panjang yang berlangsung lebih dari 300-an. Solusinya, bagi saya, adalah untuk memohon:

security set-keychain-settings -t <longer timeout in seconds> <keychain>

segera setelah membuat gantungan kunci sementara.

Justin Randall
sumber
0

Saya menjalankan semua saran ini dan masih mengalami masalah menggunakan fastlane gym dalam pekerjaan Jenkins. Saya memiliki sertifikat yang diinstal dan gantungan kunci tidak terkunci, dan dapat men-codesign pada slave ketika saya secara manual menjalankan perintah codesign pada baris perintah.

Sebagai solusinya, jika Jenkins terhubung ke budak menggunakan JNLP, bukan SSH, Anda akan bisa untuk codesign.

Dan Stark
sumber
0

Bagi saya itu terjadi ketika ada gantungan kunci kedua ditambahkan secara manual dan terkunci. Untuk beberapa alasan codesignmencoba mengakses gantungan kunci yang terkunci dan gagal meskipun sertifikat ada di gantungan kunci masuk (dan tidak dikunci). Membuka kunci yang kedua memecahkan masalah. Tidak masuk akal bagi saya.

Maxime Viargues
sumber
-1

Setelah mencoba sejumlah solusi di atas. Saya menyadari bahwa satu faktor yang saya miliki, adalah bahwa saya mulai membangun menggunakan ION Console. Ketika saya kembali membuat pembuatan dari aplikasi Terminal, semuanya bekerja dengan baik.

Sean Eisenheim
sumber