13

コード署名の問題に対する答えを見つけるのに苦労しています。

Cocoa で書かれた Mac OS 用のアプリケーションがあります。最後に、コード署名を行いましたが、実行可能ファイル自体に追加のセキュリティ チェックを追加したいと思います。

私の考えは、現在の実行可能ファイルの起動時に署名されている証明書のフィンガープリントを検証することです。欠落しているか無効である場合 (アプリケーション内のハードコードされたハッシュに対してチェック)、シャットダウンします。

これまでのところ、実行可能ファイルをプログラムでコード署名し、そのデータをチェックするために使用される証明書を取得する方法がわかりませんでした。

誰もこれを行う方法についての手がかりを持っていますか?

どうもありがとうございました!マーティン・K.

4

2 に答える 2

10

ありがとう、友達!

新しい機能を使用して 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");
于 2009-12-10T01:00:36.793 に答える
4

10.6 以降を対象としている場合は、セキュリティ フレームワーク(ドキュメント)のコード署名関数、特に SecCodeCheckValidity を使用できます。それ以外の場合、コード署名システムのソース コードはlibsecurity_codesigningにあります。

コード署名を使用してコードを認証しているため、指定された要件を SecCodeCopyDesignatedRequirement で検証する必要もあります。

于 2009-11-29T20:41:25.320 に答える