2014-11-09 10 views
6

लक्ष्य: अपने स्वयं के पैकेज, और मेरे अपने कर्नेल एक्सटेंशन पर हस्ताक्षर करने के लिए। संदर्भ में "मेरा खुद" का अर्थ है "मैंने लिखा है, या मैंने कहीं और उठाया है, अपने स्रोतों से खुद को पुनः स्थापित किया है, और मेरी मशीन पर स्थापित करना चाहता हूं।Mavericks/Yosemite में kext पर हस्ताक्षर नहीं कर सकता?

समस्या: मैवरिक्स Code Signing Failure: code signature is invalid के साथ मेरे हस्ताक्षर को स्वीकार नहीं करता है (लेकिन भार kext), योसामाइट इसे भी लोड नहीं करेगा।

मेरे पास अपना स्वयं का सीए और कोड-हस्ताक्षर करने वाला कॉर्ट है। मैं सफलतापूर्वक कोड पर हस्ताक्षर करने और नीतियों को स्थापित करने में सक्षम हूं जो दिए गए कॉर्ट द्वारा हस्ताक्षरित कोड की अनुमति देंगे स्थापित करने और निष्पादित करने के लिए - codesign और spctl दोनों जैसा कि आप नीचे दिए गए आउटपुट में देखते हैं। हालांकि, यह kext (कर्नेल एक्सटेंशन) पर लागू नहीं होता है - kextutil जोर देता है कि हस्ताक्षर अमान्य है। यहां आउटपुट है I हो रही है:

$ codesign --verify -vvvv /opt/local/Library/Filesystems/osxfusefs.fs/Support/osxfusefs.kext 
/opt/local/Library/Filesystems/osxfusefs.fs/Support/osxfusefs.kext: valid on disk 
/opt/local/Library/Filesystems/osxfusefs.fs/Support/osxfusefs.kext: satisfies its Designated Requirement 

$ spctl -a -vvv -t exec /opt/local/Library/Filesystems/osxfusefs.fs/Support/osxfusefs.kext 
/opt/local/Library/Filesystems/osxfusefs.fs/Support/osxfusefs.kext: accepted 
source=XXXXXCode 
origin=XXXXXCoder 
$ spctl -a -vvv -t install /opt/local/Library/Filesystems/osxfusefs.fs/Support/osxfusefs.kext 
/opt/local/Library/Filesystems/osxfusefs.fs/Support/osxfusefs.kext: accepted 
source=XXXXXInstall 
origin=XXXXXCoder 

$ kextutil -tn /opt/local/Library/Filesystems/osxfusefs.fs/Support/osxfusefs.kext 
Diagnostics for /opt/local/Library/Filesystems/osxfusefs.fs/Support/osxfusefs.kext: 
Code Signing Failure: code signature is invalid 
/opt/local/Library/Filesystems/osxfusefs.fs/Support/osxfusefs.kext appears to be loadable (including linkage for on-disk libraries). 

मैवरिक्स पर यह केक्स्ट एक चेतावनी संदेश के साथ लोड होता है, जो योसाइट पर नहीं होगा।

मैंने here और Apple CA CPS Developer ID में देखा कि प्रमाण में निम्नलिखित एक्सटेंशन होना चाहिए: (1.2.840.113635.100.6.1.18) इसे kext-sign प्रमाणपत्र के रूप में नामित करने के लिए। मेरे पास यह नहीं है। मुझे संदेह है कि यह मेरी समस्या का कारण है, लेकिन यह नहीं पता कि इसे कैसे हल किया जाए। spctl में एक प्रकार का विकल्प प्रतीत नहीं होता है जो किसी दिए गए प्रमाण को एक केक्स्ट-साइनिंग के रूप में निर्दिष्ट नीति बनाने के लिए करता है।

मैं इस एक्सटेंशन को कैसे जोड़ूं (अधिमानतः कीचेन सर्टिफिकेट असिस्ट के भीतर, हालांकि ओपनएसएसएल-आधारित समाधान भी ठीक होगा), 100 डॉलर के ऐप्पल वार्षिक "उपयोग शुल्क" का भुगतान करने से कम?

+1

अपने स्वयं के कर्नेल को संकलित करने का छोटा जो आपके प्रमाणपत्र के साथ हस्ताक्षरित केक्सट स्वीकार करेगा, आपको ऐप्पल से एक प्राप्त करने की आवश्यकता होगी। प्लस साइड पर, यदि आप चाहते हैं कि ऐप, इंस्टॉलर और केक्सट्स पर हस्ताक्षर करने के लिए प्रमाण पत्र हैं, तो आपके $ 100 की आवश्यकता नहीं है - डेवलपर आईडी प्रमाणपत्र 5 साल के बाद समाप्त हो जाते हैं, न कि 1. – pmdj

