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


我正在试图弄清楚在使用Security.Framework验证证书时证书的撤销时的iOS政策。 我在iOS的文档中找不到相关信息。 在我正在进行的iPad项目的背景下,有理由要求检查某些证书的撤销状态。有关如何使用Security.Framework在证书验证期间强制CRL / OCSP检查的任何想法?或者我是否需要“退回”OpenSSL才能实现这一目标?

似乎在Mac OS X 10.6 CRL / OCSP检查也是可选的,必须通过Keychain Access手动打开。

马亭


1479
2018-04-11 18:19


起源



答案:


苹果公司的这个问题我得到了答案,我在这里发布了完整的答案:

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

总结一下,iOS上的OCSP实现需要记住几件事:

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

11
2018-03-02 21:36



谢谢你把它挖出来。太糟糕了,它只适用于EV证书。许多备受瞩目的网站(Gmail,Facebook等)都没有电动车。无论如何,像这样的“松散的目标”让我怀疑PKI的价值和半集中数字“信任”的现状...... - Martijn Thé
绝对同意 - 整个系统工作“最好的attmept”的事实(因此,当无法访问OCSP服务器时,评估不会失败)是非常令人不安的... - joshis


答案:


苹果公司的这个问题我得到了答案,我在这里发布了完整的答案:

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

总结一下,iOS上的OCSP实现需要记住几件事:

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

11
2018-03-02 21:36



谢谢你把它挖出来。太糟糕了,它只适用于EV证书。许多备受瞩目的网站(Gmail,Facebook等)都没有电动车。无论如何,像这样的“松散的目标”让我怀疑PKI的价值和半集中数字“信任”的现状...... - Martijn Thé
绝对同意 - 整个系统工作“最好的attmept”的事实(因此,当无法访问OCSP服务器时,评估不会失败)是非常令人不安的... - joshis


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

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 代替。


1
2017-08-30 18:48





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


0
2018-04-20 23:42



这个代码不是有问题吗?该 SecTrustResultType 应该检查 kSecTrustResultProceed 要么 kSecTrustResultUnspecified 如果我没错的话。目前你只是检查是否 SecTrustEvaluate 没有抛出错误 - Lukas
@Lukas你是对的,我应该检查trustResultType。但只应检查状态是否良好。当我使用错误的证书或MitM攻击测试代码时,状态总是很糟糕。我会更新这个例子。谢谢 - Brian