Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在iOS上验证分离的PKCS7签名:验证错误:不支持的证书用途_Ios_Objective C_Openssl - Fatal编程技术网

在iOS上验证分离的PKCS7签名:验证错误:不支持的证书用途

在iOS上验证分离的PKCS7签名:验证错误:不支持的证书用途,ios,objective-c,openssl,Ios,Objective C,Openssl,我正在尝试使用下面的代码验证PKCS7签名是否来自API端点,如下所述 但是,在将其运行到设备后,我收到一个OPENSSL错误: 1010506260:错误:21075075:PKCS7例程:PKCS7\u验证:证书验证错误:pk7\u smime.c:342:验证错误:不支持的证书用途 我哪里出错了-(我知道这个问题非常古老,但我们最近遇到并解决了完全相同的问题 尝试将PKCS7\u NOVERIFY作为PKCS7\u verify()的最后一个参数传递,以跳过签名者证书上的链验证。您(像我们

我正在尝试使用下面的代码验证PKCS7签名是否来自API端点,如下所述

但是,在将其运行到设备后,我收到一个OPENSSL错误:

1010506260:错误:21075075:PKCS7例程:PKCS7\u验证:证书验证错误:pk7\u smime.c:342:验证错误:不支持的证书用途


我哪里出错了-(

我知道这个问题非常古老,但我们最近遇到并解决了完全相同的问题

尝试将
PKCS7\u NOVERIFY
作为
PKCS7\u verify()
的最后一个参数传递,以跳过签名者证书上的链验证。您(像我们一样,执行自定义分离签名的愚蠢操作)可能有一个签名者证书在此特定设置中未通过链验证

    NSURL *appleRootURL = [[NSBundle mainBundle] URLForResource:@"AppleIncRootCertificate" withExtension:@"cer"];

    NSData *appleRootData = [NSData dataWithContentsOfURL:appleRootURL];


    // Create a memory buffer to extract the PKCS #7 container

    BIO *receiptBIO ;
    receiptBIO = BIO_new_mem_buf((void *)[receiptData bytes], (int)[receiptData length]);

    BIO *dataBIO;
    dataBIO = BIO_new_mem_buf((__bridge void *)base64Encoded, (int)[base64Encoded length]);

    BIO *b_out;

    BIO *appleRootBIO;
    appleRootBIO = BIO_new_mem_buf((void *)[appleRootData bytes], (int)[appleRootData length]);


    PKCS7 *receiptPKCS7 = d2i_PKCS7_bio(receiptBIO, NULL);

    X509 *appleRootX509 = d2i_X509_bio(appleRootBIO, NULL);
    X509_STORE *store = X509_STORE_new();
    X509_STORE_add_cert(store, appleRootX509);

    OpenSSL_add_all_digests();
    OpenSSL_add_all_algorithms();

    int result = PKCS7_verify(receiptPKCS7, NULL, store, receiptBIO, b_out, 0);

    if (result != 1) {
        // Validation fails
        NSLog(@"result is %d", result);
    }