2009-11-29 18 views
11

मुझे अपने कोडिंग मुद्दों के उत्तर खोजने में कठिन समय है।कोड किए गए एप्लिकेशन प्रमाणपत्र जानकारी कैसे प्राप्त करें

हमारे पास कोको के तहत लिखे गए मैक ओएस के लिए एक आवेदन है। अंत में - हमने अपना कोडिंग किया था, लेकिन मैं निष्पादन योग्य के भीतर एक अतिरिक्त सुरक्षा जांच जोड़ना चाहता हूं।

मेरा विचार प्रमाण पत्र के फिंगरप्रिंट को सत्यापित करना है जिसके साथ वर्तमान निष्पादन योग्य प्रारंभ होने पर हस्ताक्षरित है। यदि यह गुम या अवैध है (एप्लिकेशन के भीतर हार्डकोडेड हैश के खिलाफ चेक किया गया है) - हमने इसे बंद कर दिया है।

अब तक, मैं निष्पादन योग्य प्रोग्रामिंग को कोडलाइन करने के लिए उपयोग किए गए प्रमाण पत्र को प्राप्त करने और उसके डेटा की जांच करने में सक्षम नहीं हूं।

क्या किसी को यह कैसे करना है इस पर कोई संकेत है?

आपको बहुत ज्यादा धन्यवाद! मार्टिन के।

उत्तर

4

यदि आप 10.6+ को लक्षित कर रहे हैं तो आप सुरक्षा फ्रेमवर्क (documentation) में विशेष रूप से SecCodeCheckValidity में कोड हस्ताक्षर फ़ंक्शंस का उपयोग कर सकते हैं। अन्यथा, कोड हस्ताक्षर प्रणाली का स्रोत कोड libsecurity_codesigning में है।

चूंकि आप अपने कोड को प्रमाणित करने के लिए कोड हस्ताक्षर का उपयोग कर रहे हैं, इसलिए आपको SecCodeCopyDesignatedRequirement के साथ निर्दिष्ट आवश्यकता को भी सत्यापित करना चाहिए।

8

धन्यवाद दोस्त!

मैं नई कार्यक्षमता के साथ 10.6 के लिए ऐसा करने में कामयाब रहा लेकिन समस्या यह है कि मैं कुछ समय बीतने तक कम से कम 10.5 और 10.6 को लक्षित कर रहा हूं।

मुझे कुछ और समय libsecurity_codesigning में फेंकना है ताकि यह 10.5 के लिए भी पूरा किया जा सके।

लेकिन, जो लोग तैयार समाधान के लिए यहाँ देख रहे हैं के लिए, यहाँ क्या मैं के साथ समाप्त हो गया है:

SecStaticCodeRef ref = NULL; 

NSURL * url = [NSURL URLWithString:[[NSBundle mainBundle] executablePath]]; 

OSStatus status; 

// obtain the cert info from the executable 
status = SecStaticCodeCreateWithPath((CFURLRef)url, kSecCSDefaultFlags, &ref); 

if (ref == NULL) exit(EXIT_STATUS_ON_BAD_CODE_SIGNATURE); 
if (status != noErr) exit(EXIT_STATUS_ON_BAD_CODE_SIGNATURE); 

SecRequirementRef req = NULL; 

// this is the public SHA1 fingerprint of the cert match string 
NSString * reqStr = [NSString stringWithFormat:@"%@ %@ = %@%@%@", 
    @"certificate", 
    @"leaf", 
    @"H\"66875745923F01", 
    @"F122B387B0F943", 
    @"X7D981183151\"" 
    ]; 

// create the requirement to check against 
status = SecRequirementCreateWithString((CFStringRef)reqStr, kSecCSDefaultFlags, &req); 

if (status != noErr) exit(EXIT_STATUS_ON_BAD_CODE_SIGNATURE); 
if (req == NULL) exit(EXIT_STATUS_ON_BAD_CODE_SIGNATURE); 

status = SecStaticCodeCheckValidity(ref, kSecCSCheckAllArchitectures, req); 

if (status != noErr) exit(EXIT_STATUS_ON_BAD_CODE_SIGNATURE); 

CFRelease(ref); 
CFRelease(req); 

LogDebug(@"Code signature was checked and it seems OK"); 
+0

साझा करने के लिए धन्यवाद! बीटीडब्ल्यू, मुझे लगता है कि दूसरी पंक्ति में NSURL * url = [[NSBundle mainBundle] bundleURL] संसाधनों और निष्पादन योग्य समेत पूरे बंडल की वैधता की जांच के लिए उपयोग किया जा सकता है। क्या यह सही है? – Stream

+0

क्या आपने कभी इसे 10.5 पर काम करने के लिए प्राप्त किया है? – Richard

+0

नहीं, लेकिन मुझे लगता है कि अब इसके लिए थोड़ा देर हो चुकी है :) –

0

जवाब ऊपर में, दूसरी पंक्ति होना चाहिए:

NSURL *url = [NSURL fileURLWithPath:[[NSBundle mainBundle] executablePath]]; 

यदि आप स्वीकृत उत्तर ([NSURL URLWithString:...] युक्त) का उपयोग करते हैं, तो url शून्य होगा यदि आपके ऐप के नाम में कोई स्थान है या -executablePath कुछ वर्ण वाले पथ को लौटाता है। यह निश्चित रूप से पूरे सत्यापन विफल होने का कारण बन जाएगा।

(मैंने वाक्यविन्यास-हाइलाइटिंग के लिए टिप्पणी के बजाए यह दूसरा जवाब दिया है।)

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