Codeign kullanarak bir OSX uygulamasını imzalamaya çalışırken "kullanıcı etkileşimine izin verilmez"


150

Otomatik derlememiz Jenkins üzerinde çalışıyor. Yapının kendisi, SSH aracılığıyla slave'lerin çalıştırılmasıyla slave'ler üzerinde çalışıyor.

Bir hata alıyorum:

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

Şimdiye kadar gördüğüm her öneriyi buradaki diğer yazılarda denedim:

  • Anahtar zincirinin kilidini açmak için imzalamadan hemen önce güvenlik kilidi açma anahtar zincirini kullanma.
  • İmzalama anahtarını kendi anahtar zincirine taşımak.
  • İmzalama anahtarını oturum açma anahtar zincirine taşıma.
  • İmzalama anahtarını sistem anahtar zincirine taşıma.
  • Liste anahtar zincirlerini yalnızca anahtarı içeren anahtar zincirine manuel olarak ayarlama.

Her durumda aynı hatayı alıyorum.

Sorunu teşhis etme girişiminde, yerel terminalimde "güvenlik kilidi açma-anahtar zinciri" komutunu çalıştırmayı denedim ve bunun aslında anahtar zincirinin kilidini açmadığını fark ettim - Anahtar Zinciri Erişimi'ne bakarsam, kilit sembolü hala orada. Bu, parolayı komut satırından geçip geçmediğim veya benden istemesine izin verip vermediğimdir. GUI'yi kullanarak aynı anahtar zincirinin kilidini açmak, benden şifreyi soracak ve ardından kilidi açacaktır. Ben çalıştırırsanız Ayrıca, ben, "güvenlik kilidi-Anahtarlık" do hemen komutu çalıştırdıktan sonra tuş kilidi bakın. Bu bana, kilit açma anahtarının aslında çalışmadığını düşündürüyor. Aynı davranışı Lion'da (inşa köleleri için kullandığımız) ve Mavericks'te (üzerinde geliştirdiğim) yaşıyorum.

Sonra, tüm güvenlik komutlarına -v eklemeyi denedim:

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.

Bundan, işe yaramayan şey liste anahtar zincirleri gibi görünüyor. Belki ikisi de işe yaramaz. : /

Burada benzer bir soru var . Çözüm ilginç - launchctl'de "SessionCreate" öğesini true olarak ayarlayın. Ancak, master üzerine inşa etmiyorum - yapım sürecim bir slave yapım makinesinde SSH'den başlatılıyor. Belki "SessionCreate" çalıştırdığınızda launchctl'nin yaptığı şeyi yapmanın bir komut satırı yolu vardır?


Circleci'de anahtarlık şifresi nasıl ayarlanır?
Sachin Kumaram

@SachinKumaram geçerli yeni bir soru gibi geliyor mu?
Trejkaz

Yanıtlar:


207

Ben de bununla mücadele ediyorum. Http://devnet.jetbrains.com/thread/311971 adresindeki öneriyi deneyene kadar hiçbir şey yardımcı olmadı . Teşekkürler külçe agrawal!

Yapı kullanıcınıza GUI aracılığıyla giriş yapın ve Anahtar Zinciri Erişimini açın. İmza özel anahtarınızı seçin, sağ tıklayın, Bilgi Al'ı seçin, Erişim Kontrolü sekmesine geçin ve "Tüm uygulamaların bu öğeye erişmesine izin ver" seçeneğini seçin.

erişim kontrol sekmesi


2
Rica ederim. Benim yaptığım gibi tüm uygulamalara izin vermek yerine alttaki uygulama listesine kod işareti eklemeyi de düşünebilirsiniz. Zaten ekran görüntüsümde var, ama bence aslında değildi.
bmauter

3
"Her Zaman İzin Ver" listesine ekleyebilmek için / usr dizinini apple.stackexchange.com/a/34872/6052 ile göstermem gerekiyordu codesign.
Heath Borders

24
bu sadece bir not buna ek olarak size bütün yapmanız gereken security unlock-keychainçok şeyler,
cwd

