13

我试图弄清楚 iOS 使用 Security.Framework 验证证书时关于吊销证书的政策是什么。我在 iOS 的文档中找不到有关此的信息。在我目前正在处理的 iPad 项目的上下文中,有理由要求检查某些证书的吊销状态。关于如何在使用 Security.Framework 进行证书验证期间强制 CRL / OCSP 检查的任何想法?还是我需要“退回”到 OpenSSL 来完成这个?

似乎在 Mac OS X 10.6 CRL / OCSP 检查也是可选的,并且必须通过钥匙串访问手动打开。

马汀

4

3 回答 3

13

我有苹果人对这个问题的答案,我在这里发布了完整的答案:

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

总而言之,在 iOS 上实现 OCSP 需要牢记以下几点:

  • 目前无法配置 OCSP 策略
  • 它仅适用于 EV 证书
  • 高级别的东西,例如 NSURLConnection 或 UIWebView 使用 TLS 安全策略,它使用 OCSP
  • SecTrustEvaluate 是一个阻塞网络操作
  • 它是“最佳尝试”——如果无法联系到 OCSP 服务器,则信任评估不会失败
于 2012-03-02T21:36:46.860 回答
1

我刚刚在 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

于 2015-04-20T23:42:10.837 回答
1

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

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

于 2017-08-30T18:48:53.583 回答