在iOS上验证分离的PKCS7签名:验证错误:不支持的证书用途
我正在尝试使用下面的代码验证PKCS7签名是否来自API端点,如下所述 但是,在将其运行到设备后,我收到一个OPENSSL错误: 1010506260:错误:21075075:PKCS7例程:PKCS7\u验证:证书验证错误:pk7\u smime.c:342:验证错误:不支持的证书用途在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\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);
}