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

13
我正在尝试弄清楚在使用Security.Framework验证证书时,iOS的政策是关于撤销证书的。 在iOS文档中找不到相关信息。 在我目前正在进行的iPad项目的背景下,有理由要求检查某些证书的撤销状态。有什么办法可以在证书验证期间强制进行CRL / OCSP检查吗?还是我需要“退回”到OpenSSL来完成这个任务?
似乎在Mac OS X 10.6上,CRL / OCSP检查也是可选的,必须通过Keychain Access手动打开。
马尔廷
3个回答

13

我有一个关于苹果公司这个问题的答案,我将完整的回答发布在这里:

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

总的来说,在iOS上实现OCSP时需要注意以下几点:

  • 目前无法配置OCSP策略
  • 仅适用于EV证书
  • 高级内容(如NSURLConnection或UIWebView)使用TLS安全策略,其中包含OCSP
  • SecTrustEvaluate是阻塞式的网络操作
  • 它会尝试最佳 - 如果无法联系OCSP服务器,则信任评估不会失败

感谢您挖掘出这个信息。可惜它只适用于EV证书。很多知名网站(如Gmail、Facebook等)并没有使用EV证书。无论如何,这些“松散的端口”让我对PKI的价值和半中心化数字“信任”的现状产生了怀疑... - Martijn Thé
完全同意 - 整个系统只能做到“最好的尝试”(因此,当无法访问OCSP服务器时,评估不会失败)这一事实也相当令人不安... - joshis

1

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


1
这段代码有问题吗?如果我没记错的话,应该检查SecTrustResultType是否为kSecTrustResultProceedkSecTrustResultUnspecified。目前你只是检查了SecTrustEvaluate是否没有抛出错误。 - Quxflux
@Lukas 您是正确的,我应该检查 trustResultType。但是只有在状态良好时才应检查它。当我使用错误的证书或MitM攻击测试代码时,状态始终为bad。我会更新示例。谢谢。 - Brian

1

我能够在iOS 10上为SecTrustRef对象启用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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接