2009-11-29 11 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

ありがとうございます! ところで、NSURL * url = [[NSBundle mainBundle] bundleURL]は、リソースと実行可能ファイルを含むバンドル全体の有効性をチェックするために使用することができます。それが正しいか? – Stream

+0

これは10.5で動作するようになりましたか? – Richard

+0

いいえ、しかし、私はそれが少し遅れていると思います:) –

0

、2行目は次のようになります。

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

受け入れられた回答([NSURL URLWithString:...]を含む)を使用する場合、urlは、アプリの名前にスペースがある場合、または-executablePathが特定の文字を含むパスを返す場合はnilになります。これはもちろん、検証全体が失敗する原因になります。

(これは構文ハイライトのコメントではなく、2番目の答えです)

関連する問題