как проверить, если файл pkg имеет кодовую подпись

я пытаюсь проверить статус подписи кода для файла pkg

что я сделал, это ниже шагов:

(1) генерировать путь CFURLRef для пакета
CFURLRef path = ConvertCFURLFromPath (package);

(2) генерировать SecStaticCode из вышеуказанного пути
Состояние OSStatus = SecStaticCodeCreateWithPath (путь, kSecCSDefaultFlags, &staticCode);

(3) Проверьте, подписан статический код или нет
status = SecStaticCodeCheckValidity (staticCode, kSecCSDoNotValidateExecutable, NULL);

Тем не менее, я всегда получал статус «-67062» в приведенной выше проверке, в то время как путь и статический код выглядят правильно для меня.

С другой стороны, если я использую pktutil для проверки файла пакета, я вижу, что подписанная подпись отображается правильно.

Так что мне интересно, если выше API SecStaticCodeCheckValidity может быть использован для проверки файла pkg? или это работает только для приложения?

чего не хватает в моих шагах?

Спасибо!

-1

Решение

Я подозреваю, что самые простые файлы .pkg (внутренне .xar архивы) НЕ являются исполняемыми файлами. Они не являются ни файлами Mach-o, ни Code-bundles, ни чем-либо загружаемым для выполнения. Это просто «документы», открытые приложением установщика. Следовательно, этот API не подходит.

Я думаю, что где-то прочитал в документации SecStaticCodeCreate (), что вы МОЖЕТЕ создать такой объект для неисполняемых файлов, но я не думаю, что вы могли бы проверить их таким образом.

0

Другие решения

Вы можете извлечь сертификат из файла .pkg, используя встроенную в Apple библиотеку xar, а затем, когда у вас есть SecCertificateRef объект, вы можете вызвать метод SecStaticCodeCheckValidity

Посмотрите пример, который должен добиться цели:

- (void)verifySigForXar:(NSString *)path
{
OSStatus err = noErr;
xar_t pkg = NULL;
xar_signature_t sig = NULL;
int32_t ncerts = 0;
const uint8_t *data = NULL;
uint32_t len = 0;
SecCertificateRef tmp = NULL;
int cur = 0;
CFErrorRef cfError = NULL;

pkg = xar_open([path UTF8String], READ);

if (pkg == NULL)
{
os_log_error("error opening Xar in path :%{public}s ", [path UTF8String]);
return;
}

sig = xar_signature_first(pkg);

if (sig == NULL) {
os_log_error(g_logger, "error getting xar signature in path :%{public}s ", [path UTF8String]);
return;
}

ncerts = xar_signature_get_x509certificate_count(sig);
NSMutableArray *certs = [[NSMutableArray alloc] init];

//populate array of certs
for (int32_t i = 0; i < ncerts; i++)
{
if (xar_signature_get_x509certificate_data(sig, i, &data, &len) == -1)
{
os_log_error("Unable to extract certificate data. xar signature in path :%{public}s ", [path UTF8String]);
return;
}

const CSSM_DATA crt = { (CSSM_SIZE) len, (uint8_t *) data };
err = SecCertificateCreateFromData(&crt, CSSM_CERT_X_509v3, CSSM_CERT_ENCODING_DER, &tmp);
[certs addObject:(id)CFBridgingRelease(tmp)];
}

//iterate the array of
for (id certObj in certs)
{
if (CFGetTypeID((__bridge CFTypeRef)object) == SecCertificateGetTypeID())
{
SecCertificateRef cert = (__bridge SecCertificateRef)certObj;
err = SecStaticCodeCheckValidityWithErrors(codeRef, kSecCSDoNotValidateExecutable, NULL, &cfError);
//
}
}

}
0