如何获取已签署的应用程序证书信息

Mar*_*hev 12 security macos cocoa certificate codesign

我很难找到代码签名问题的答案.

我们有一个在Cocoa下编写的Mac OS应用程序.最后 - 我们做了代码签名,但我想在可执行文件中添加额外的安全检查.

我的想法是验证当前可执行文件启动时签名的证书指纹.如果它丢失或无效(根据应用程序中的硬编码哈希进行检查) - 我们将其关闭.

到目前为止,我还没有能够获得用于以编程方式对可执行文件进行编码并检查其数据的证书.

有没有人知道如何做到这一点?

非常感谢你!马丁K.

Mar*_*hev 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");
Run Code Online (Sandbox Code Playgroud)


vt.*_*vt. 4

如果您的目标是 10.6+,您可以使用安全框架(文档)中的代码签名功能,特别是 SecCodeCheckValidity。否则,代码签名系统的源代码位于libsecurity_codesigning中。

由于您使用代码签名来验证代码,因此您还应该使用 SecCodeCopyDesignatedRequirement 验证指定的要求。