如何检查pkg文件是否经过代码签名

时间:2015-11-06 03:16:07

标签: c++ code-signing

我正在尝试检查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?

我的步骤中缺少什么?

谢谢!

2 个答案:

答案 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);
              //
        }
  }

}
相关问题