14
Ek olarak, anahtarlarınızı oturum açma durumundan sisteme taşımak isteyebilirsiniz, böylece makinenizde uzaktan derlemeler yaptığınızda erişilebilirler.
Krystian

9
Bunu komut satırından yapmanın herhangi bir yolunu bilen var mı? Uzak derleme makinem güvenlik nedenleriyle bunu ekran paylaşımı üzerinden yapmama izin vermiyor .
devios1

79

Sanırım bugün kendi soruma cevap vereceğim, çünkü iki buçuk günden fazla bıçakladıktan sonra denediğim şeylerden biri işe yaradı. Şimdi ondan uzaklaşacağım ve çalışmaya devam etmesini umuyorum.

Esasen, -d systemaslında çalışmıyor gibi görünüyor . Bu nedenle, buradaki diğer sorulara verilen birçok cevap muhtemelen bunu yansıtacak şekilde güncellenmelidir.

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"

17
Teşekkürler. Bunu daraltabildim. Oluşturmaya çalışmadan hemen önce aşağıdaki komutu çalıştırın: security -v unlock-keychain -p "$ KEYCHAIN_PASSWORD" "$ HOME / Library / Keychains / login.keychain"
pir800

3
Yani codesignoturum açma şifresini bir betik içinde saklamadan ssh üzerinden erişmenin bir yolu yok mu?
chakrit

2
@chakrit yukarıdaki örnekte, oturum açma parolasını değil, yalnızca anahtarlık parolasını geçiyorum. Birçok kullanıcı için oturum açma anahtar zincirinin tek anahtar zinciri olduğunun farkındayım, ancak bizim durumumuzda, makine oluşturmak için senkronize olmalarını kolaylaştırmak için imzalama anahtarlarını ayrı bir anahtar deposunda tutuyoruz. Ancak evet, bu şeylerin çoğu otomatikleştirilmiş derlemeler için oldukça sakıncalı görünüyor ve Apple'ın otomatikleştirilmiş derlemeler yapıp yapmadığını merak etmeme neden oluyor.
Trejkaz

@Trejkaz oh tamam, en azından bir anahtarlık şifresini paylaşmak o kadar da kötü değil.
chakrit

Benim kullanımımdaki otomatik uzaktan derlemeler durumunda, anahtar zinciri şifresini bir .envdosyaya depolamak o kadar da kötü değil, çünkü .envdosya zaten örn. AWS ve Heroku. Bizim durumumuzda, derlemeyle ilgili kod işareti kimlik bilgileri, yeni oluşturulan bir Anahtar Zincirinde depolanır ve daha sonra derlemeden sonra kaldırılır. Daha sonra bir sonraki yapı için yeniden oluşturulur. Ancak, loginanahtarlık hala açık olmalı security unlock-keychain -p pass login.keychain, buradaki eksik bağlantı da öyleydi. Teşekkürler!
Petrus Repo

19

Diğer cevapların hiçbiri benim için işe yaramadı.

Sonunda beni kurtaran bu yazı oldu

Özetlemek gerekirse, bu, uzun bir derlemeden sonra bu hatayı tetikleyecek olan 5 dakikalık bir varsayılan zaman aşımından kaynaklanıyor olabilir.

Düzeltmek:

security set-keychain-settings -t 3600 -l ~/Library/Keychains/login.keychain

2
El Capitan'da bunu kullanıcı arayüzünden de yapabilirsiniz. Anahtar zinciri uygulamasını açın, anahtar zincirinize sağ tıklayın (giriş, sistem vb.) Ve '<anahtar zinciriniz> için ayarları değiştir' 'ile en iyi eşleşen bir şeye tıklayın.
rubybeginner

Bu, erişimi Confirmdeğiştirdikten sonra bile Sistem anahtarlık erişimimi her zaman geri ayarlıyor . : /
Alex Zavatone

Benim için faydalı oldu !!
Nori

1
Yorumunuzu bulmadan önce 2 gündür bununla mücadele ediyorum, teşekkürler !!!
Gilad Novik

17

