2017-01-26 9 views
6

सबसे पहले, एक छोटी सी पृष्ठभूमि: मैं जांच कर रहा हूं कि मेरी कंपनी का मैकोज़/एक्स एप्लिकेशन क्यों है (जो सभी खातों द्वारा सही ढंग से हस्ताक्षरित प्रतीत होता है; यह मैकोज़/एक्स 10.11.x और 10.12.x के तहत ठीक चलता है; गेटकीपर इसके साथ ठीक है सभी मैकोज़ संस्करणों पर; "spctl --assess", और "codeign -vvvv" सभी कहते हैं कि यह सभी ओएस संस्करणों पर इसकी आवश्यकता को पूरा करता है) फिर भी जब मैं कोशिश करता हूं तो 10.10.x के तहत ओएस/एक्स 10.10.x के तहत लॉन्च नहीं होगा। यह शुरू करने के लिए, मैं एक क्रैश रिपोर्ट जहां dyld शिकायत प्राप्त पुस्तकालयों में से कुछ सही ढंग से प्रवेश नहीं किया है कि:ऐप्पल की कोडलाइन उपयोगिता कैसे तय करती है कि एसएचए एल्गोरिदम किसके साथ साझा लाइब्रेरी पर हस्ताक्षर करने के लिए है?

Dyld Error Message: 
    Library not loaded:  @executable_path/../Frameworks/libcrypto.1.0.0.dylib 
    Referenced from: /Applications/MyApplication v123/MyApplication.app/Contents/MacOS/MyApplication 
    Reason: no suitable image found. Did find: 
    /Applications/MyApplication v123/MyApplication.app/Contents/MacOS/../Frameworks/libcrypto.1.0.0.dylib: code signature invalid for '/Applications/MyApplication v123/MyApplication.app/Contents/MacOS/../Frameworks/libcrypto.1.0.0.dylib' 

है कि समस्या की जांच करते समय, मैंने देखा है .app/सामग्री/फ्रेमवर्क में पुस्तकालयों कि - जो सभी हमारे ओएस/एक्स बिल्ड मशीन चलने पर बिल्ड/पैकेज स्क्रिप्ट के माध्यम से, सटीक कोड कोड कमांड का उपयोग करके हस्ताक्षरित हैं ओएस/एक्स 10.12 - उनके लिए गणना की गई विभिन्न प्रकार के हैंश हैं।

यही है, अगर मैं गैर क्यूटी .dylib फ़ाइलों में से एक कैसे हस्ताक्षर किए गए थे को देखो, मैं देख रहा हूँ यह केवल एक SHA256 हैश उस में दर्ज किया है:

sierrabuild-polaris:MyApp v123 autobuild$ codesign -vvvd ./MyApp.app/Contents/Frameworks/libsndfile.1.dylib 
Executable=/Applications/MyApp v123/MyApp.app/Contents/Frameworks/libsndfile.1.dylib 
Identifier=libsndfile.1 
Format=Mach-O thin (x86_64) 
CodeDirectory v=20200 size=4140 flags=0x0(none) hashes=125+2 location=embedded 
Hash type=sha256 size=32 
CandidateCDHash sha256=b4256e9bf0fac567bb8ac86f56964c066b93d069 
Hash choices=sha256  <----------------------------- ONLY 256!? 
CDHash=b4256e9bf0fac567bb8ac86f56964c066b93d069 
Signature size=8846 
Authority=Developer ID Application: MyCompany 
Authority=Developer ID Certification Authority 
Authority=Apple Root CA 
Timestamp=Jan 24, 2017, 1:39:58 AM 
Info.plist=not bound 
TeamIdentifier=5XD27G7646 
Sealed Resources=none 
Internal requirements count=1 size=172 

... लेकिन अगर मैं देखो बंदी क्यूटी चौखटे के किसी भी कैसे हस्ताक्षर किए गए थे पर, OTOH, मैं देख रहा हूँ यह दोनों SHA1 और SHA256 हैश शामिल किया गया है:

