我正在尝试检查pkg文件的代码签名状态
我所做的就是以下步骤:
(1)为包生成CFURLRef路径 CFURLRef path = ConvertCFURLFromPath(package);
(2)从上面的路径生成SecStaticCode OSStatus status = SecStaticCodeCreateWithPath(path,kSecCSDefaultFlags,& staticCode);
(3)检查StaticCode是否已签名 status = SecStaticCodeCheckValidity(staticCode,kSecCSDoNotValidateExecutable,NULL);
然而,我总是得到身份" -67062"在上面的验证中,路径和静态代码对我来说是正确的。
另一方面,如果我使用pktutil来检查包文件,我可以看到签名的签名正确显示。
所以我想知道上面的API SecStaticCodeCheckValidity是否可用于验证pkg文件?或者它只适用于app?
我的步骤中缺少什么?
谢谢!
答案 0 :(得分:0)
我怀疑最简单的.pkg文件(内部.xar档案)不是可执行文件。它们既不是Mach-o文件,也不是Code-bundle,也不是任何可加载的执行文件。它们仅仅是"文件"由安装程序应用程序打开。因此,这个API并不合适。
我想我在SecStaticCodeCreate()文档中的某处读到了你可以为非可执行文件创建这样的对象,但我不认为你可以用这种方式验证它们。
答案 1 :(得分:0)
您可以使用Apple内置的xar库提取.pkg文件的证书,然后当您拥有 SecCertificateRef 对象时,可以调用方法 SecStaticCodeCheckValidity < / p>
参见应该做的诀窍示例:
- (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);
//
}
}
}