我不明白在下面情况发生的情况下(来自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 。
答案 0 :(得分:1)
请阅读Apple's documentation for Certificate, Key, and Trust Services
SecTrustEvaluate函数根据信任管理对象中包含的策略,通过验证证书的签名以及证书链中证书的签名(最多为锚证书)来验证证书。
通常,您应该按如下方式处理各种返回值:
kSecTrustResultUnspecified
- 评估成功到达(隐式信任的)锚定证书而没有任何评估失败,但从未遇到任何明确声明的用户信任偏好。这是最常见的回报值。kSecTrustResultRecoverableTrustFailure
- 这意味着您不应该按原样信任链,但是可以通过对评估上下文进行一些小的更改来信任链,例如忽略过期的证书或向其添加额外的锚。一套可信赖的锚点。