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