2009-11-29 2 views
11

문제점을 코드화하는 데 어려움을 겪고 있습니다.코드가 지정된 응용 프로그램 인증서 정보를 얻는 방법

우리는 Mac OS 용 응용 프로그램을 Cocoa로 작성했습니다. 마지막으로 우리는 코드 명을 작성했지만, 실행 파일 자체에 추가적인 보안 검사를 추가하고 싶습니다.

제 아이디어는 현재 실행 파일이 시작될 때 서명 된 인증서의 지문을 확인하는 것입니다. 누락되었거나 유효하지 않은 경우 (응용 프로그램 내의 하드 코드 된 해시에 대해 확인) - 종료합니다.

지금까지 실행 파일을 프로그래밍 방식으로 지정하고 해당 데이터를 확인하는 데 사용되는 인증서를 얻는 방법을 알지 못했습니다.

아무에게도이를 수행하는 방법에 대한 실마리가 있습니까?

많이 고맙습니다. 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

감사합니다. BTW, 두 번째 줄의 NSURL * url = [[NSBundle mainBundle] bundleURL]은 리소스 및 실행 파일을 포함한 전체 번들의 유효성을 검사하는 데 사용될 수 있다고 가정합니다. 맞습니까? – Stream

+0

10.5에서 작동하도록 이것을 얻었습니까? – Richard

+0

아니,하지만 지금은 조금 늦은 것 같아. :) –

0

, 두 번째 줄이 있어야한다 :

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

허용 된 대답 ([NSURL URLWithString:...] 포함)을 사용하는 경우 앱 이름에 공백이있는 경우 또는 -executablePath이 특정 문자가 포함 된 경로를 반환하는 경우 url은 nil이됩니다. 이것은 물론 전체 유효성 검사가 실패하게 만듭니다.

(구문 강조 표시에 대한 설명이 아닌 두 번째 대답입니다.)

관련 문제