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
应该检查为kSecTrustResultProceed
或kSecTrustResultUnspecified
。目前您只是在检查 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 13 后,钥匙串查询总是返回 errSecItemNotFound