sierrabuild-polaris:MyApp v123 autobuild$ codesign -vvvd ./MyApp.app/Contents/Frameworks/QtCore.framework/Versions/5/QtCore 
Executable=/Applications/MyApp v123/MyApp.app/Contents/Frameworks/QtCore.framework/Versions/5/QtCore 
Identifier=org.qt-project.QtCore 
Format=bundle with Mach-O thin (x86_64) 
CodeDirectory v=20200 size=42549 flags=0x0(none) hashes=1324+3 location=embedded 
Hash type=sha256 size=32 
CandidateCDHash sha1=09b5854f83091228f1baaad1455e7a30d6500c95 
CandidateCDHash sha256=6dfdc74da06618e1b406a6e5fd0794fe43701def 
Hash choices=sha1,sha256 <------------- BOTH sha1 and sha256, yay! 
CDHash=6dfdc74da06618e1b406a6e5fd0794fe43701def 
Signature size=8896 
Authority=Developer ID Application: MyCompany 
Authority=Developer ID Certification Authority 
Authority=Apple Root CA 
Timestamp=Jan 24, 2017, 1:39:57 AM 
Info.plist entries=8 
TeamIdentifier=5XD27G7646 
Sealed Resources version=2 rules=13 files=1 
Internal requirements count=1 size=184 

यह देखते हुए कि dyld की त्रुटि जब Yosemite के तहत मेरे अनुप्रयोग चलाने के लिए कोशिश कर रहा हमेशा पुस्तकालयों में से एक को संदर्भित करता है कि केवल sha256 हैश है, मेरा कामकाजी सिद्धांत यह है कि ओएस/एक्स 10.10.x का रंग प्राचीन है टी टोपी यह SHA-256 हैश के बारे में नहीं जानता है, और यही कारण है कि यह एक कैप्चर साझा लाइब्रेरी को लोड करने का प्रयास करता है जो केवल SHA-256 हैश के साथ हस्ताक्षरित है।

मेरा प्रश्न (मान लीजिए कि मैं यहां गलत पेड़ को पूरी तरह से भौंकने वाला नहीं हूं) यह है: कोडविन कैसे तय करता है कि शॉ 256 हैश के साथ फ़ाइल को मुद्रित करने के लिए, एक श्या 1 और sha256 हैश जोड़कर बनाम कैसे बनाते हैं? और मैं कोडशिन को हमेशा दोनों हैंश को शामिल करने के लिए कैसे मजबूर कर सकता हूं, ताकि मेरा ऐप फिर से 10.10.x के तहत लॉन्च हो सके (जैसे कि हमने अपनी बिल्ड मशीन को ओएसएक्स/सिएरा में अपग्रेड करने से पहले उपयोग किया था)?

रिकॉर्ड के लिए, यहां मैं अपनी बिल्ड स्क्रिप्ट में कोडलाइन का आविष्कार कर रहा हूं - आमंत्रण तर्क सभी पुस्तकालयों के लिए बिल्कुल समान हैं (दोनों क्यूटी फ्रेमवर्क लाइब्रेरी जो शा 1, sha256 और गैर-क्यूटी के साथ समाप्त होते हैं पुस्तकालयों कि केवल SHA256 अंत), उदाहरण के लिए:

codesign -f -v -s "Developer ID Application: MyCompanyName" "./Frameworks/libcrypto.1.0.0.dylib" 
codesign -f -v -s "Developer ID Application: MyCompanyName" "./Frameworks/QtCore.framework/Versions/5/QtCore" 

उत्तर

7

आसपास googling के एक बहुत बाद, this answer और this answer मुझे समाधान का नेतृत्व किया।

समस्या यह थी कि मेरे ऐप के अंदर शामिल तीसरे पक्ष के साझा पुस्तकालयों में से कई को केवल अपनी डिफ़ॉल्ट बिल्ड सेटिंग्स (जैसे "./configure; make") का उपयोग करके संकलित किया जा रहा था, और चूंकि उन्हें ओएस/एक्स के तहत संकलित किया जा रहा था 10.12, स्वाभाविक रूप से उन्हें दिमाग में केवल 10.12-संगतता के साथ संकलित किया गया था।