Çağırmak için deneyin security unlock-keychainve codesignbir tek satırlık komutu olarak. Bu bana yardımcı oldu. Gibi bir şey:

security unlock-keychain -p <password> /Users/<user>/Library/Keychains/login.keychain && codesign --force --verify --verbose --sign "<certificate id>" <app name>

4
Bunu iki satırda yapmakla aynı şey. Sanırım fark şu ki, ilk komut başarısız olursa, ikinciyi çalıştırmayacak.
Trejkaz

1
Benim için aynı değiller. Onları karınca aracılığıyla çağırıyorum sshexecve her seferinde yeni bir ssh oturumu yaratıyor.
ZhekaKozlov

2
Eğer gerçekten isterseniz, tek bir ssh oturumu boyunca birden fazla satır yapabilirsiniz. Yani ... hataların işlenmesi dışında hala aynı.
Trejkaz

15

/ Usr / bin / codign için bir Anahtar Zinciri oluşturmak için Güvenliği kullanma

Sertifikayı içe aktarmak ve programlı olarak kod işareti ile çalışmasını sağlamak, oturum açma veya Sistem anahtar zincirlerini kullanma veya kod işareti tanrısına dua etme meselesi değildir. Yalnızca doğru izinleri ayarlamanız gerekir. Özellikle kod işareti amacıyla yeni bir anahtarlık oluşturmanızı tavsiye ederim.

Bugünlerde almak için codesignbir verim değil errSecInternalComponentsen bölme listesi (ACL) doğru almak gerekir. Adımlardan geçeceğim:

Anahtar Zincirini Oluşturun

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

bu noktada anahtar zincirinin kilidi açılır ancak içinde görünmez Keychain Access.

Yeni Anahtar Zincirini arama listesine ekleyin

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

Yeni Anahtar Zincirini listeye ekleyin. İlk önce orijinal listeyi çıkarmazsanız, list-keychainsartık login.keychainarama listenizde bulunmayacaktır .

Anahtar zincirinin kilidini açın

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

Yukarıdaki Anahtar Zincirini oluşturduysanız bu gereksizdir, ancak Anahtar Zinciri zaten mevcutsa gereklidir.

Varsayılanları Anahtar Zincirinden kaldırın

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

Herhangi bir bağımsız değişken belirtmeyerek bu, otomatik kilitleme zaman aşımını sınırsız olarak ayarlar ve uykuda otomatik kilitlemeyi kaldırır.

İmza sertifikalarınızı .p12'den içe aktarın

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

Sertifikaları ve verirleri içe aktarın codesign-T seçenek aracılığıyla erişim sağlar .

ACL'yi anahtarlıkta ayarlayın

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

Bu, birçok insanın özlediği bir gerekliliktir. Dump-keychain kullanarak macOS'un ne yaptığını görebilirsiniz. Kod imzalama durumunda hangisini gerektirir apple:veapple-tool: . -ssertifikaların imzalanması anlamına gelir.

Gitlab-Runner, Jenkins ve benzerleri

Herhangi bir CI tipi koşucu veya yapı sistemi için çok önemli bir şey, sürecin launchddoğru şekilde başlatıldığından emin olmaktır . Plistinizin içerdiğinden emin olun<SessionCreate> </true> .

Anahtar zincirinin sahibini oluşturma süreciyle doğru şekilde eşleştirmemek ve bir güvenlik oturumunun oluşturulduğundan emin olmak her türlü baş ağrısına neden olacaktır. Teşhis açısından tanıtabilirsinizlist-keychains , çıktının beklentilerinize uygun olup olmadığını ve görebilirsiniz.

Bu launchd.plistman sayfasından:

SessionCreate <boolean>

Bu anahtar, içeriğin ait olduğu varsayılan oturum yerine işin yeni bir güvenlik denetimi oturumunda oluşturulması gerektiğini belirtir. Ayrıntılar için auditon (2) 'ye bakın.

UserName <string>

Bu isteğe bağlı anahtar, kullanıcının işi olarak çalıştıracağını belirtir. Bu anahtar yalnızca ayrıcalıklı sistem etki alanına yüklenen hizmetler için geçerlidir.

