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

Posted

技术标签:

【中文标题】iOS / Security.Framework 的 CRL 和 OCSP 行为?【英文标题】:CRL and OCSP behavior of iOS / Security.Framework? 【发布时间】:2011-08-03 07:06:22 【问题描述】:

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

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

马丁

【问题讨论】:

【参考方案1】:

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

Details on SSL/TLS certificate revocation mechanisms on iOS

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

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

【讨论】:

感谢您挖掘这个。太糟糕了,它只适用于 EV 证书。许多知名网站(Gmail、Facebook 等)都没有 EV。总之,像这样的“零散的结局”让我怀疑 PKI 的价值和半中心化数字“信任”的现状...... 完全同意 - 整个系统“以最佳方式运行”这一事实(因此,当无法访问 OCSP 服务器时评估不会失败)非常令人不安......【参考方案2】:

我刚刚在 iOS 上的 GCDAsyncSocket 中做到了这一点。

对于给定的 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

【讨论】:

这段代码是不是有问题?如果我没记错的话,SecTrustResultType 应该检查为kSecTrustResultProceedkSecTrustResultUnspecified。目前您只是在检查 SecTrustEvaluate 是否没有抛出错误 @Lukas 你说得对,我应该检查 trustResultType。但只有在状态良好时才应检查。当我用错误的证书或中间人攻击测试代码时,状态总是很糟糕。我将更新示例。谢谢【参考方案3】:

我能够在 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

【讨论】:

以上是关于iOS / Security.Framework 的 CRL 和 OCSP 行为?的主要内容,如果未能解决你的问题,请参考以下文章

iPhone Undocumented API of Security.framework

iOS获取设备卸载后不变的UUID

升级到 iOS 13 后,钥匙串查询总是返回 errSecItemNotFound

iOS笔记—NSURLConnection怎么把http改为https

SMJobBless官方Demo笔记

如何从字符串获取 PKCS8 RSA 私钥/从 XML 获取 RSA 密钥对