+0

धन्यवाद, लेकिन मुझे यकीन नहीं है कि मैं समझता हूं। [डेवलपर सदस्य केंद्र] (https://developer.apple.com/membercenter/index.action) किसी को प्रमाण पत्र का अनुरोध करने की अनुमति नहीं देता है जब तक कि कोई विशिष्ट डेवलपर प्रोग्राम में नामांकन न करे। [मैक डेवलपर प्रोग्राम] (https://developer.apple.com/programs/mac/) $ 99/वर्ष में सूचीबद्ध है। मेरे लिए यह जांचने का कोई तरीका नहीं है कि वे डेवलपर आईडी प्रमाण कब तक जारी करेंगे। क्या आप कह रहे हैं कि एक वर्ष बाद एक व्यक्ति अपनी सदस्यता रद्द (या नवीनीकृत नहीं कर पाएगा), लेकिन उसका डेवलपर आईडी प्रमाण 4 और वर्षों तक समाप्त नहीं होगा? – Mouse

+1

हां, नवीनीकरण स्वचालित नहीं है। मेरे अनुभव में डेवलपर आईडी प्रमाण पत्र जारी करने के 5 साल बाद समाप्त हो जाता है। तो मुझे लगता है कि अगर आप समाप्ति से कुछ ही समय पहले एक नए प्रमाणपत्र का अनुरोध करते हैं, तो आपको इसके लगभग 6 साल मिलेंगे। मुझे संदेह है कि आपका प्रमाण पत्र समाप्त होने के बाद किसी भी तरह से हस्ताक्षरित सॉफ़्टवेयर गेटकीपर सत्यापन विफल हो जाएगा, इसलिए हो सकता है कि वेब पर सॉफ़्टवेयर प्रकाशित करना एक अच्छा विचार न हो, जिसमें गेटकीपर इसे ब्लॉक करने से कुछ ही महीने पहले हो। आपको याद है, सॉफ्टवेयर में 5 साल लंबा है। उस समय तक, मैक एआरएम सीपीयू पर चल सकता है, और तीसरे पक्ष केएक्सटी की अनुमति नहीं है। ;-) – pmdj

उत्तर

2

केवल ऐप्पल इस ओआईडी के साथ प्रमाणपत्र उत्पन्न कर सकता है और इसे कर्नेल के लिए मान्य माना जाता है।

अधिक विस्तृत स्पष्टीकरण के लिए tonymacx86.com पर What's New in Kext Development देखें। यहां प्रासंगिक भाग हैं।

OID 1.2.840.113635 एप्पल कंपनी उपसर्ग है, और OID के बाकी बताता है कि विशिष्ट संपत्ति गिरी विस्तार को लोड करने की अनुमति के लिए प्रमाण पत्र "पत्ता" (हस्ताक्षर करने के प्रमाण पत्र) में मौजूद होना चाहिए। यह का अर्थ है कि एक मान्य, हस्ताक्षरित कर्नेल एक्सटेंशन केवल $ 9935/वर्ष डेवलपर प्रोग्राम के हिस्से के रूप में ऐप्पल द्वारा प्रदान किए गए प्रमाण पत्र के साथ बनाया जा सकता है, और इसके अतिरिक्त इच्छुक पार्टियों को विशेष फ़ॉर्म को भरना होगा, यह बताते हुए कि उन्हें प्रमाणपत्र की आवश्यकता क्यों है ; kext प्रमाणपत्र केवल अनुरोध और अनुमोदन पर प्रदान किए जाते हैं।

हालांकि एक विशिष्ट ओआईडी के साथ प्रमाणपत्र उत्पन्न करना संभव है और इसे अपने स्वयं के सीए के साथ साइन करना संभव है, ओएस एक्स केवल कर्नेल एक्सटेंशन के लिए ऐप्पल के सीए को पहचान लेगा। Gatebreak's documentation संक्षेप में इसका उल्लेख करता है।

परिवर्तन कोड की आवश्यकताओं kextutil, kextd में एम्बेडेड, और kextcache ताकि वे की तुलना में एप्पल के

+0