GroupName <string>

Bu isteğe bağlı anahtar, işin çalıştırılacağı grubu belirtir. Bu anahtar yalnızca ayrıcalıklı sistem etki alanına yüklenen hizmetler için geçerlidir. KullanıcıAdı ayarlanmışsa ve GrupAdı ayarlanmamışsa, grup kullanıcının birincil grubu olarak ayarlanacaktır.

Sonunda kod işareti

İmza sertifikaları karmasını kullanarak find-identity

security find-identity -p codesigning -v

Bir çerçeve, dylib vb. Kodlayın.

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

Uygulama paketini kodlayın

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

Son notlar - Xcode'un bunu nasıl yaptığına bakarsanız, CODESIGN_ALLOCATEiçinde değil, Xcode'da bulunanı kullanmayı ayarlarlar /usr/bin.

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

Arama yolu, ${PLATFORM_PATH}:${TOOLCHAIN_PATH}:${PATH}PLATFORM yolu verilen hedef SDK için / usr / bin dizinidir ve TOOLCHAIN_PATH, Xcode ana makine araçları için / usr / bin olarak ayarlanır.


3
Dostum bununla ilgili kesinlikle bir makale yazabilirsin, 2 gündür bunu arıyordum. Kaç tane şey ve stackoverflow yazısı okuduğumu bilmiyorum. Çok teşekkürler !
Damien

Anahtar zincirindeki ACL benim için eksik kısımdı. net açıklama için teşekkürler efendim!
Keuha

12

Anahtarlarınızı Sistem anahtarlığına koyun


Ama yine de kullanıcı adı ve şifre soruyor
Durai Amuthan.

Anahtarlar sistem anahtarlığına nasıl yerleştirilir ....... Anahtar zinciri erişiminden kopyalayıp yapıştırın çalışır?
Ashish Karpe

1
@AshishKarpe
Alistra

Sürükle ve bırak hala aynı hatayı mı alıyor: === HEDEF PROJENİN HEDEF PORTAL YAPILANDIRILMALI PatientPortal Hata Ayıklama === Bağımlılıkları kontrol et 'com.abc.xyz360' için profil bulunamadı: Xcode, 'com ile eşleşen bir ön hazırlık profili bulamadı .abc.xyz360 '.
SDK'daki

Makinede yüklü bir ön hazırlık profiliniz olmadığını söylüyor, @AshishKarpe
Alistra

5

Yani işe yarayan komut budur. -AMac'in parola sormasını engellemektir. System.keychain'e içe aktarmak bir GUI gerektirmez.

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


3

Anahtarlığım kilitlendi. Bu gerçeği değiştirmek için ilerlememe direndi ...

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


2

Anahtar zincirinin kilidini açmak yeterli değildir. Ayrıca özel anahtar erişimini "Tüm uygulamaların bu öğeye erişmesine izin ver" olarak ayarlamanız gerekir. Bunu komut satırından yapmak için anahtarın yeniden içe aktarılması gerekir. Yani bir seferde bir şeyler almak için:

Kilitliyse oturum açma anahtar zincirinin kilidini açın. Yine de kilitlenmemelidir, ancak yine de bunu şu şekilde yaparsınız:

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

Herhangi bir nedenle derleme makinenizde oturum açma anahtar zinciri kilitliyse ve bu şifreyi bir komut dosyasında göstermek istemiyorsanız, farklı bir anahtar zinciri kullanmalısınız. Yerinde bir tane oluşturabilir ve bunu önceki ve sonraki komutta kullanabilirsiniz. Yerinde bir tane oluşturmak için:

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

Ardından sertifikalarınızı ve ilişkili özel anahtarları -A parametresini kullanarak oturum açma anahtar zincirine aktarın. Tüm bunlar için sudo yapmanıza gerek olmadığını unutmayın ...

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

-A parametresi, özel anahtarınızın "Tüm uygulamaların bu öğeye erişmesine izin ver" olarak ayarlanmasını sağlar.

