2009-11-29 134 views
11

我很難找到解決我的代碼簽名問題的答案。如何獲得簽名的應用程序證書信息

我們有一個在Cocoa下編寫的Mac OS應用程序。最後 - 我們做了我們的代碼簽名,但我想在可執行文件本身中添加額外的安全檢查。

我的想法是驗證當前可執行文件啓動時簽發的證書的指紋。如果它丟失或無效(在應用程序中針對硬編碼哈希進行檢查) - 我們將其關閉。

到目前爲止,我還沒有能夠以編程方式獲取用於編碼可執行文件的證書並檢查其數據。

有沒有人有關於如何做到這一點的線索?

非常感謝你! Martin K.

回答

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]可以用來檢查整個bundle的有效性,包括Resources和Executables。這是對的嗎? – Stream 2010-03-12 21:25:53

+0

你有沒有得到這個工作在10.5? – Richard 2011-02-03 17:09:52

+0

不,但我認爲現在有點遲了:) – 2012-03-13 16:09:16

0

在上面的答案,第二行應該是:

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

如果您使用接受的答案(包含[NSURL URLWithString:...]),那麼url將爲零,如果您的應用程序的名稱中有空格或-executablePath返回包含某些字符的路徑。這當然會導致整個驗證失敗。

(我對此做了第二個回答,而不是語法突出顯示的評論。)

相關問題