CRL和OCSP行为的iOS / Security.Framework?

我试图找出什么样的iOS的政策是在使用Security.Frameworkvalidation证书撤销证书。 我无法在iOS文档中find关于此的信息。 在目前我正在处理的iPad项目的背景下,有理由要求检查某些证书的撤销状态。 任何想法如何强制使用Security.Framework证书validationCRL / OCSP检查? 还是我需要“回退”到OpenSSL来完成这个?

似乎在Mac OS X 10.6 CRL / OCSP检查也是可选的,必须通过Keychain Access手动开启。

马亭

我有一个由苹果家伙回答这个问题,我在这里发表了完整的答案:

iOS上SSL / TLS证书撤销机制的详细信息

综上所述,在iOS上实施OCSP需要注意以下几点:

  • 此时不能configurationOCSP策略
  • 它只适用于EV证书
  • 高级别的东西,比如NSURLConnection或UIWebView使用TLS安全策略,使用OCSP
  • SecTrustEvaluate是一个阻止networking操作
  • 它是“最好的尝试” – 如果OCSP服务器不能联系,信任评估不会失败

我只是在GCDAsyncSocket的iOS上做了这个。

对于给定的SecTrustRef信任; 做这个

SecPolicyRef policy = SecPolicyCreateRevocation(kSecRevocationOCSPMethod) SecTrustSetPolicies(trust, policy); SecTrustResultType trustResultType = kSecTrustResultInvalid; OSStatus status = SecTrustEvaluate(trust, &trustResultType); if (status == errSecSuccess && trustResultType == kSecTrustResultProceed) { //good! } else { //not good } 

//编辑检查trustResultType

我能够在iOS 10上启用CRL检查SecTrustRef对象:

 SecTrustRef trust = ...; // from TLS challenge CFArrayRef oldPolicies; SecTrustCopyPolicies(trust, &oldPolicies); SecPolicyRef revocationPolicy = SecPolicyCreateRevocation(kSecRevocationCRLMethod); NSArray *newPolicies = [(__bridge NSArray *)oldPolicies arrayByAddingObject(__bridge id)revocationPolicy]; CFRelease(oldPolicies); SecTrustSetPolicies(trust, (__bridge CFArrayRef)newPolicies); SecTrustSetNetworkFetchAllowed(trust, true); // Check the trust object SecTrustResult result = kSecTrustResultInvalid; SecTrustEvaluate(trust, &result); // cert revoked -> kSecTrustResultRecoverableTrustFailure 

调用SecTrustSetNetworkFetchAllowed是关键。 没有这个调用, SecTrustEvaluate返回kSecTrustResultUnspecified