【问题标题】:How to work with validating trust of SecCertificateRef如何验证对 SecCertificateRef 的信任
【发布时间】: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); 

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

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

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

【问题讨论】:

    标签: ios keychain x509


    【解决方案1】:

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

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


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

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


    或者是否可以只使用与该证书链接的标志来说明该证书是受信任的?

    您可以随心所欲地存储它。在我看来,您需要一张证书 状态的地图。我想象一个用户可能也不想信任证书的情况。

    【讨论】:

    • 我明白了,我的主要困惑是我是否需要以某种方式将 SecTrustRef 存储回 SecCertificateRef。我找不到这样做的方法,但即使有,我也不应该修改实际的证书。感谢您清理一切。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-30
    • 2020-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多