Как получить информацию о сертификате приложения с кодовой подписью - PullRequest
12 голосов
/ 29 ноября 2009

Мне трудно найти ответ на мои вопросы о кодовой подписи.

У нас есть приложение для Mac OS, написанное под Cocoa. Наконец - мы сделали нашу кодировку, но я хотел бы добавить дополнительную проверку безопасности - в самом исполняемом файле.

Моя идея заключается в проверке отпечатка пальца сертификата, с которым подписывается текущий исполняемый файл при запуске. Если он отсутствует или недействителен (проверяется на наличие жестко закодированного хэша в приложении) - мы закрываем его.

До сих пор я не смог получить сертификат, используемый для программной маркировки исполняемого файла и проверки его данных.

Кто-нибудь знает, как это сделать?

Большое спасибо! Мартин К.

Ответы [ 3 ]

10 голосов
/ 10 декабря 2009

Спасибо, друг!

Мне удалось сделать это за 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");
4 голосов
/ 29 ноября 2009

Если вы нацелены на 10.6+, вы можете использовать функции подписи кода в структуре безопасности (документация) , в частности SecCodeCheckValidity. В противном случае исходный код системы подписи кода находится в libsecurity_codesigning .

Поскольку вы используете подпись кода для аутентификации вашего кода, вам также следует подтвердить указанное требование с SecCodeCopyDesignatedRequirement.

0 голосов
/ 24 сентября 2014

В ответе выше вторая строка должна быть:

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

Если вы используете принятый ответ (содержащий [NSURL URLWithString:...]), то url будет равно нулю, если в имени вашего приложения есть пробел или если -executablePath возвращает путь, содержащий определенные символы. Это, конечно, приведет к сбою всей проверки.

(я сделал это вторым ответом, а не комментарием для подсветки синтаксиса.)

...