【问题标题】:iOS checking if root certificate is installed *and* trustediOS 检查是否安装了根证书*并且*受信任
【发布时间】:2018-11-07 18:59:05
【问题描述】:

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

目前这大致是我们所做的(将其修剪为核心)

SecPolicyRef policyObj = SecPolicyCreateBasicX509();
SecTrustRef trustObj;
OSStatus error = SecTrustCreateWithCertificates((__bridge CFTypeRef _Nonnull)(fullChain), policyObj, &trustObj);

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

CFRelease(trustObj);
CFRelease(policyObj);

return (kSecTrustResultUnspecified == result || kSecTrustResultProceed == result);

问题是这样的,一旦安装了配置文件,结果要么是 kSecTrustResultUnspecified (iOS 10~) 要么是 kSecTrustResultProceed (iOS 11~) 但我想检查用户是否信任它(在 General->About->Trust Settings 下)

我翻遍了苹果的文档,一无所获,而且在 SecTrustEvaluate 文档中它说返回值“继续”意味着用户信任证书。

proceed— The user explicitly chose to trust a certificate in the chain (usually by clicking a button in a certificate trust panel).

有人知道如何做到这一点吗?我错过了什么?

【问题讨论】:

    标签: ios objective-c ssl


    【解决方案1】:

    @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_t

    • kSecTrustResultInvalid = 0
    • kSecTrustResultProceed = 1 //已安装根证书
    • kSecTrustResultConfirm = 2
    • kSecTrustResultDeny = 3
    • kSecTrustResultUnspecified = 4
    • kSecTrustResultRecoverableTrustFailure = 5 //根证书未安装
    • kSecTrustResultFatalTrustFailure = 6
    • kSecTrustResultOtherError = 7

    【讨论】:

      【解决方案2】:

      所以,在四处挖掘之后,我发现 SecPolicyCreateSSL 正在按预期工作,但仍然不是 100% 为什么 SecPolicyCreateBasicX509 没有。

      因此,对于将来的裁判,如果有人遇到此问题,这就是我们所做的,

      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 代替)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-02-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-20
        • 2022-12-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多