2009-11-29 5 views
11

Es fällt mir schwer, eine Antwort auf meine Codesignierungsprobleme zu finden.So erhalten Sie Informationen zu den Zertifikatskoordinated-Zertifikaten

Wir haben eine Anwendung für Mac OS unter Cocoa geschrieben. Schließlich - wir haben unsere Codesignierung vorgenommen, aber ich möchte eine zusätzliche Sicherheitsüberprüfung hinzufügen - innerhalb der ausführbaren Datei selbst.

Meine Idee ist, den Fingerabdruck des Zertifikats zu validieren, mit dem die aktuelle ausführbare Datei signiert ist, wenn sie gestartet wird. Wenn es fehlt oder ungültig ist (gegen einen hartcodierten Hash innerhalb der Anwendung geprüft) - wir schließen es ab.

Bisher war ich nicht in der Lage, das Zertifikat zu erhalten, das verwendet wird, um die ausführbare Datei programmatisch zu codieren und ihre Daten zu überprüfen.

Hat jemand eine Ahnung wie man das macht?

Vielen Dank! Martin K.

Antwort

4

Wenn Sie auf 10.6+ abzielen, können Sie die Code-Signierungsfunktionen im Sicherheitsframework (documentation), insbesondere SecCodeCheckValidity, verwenden. Andernfalls befindet sich der Quellcode für das Codesigniersystem in libsecurity_codesigning.

Da Sie die Codesignatur zur Authentifizierung Ihres Codes verwenden, sollten Sie auch die angegebene Anforderung mit SecCodeCopyDesignatedRequirement überprüfen.

8

Danke Freund!

Ich schaffte es für 10.6 mit der neuen Funktionalität, aber das Problem ist ich 10.5 und 10.6, zumindest bis einige Zeit vergeht.

Ich muss bald etwas mehr Zeit in libsecurity_codesigning werfen, damit dies auch für 10.5 erledigt werden kann.

Aber für Leute, die hier für fertige Lösungen suchen, hier ist das, was ich am Ende mit:

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

Danke für die Freigabe! BTW, ich nehme an, dass NSURL * url = [[NSBundle mainBundle] bundleURL] in der zweiten Zeile verwendet werden kann, um eine Gültigkeit des gesamten Bundles einschließlich Ressourcen und ausführbare Dateien zu überprüfen. Ist es richtig? – Stream

+0

hast du jemals das auf 10.5 arbeiten? – Richard

+0

Nein, aber ich denke, es ist ein bisschen spät dafür :) –

0

In der Antwort oben, sollte die zweite Zeile sein:

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

Wenn Sie die akzeptierte Antwort (mit [NSURL URLWithString:...]) verwenden, ist url gleich Null, wenn der Name Ihrer App ein Leerzeichen enthält oder wenn -executablePath einen Pfad zurückgibt, der bestimmte Zeichen enthält. Dies führt natürlich dazu, dass die gesamte Validierung fehlschlägt.

(Ich machte dies eine zweite Antwort, anstatt einen Kommentar für die Syntax-Hervorhebung.)

Verwandte Themen