针对不同策略的一个证书,SecTrustEvaluate的结果不同

时间:2014-10-10 11:03:04

标签: xcode afnetworking

我不明白在下面情况发生的情况下(来自AFSecurityPolicy.m的代码片段,AFPublicKeyForCertificate函数,AFNetwork Framework):

policy = SecPolicyCreateBasicX509();
AF_Require_noErr(SecTrustCreateWithCertificates(tempCertificates, policy, &allowedTrust), _out);
AF_Require_noErr(SecTrustEvaluate(allowedTrust, &result), _out);
//result = 5 (kSecTrustResultRecoverableTrustFailure)

//different policy
policy = SecPolicyCreateSSL(true, (__bridge CFStringRef)@"www.MySite.com");
AF_Require_noErr(SecTrustCreateWithCertificates(tempCertificates, policy, &allowedTrust), _out);
AF_Require_noErr(SecTrustEvaluate(allowedTrust, &result), _out);
//result = 4 (kSecTrustResultUnspecified)

证书有效且未过期。签名算法SHA-1。不明白为什么它为 SecPolicyCreateBasicX509 返回 kSecTrustResultRecoverableTrustFailure 而不是 kSecTrustResultUnspecified

1 个答案:

答案 0 :(得分:1)

请阅读Apple's documentation for Certificate, Key, and Trust Services

  

SecTrustEvaluate函数根据信任管理对象中包含的策略,通过验证证书的签名以及证书链中证书的签名(最多为锚证书)来验证证书。

     

通常,您应该按如下方式处理各种返回值:

     
      
  • kSecTrustResultUnspecified - 评估成功到达(隐式信任的)锚定证书而没有任何评估失败,但从未遇到任何明确声明的用户信任偏好。这是最常见的回报值。
  •   
  • kSecTrustResultRecoverableTrustFailure - 这意味着您不应该按原样信任链,但是可以通过对评估上下文进行一些小的更改来信任链,例如忽略过期的证书或向其添加额外的锚。一套可信赖的锚点。
  •