export LDFLAGS="-mmacosx-version-min=10.9" 
export CFLAGS="-mmacosx-version-min=10.9" 
export CXXFLAGS="-mmacosx-version-min=10.9" 
:

ताकि उन्हें इस तरह से कि जिसके परिणामस्वरूप .dylib फ़ाइलों के रूप में अच्छी तरह से पहले ओएस/एक्स संस्करण के लिए उपयुक्त होगा में संकलित करने के लिए पाने के लिए, मैं अपने निर्माण स्क्रिप्ट के शीर्ष करने के लिए इन लाइनों जोड़ा

... और यह lib पुस्तकालय को छोड़कर सभी पुस्तकालयों (libssh2, libsndfile, libogg, libflac, libvorbis, आदि) के लिए चाल है - उस के लिए मुझे कॉन्फ़िगर फ़ाइल को हाथ-संशोधित करना था और - इस तरह के कंपाइलर के कमांड लाइन तर्कों में mmacosx-version-min तर्क।

उस परिवर्तन के साथ, कोडिन अब सभी को SHA-1 और SHA-256 हैश लागू करता है।dylib फ़ाइलें, और परिणामी .app अब 10.10.x के तहत अपेक्षित के रूप में चलाता है।

+0

हैलो मैं वर्तमान में कर रहा हूँ एक ही मुद्दे का सामना करना पड़ रहा है, और मेरे लिए कुछ स्पष्ट नहीं है क्या आपको अपनी खुद की ऐप बनाने के लिए इस्तेमाल की गई अपनी स्क्रिप्ट के शीर्ष पर अपनी निर्यात लाइन जोड़नी है, या आपने तीसरे पक्ष के पुनर्निर्माण से पहले, उन निर्यात लाइनों को कमांड लाइन में जोड़ा था libsndfile की तरह libs? – nmud

+0

मुझे एक शीर्ष-स्तरीय बिल्ड स्क्रिप्ट मिली है जो लाइब्रेरी बनाने वाली निम्न-स्तरीय बिल्ड-स्क्रिप्ट्स को कॉल करती है, और फिर अंतिम निचली-स्तर वाली बिल्ड-स्क्रिप्ट जो मेरे ऐप को बनाता है जो उन पुस्तकालयों का उपयोग करती है। मैंने उपरोक्त निर्यात-आदेशों को इस शीर्ष-स्तरीय बिल्ड-स्क्रिप्ट के शीर्ष पर रखा है ताकि एलडीएफएलजीएस, सीएफएलएजीएस, और सीओएफएफएलजीएस पर्यावरण चर सभी बिल्ड स्क्रिप्ट्स (पुस्तकालयों और ऐप) के लिए पर्यावरण में मौजूद हों। –

+0

ठीक है। मेरे मामले में, मैं एक क्यूटी ऐप बना रहा हूं, इसलिए मुझे उन निर्यातित झंडे के साथ तीसरे पक्ष के libs को पुनर्निर्माण करना होगा, और फिर libs ठीक होने के बाद अपने स्वयं के ऐप का पुनर्निर्माण करना होगा। बात यह है कि मैंने ब्रूड के साथ libsndfile की तरह तीसरे पक्ष की libs बनाई है, इसलिए मुझे नहीं पता कि मैं कुछ ऐसा कर सकता हूं ./configure CFLAGS = "..." या – nmud

1

जेरेमी फ्रिसनर का उत्तर 1 मेरे लिए काम किया। ओपनएसएसएल को संकलित करने पर सिर्फ एक पक्ष नहीं है। कम से कम 1.0.2h के लिए फ़ाइल कॉन्फ़िगर करने की कोई आवश्यकता नहीं थी। ठीक काम किया निम्नलिखित

कॉन्फ़िगर darwin64-x86_64-सीसी साझा --openssldir = $ घर/cmake_builds/openssl-1.0.2h.bin -mmacosx-संस्करण मिनट = 10.10

+0

यह अपने स्वयं के अलग उत्तर के बजाय मेरे उत्तर पर एक टिप्पणी के रूप में बेहतर रखा जा सकता है। –

संबंधित मुद्दे

 संबंधित मुद्दे