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

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

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

马丁

【问题讨论】:

    标签: security ios x509certificate certificate-revocation 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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-12-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-08
      相关资源
      最近更新 更多