Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/24.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检查是否安装了根证书*并且*受信任_Ios_Objective C_Ssl - Fatal编程技术网

iOS检查是否安装了根证书*并且*受信任

iOS检查是否安装了根证书*并且*受信任,ios,objective-c,ssl,Ios,Objective C,Ssl,我们的应用程序正在安装根CA配置文件,我想验证用户是否已安装并信任该配置文件 目前,我们大致就是这么做的(对核心部分进行了修剪) 问题是,一旦安装了配置文件,结果要么是ksectrustsresultunspecified(iOS 10~)要么是ksectrustsresultproced(iOS 11~) 但我想检查用户是否信任它(在常规->关于->信任设置下) 我翻遍了苹果的文档,没有发现任何东西,而且在文档中,它说返回值“继续”意味着用户信任证书 继续-用户明确选择信任链中的证书(通常通过

我们的应用程序正在安装根CA配置文件,我想验证用户是否已安装并信任该配置文件

目前,我们大致就是这么做的(对核心部分进行了修剪)

问题是,一旦安装了配置文件,结果要么是ksectrustsresultunspecified(iOS 10~)要么是ksectrustsresultproced(iOS 11~) 但我想检查用户是否信任它(在常规->关于->信任设置下)

我翻遍了苹果的文档,没有发现任何东西,而且在文档中,它说返回值“继续”意味着用户信任证书

继续-用户明确选择信任链中的证书(通常通过单击证书信任面板中的按钮)。


有人知道怎么做吗?我错过了什么

所以,在深入研究之后,我发现SecPolicyCreateSSL工作正常,但仍然不是100%为什么SecPolicyCreateBasicX509不能正常工作

所以对于未来的ref,如果有人有这个问题,这就是我们所做的

SecPolicyRef policy = SecPolicyCreateSSL(true, NULL);
SecTrustRef testTrust;

OSStatus status = SecTrustCreateWithCertificates((__bridge CFArrayRef)fullChain, policy, &testTrust);
status = SecTrustEvaluate(testTrust, &trustResult);

CFRelease(testTrust);
CFRelease(policy);

return (status == errSecSuccess) && (kSecTrustResultUnspecified == trustResult || kSecTrustResultProceed == trustResult);;

(基本上改用SecPolicyCreateSSL)

通过@Al Ga改进了Objective-C代码,并在iOS 13/14上进行了测试和工作

   SecPolicyRef policyObj = SecPolicyCreateBasicX509();
   SecTrustRef trustObj;
   
   NSString *filePath = [[NSBundle mainBundle] pathForResource:@"certName" ofType:@"crt"];
   NSData *certData = [NSData dataWithContentsOfFile:filePath];
   CFDataRef certCFR = (__bridge CFDataRef)certData;
   SecCertificateRef certSCR = SecCertificateCreateWithData(NULL, certCFR);
   
   NSArray* certArray = @[ (__bridge id)certSCR ];
   
   OSStatus error = SecTrustCreateWithCertificates((__bridge CFTypeRef _Nonnull)certArray, policyObj, &trustObj);

   SecTrustResultType result;
   error = SecTrustEvaluate(trustObj, &result);
SecTrustResultType结果将包含uint32\u t

  • kSecTrustResultInvalid=0
  • kSecTrustResultProceed=1/已安装根证书
  • ksectrustsresultconfirm=2
  • kSecTrustResultDeny=3
  • kSecTrustResultUnspecified=4
  • kSecTrustResultRecoverableTrustFailure=5/未安装根证书
  • ksectrustResultCatalTrustFailure=6
  • ksectrustResultToTherror=7
   SecPolicyRef policyObj = SecPolicyCreateBasicX509();
   SecTrustRef trustObj;
   
   NSString *filePath = [[NSBundle mainBundle] pathForResource:@"certName" ofType:@"crt"];
   NSData *certData = [NSData dataWithContentsOfFile:filePath];
   CFDataRef certCFR = (__bridge CFDataRef)certData;
   SecCertificateRef certSCR = SecCertificateCreateWithData(NULL, certCFR);
   
   NSArray* certArray = @[ (__bridge id)certSCR ];
   
   OSStatus error = SecTrustCreateWithCertificates((__bridge CFTypeRef _Nonnull)certArray, policyObj, &trustObj);

   SecTrustResultType result;
   error = SecTrustEvaluate(trustObj, &result);