Dolayısıyla, tüm bunları kullanarak, bir yayın ipa'sı oluşturmak için gerekli sertifikayı yükleyen bir komut dosyası oluşturabilmeli ve bunu istemeden imzalayabilmelisiniz. .P12 dosyasını deponuzda saklayabilirsiniz, böylece herhangi bir makine manuel kurulum gerektirmeden ipa'nızı oluşturabilir.


2

Anahtar zincirinin kilidini açmanın yanı sıra (başka yanıtlarda belirtildiği gibi), tüm uygulamalardan anahtar zincirindeki Xcode kimlik doğrulama belirtecine erişime izin vermeniz gerekir:

  • "Giriş" anahtar zincirini seçin
  • "Tüm Öğeler" kategorisini seçin
  • "Xcode" anahtar kelimesini arayın
  • Tüm Xcode belirteçleri için "Tüm uygulamaların bu öğeye erişmesine izin ver" seçeneğini seçin
  • Anahtar zincirinin kilidini açma adımını eklemeyi unutmayın (önceki yanıtlardan)

Ekran görüntüsü


1

Anahtarlarınızı Sistem anahtar zincirine aktarın. Bu komutu kullanabilirsiniz:

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

1

Bu yüzden buradaki her cevabı denedim ve bir şeyler pek uyuşmadı. Sonunda, CI hizmetimi yeniden başlattığımda, beklediğimden farklı bir kullanıcı altında çalıştığını anladım. Oturum açma zincirindeki anahtara gerçekten erişimi olan kullanıcıya geçiş yapmak her şeyi düzeltti. Bu yaygın bir sorun olmayabilir, ancak başkalarının başına gelmesi durumunda bu hatanın özel nedenini belgelemek istedim.


Ben tam olarak aynı problem vardı. Cevabınız için teşekkür ederim. :)
Paweł K

0

Benim için işe yarayan hiçbir şey Xcode'u yeniden yüklemek zorunda görünüyor. Jenkins aynı hatayı vermeye devam ediyor. Xcode kurulumunu Çöp Kutusu'na taşır ve yeniden yüklerseniz çok zaman kazanırsınız. En az bir kez komut satırından kod işareti komutunu çalıştırdığınızdan emin olun.

Aynı hatayı alsanız bile 'Anahtar Zinciri Kilidini Aç?' Seçeneğini ayarlamayı deneyin. Jenkins içinde mülk ve /Users/${USER}/Library/Keychains/login.keychain altında login.keychain'inize yol verin

Umarım ondan sonra seninle olur.


0

Benim durumumda bu, 300 saniyenin varsayılan zaman aşımına sahip bir anahtar zincirinden ve 300 saniyeden uzun süren uzun bir xcode derlemesinden kaynaklandı. Benim için çözüm şuydu:

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

geçici anahtar zincirini oluşturduktan hemen sonra.


0

Tüm bu önerileri gözden geçirdim ve hala gymbir Jenkins işinde fastlane kullanırken sorun yaşıyordum . Sertifikayı yükledim ve anahtar zincirinin kilidini açtım ve komut satırında kod işareti komutunu manuel olarak çalıştırdığımda köle üzerinde kod imzalayabildim.

Geçici bir çözüm olarak, Jenkins slave'e SSH yerine JNLP kullanarak bağlanırsa, kod imzalayabilirsiniz.


0

Benim için manuel olarak ikinci bir anahtarlık eklendiğinde ve kilitlendiğinde oluyor. Bazı nedenlerden dolayı codesignkilitli anahtar zincirine erişmeye çalışır ve sertifikalar oturum açma anahtar zincirinde (ve kilidi açılmış) olsa bile başarısız olur. İkincisinin kilidini açmak sorunu çözer. Bana mantıklı gelmiyor.


-1

Yukarıdaki çözümlerden birkaçını denedikten sonra. Sahip olduğum faktörlerden birinin, ION Console'u kullanarak inşa etmeye başlamam olduğunu fark ettim. Yapıyı Terminal uygulamasından yapmaya geri döndüğümde, her şey yolunda gitti.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.