【发布时间】:2014-03-31 13:19:39
【问题描述】:
我正在使用 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);
理论上这应该返回kSecTrustResultUnspecified 或kSecTrustResultProceed。我的问题是,如果我需要再次检查同一证书的信任度,那么记住这个值的最佳方法是什么。我是否需要将修改后的 SecTrustRef(有例外)存储在钥匙串中以备将来使用。还是可以只用一个与该证书链接的标志来说明该证书是受信任的?
【问题讨论】: