如何使用验证SecCertificateRef的信任

时间:2014-03-31 13:19:40

标签: ios keychain x509

我正在使用x509证书并验证这些证书的信任。我能够将x509证书“导入”到SecCertificateRef对象中,但我所担心的是验证信任。这就是我现在所拥有的:

 SecCertificateRef certificateRef = SecCertificateCreateWithData((CFAllocatorRef)NULL, (__bridge CFDataRef)(x509Certificate));
 SecTrustRef trustRef = nil;
 SecPolicyRef policyRef = SecPolicyCreateBasicX509();

 SecTrustResultType trustResultType;
 SecCertificateRef evalCertArray[1] = { certificateRef };

 CFArrayRef cfCertRef = CFArrayCreate ((CFAllocatorRef) NULL,(void *)evalCertArray, 1,&kCFTypeArrayCallBacks);

 OSStatus status1 = SecTrustCreateWithCertificates (cfCertRef, policyRef, &trustRef);    
 OSStatus status2 = SecTrustEvaluate (trustRef, &trustResultType); 

现在这段代码会给我一个trustResultType kSecTrustResultRecoverableTrustFailure。当我得到这个结果时,我提示用户该证书是否应该被信任,如果用户选择是,我正在执行此代码“

CFDataRef errDataRef = SecTrustCopyExceptions(trustRef);
SecTrustSetExceptions(trustRef, errDataRef);
SecTrustEvaluate(trustRef, &trustResultType);

理论上,这应该返回kSecTrustResultUnspecifiedkSecTrustResultProceed。我的问题是,如果我需要再次检查同一证书的信任,那么记住这个值的最佳方法是什么。我是否需要将修改后的SecTrustRef(有例外)存储在钥匙串中以备将来使用。或者只是有一个与该证书相关联的标志,说明该证书是否可信,是否可以?

1 个答案:

答案 0 :(得分:0)

  

我的问题是,如果我需要再次检查同一证书的信任,那么记住此值的最佳方法是什么。

使用NSUserDefault保存用户设置。例如,请参阅Storing User Data iOS


  

我是否需要将修改过的SecTrustRef(有例外)存储在钥匙串中以备将来使用。

您的用户是否需要撤回他/她的信任?


  

或者只是有一个与该证书相关联的标志,表明该证书是可信的吗?

您可以随意存储它。在我看来,你需要一张证书地图< - >状态。我想象一个用户可能也希望永远不会信任证书的情况。