क्या इसका मतलब यह है कि मैं एक एक्सटेंशन के साथ प्रमाणपत्र नहीं बना सकता जिसका ओआईडी 1.2.840.113635 से शुरू होता है, और उस प्रमाणपत्र को अपने स्वयं के सीए के साथ हस्ताक्षर करता है जिसे मेरे कीचेन में विश्वसनीय के रूप में चिह्नित किया गया है? यह ऐप्पल सीए द्वारा हस्ताक्षरित नहीं होगा, लेकिन जब तक वे "भरोसेमंद" के रूप में चिह्नित नहीं हैं, तब तक सभी भरोसेमंद सीए बराबर नहीं हैं? मुझे एहसास है कि इस तरह का एक प्रमाणपत्र मुझे _distribute_ को अनुमति देने की अनुमति नहीं देगा, लेकिन यह आवश्यक नहीं है। – Mouse

+0

@Mouse मुझे विश्वास है कि ओएसएक्स केवल कर्नेल एक्सटेंशन के लिए ऐप्पल के सीए को पहचान लेगा। [गेटब्रेक] (http://www.tonymacx86.com/mavericks-desktop-support/112306-gatebreak-signed-kexts-everyone.html) संक्षेप में इस बारे में बात करता है। हालांकि मुझे इसके बारे में गलत साबित होना अच्छा लगेगा। –

+0

मुझे संदेह है कि केवल सेब एक विशिष्ट ओआईडी के साथ कर्ट उत्पन्न कर सकता है। मुझे लगता है कि आपको केवल ओआईडी जोड़ने के लिए ओपनएसएसएल हैक करना है जो आप चाहते हैं और openssl खुशी से उस ओआईडी के साथ प्रमाण पत्र उत्पन्न करेगा। मुझे यह पता है क्योंकि मैंने आरपीकेआई पर काम किया था और प्रमाण पत्रों में बीजीपी और आईपी संसाधनों के लिए एक नया ओआईडी था ... – Lmwangi

1

किसी अन्य रूट प्रमाणपत्र जो कुछ OIDs कि वे चाहते हैं के साथ प्रमाणपत्र उत्पन्न कर सकते हैं अनुमति देते हैं। वास्तव में, ओआईडी हर समय जोड़ा जा रहा है। आप IANA पर जा सकते हैं, ओआईडी का अनुरोध कर सकते हैं और gnutls/openssl स्रोत कोड को अपने नए फंक्ड फ़ील्ड के लिए generating certificates शुरू करने के लिए हैक करें।कोड हस्ताक्षर के लिए प्रासंगिक ओआईडी प्रमाणपत्र में होने की आवश्यकता है documented। इसे व्यक्तिगत सीए और मध्यवर्ती प्रमाणपत्रों की पीढ़ी को संभालना चाहिए जो किक्सट्स पर हस्ताक्षर कर सकते हैं। ओपनएसएसएल के खिलाफ patches पर एक नज़र डालें जो इसे RPKI certificaes

अगला कार्य यह पता लगा रहा है कि ऐप्पल आपके सीए को एंकर प्रमाणपत्र के रूप में कैसे पहचान पाएगा। मेरा अनुमान है कि आपको KeyChain एक्सेस का उपयोग करके जेनरेट किए गए सीए प्रमाण को आयात करने की आवश्यकता होगी। अगर सेब किसी भी तरह से सीएएस को हार्डकोड करता है (संभावना नहीं है और बेवकूफ होगा), तो हम बर्बाद हो जाएंगे। अन्यथा, वे कुछ फाइल सिस्टम संसाधन से प्रमाण पत्र एंकर लोड करना होगा। पता लगाने के लिए dtruss का प्रयोग करें। मेरे प्रारंभिक जांच बिंदु/सिस्टम/लाइब्रेरी/कीचेन्स/

4

ऐप्पल से केक्सटी हस्ताक्षर प्रमाणपत्र का अनुरोध करने के लिए, आपको this form का उपयोग करने की आवश्यकता है।

+1

इस उत्तर के साथ एकमात्र समस्या यह है कि इसे एक मैक डेवलपर के रूप में $ 99 के वार्षिक शुल्क का भुगतान करने की आवश्यकता होती है। और यह वही है जो मैं टालना चाहता हूं, क्योंकि मेरे मूल प्रश्न में कहा गया है। – Mouse

+1

निश्चित रूप से, लेकिन इस फ़ॉर्म की तुलना में यह प्रश्न ढूंढना बहुत आसान है: मुझे यह फ़ॉर्म से कुछ समय पहले मिला। –

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