Macos 始终获取kSecTrustResultRecoverableTrustFailure,即使在更改密钥链访问中的信任设置后也是如此

Macos 始终获取kSecTrustResultRecoverableTrustFailure,即使在更改密钥链访问中的信任设置后也是如此,macos,certificate,keychain,security-framework,Macos,Certificate,Keychain,Security Framework,在我的SecTrustRef对象上调用SecTrustEvaluateWithError()时,API总是返回kSecTrustResultRecoverableTrustFailure。根据头文件,这意味着: 指示用户可以覆盖的信任策略失败。此值可由SecTrustEvaluate函数返回,但不作为用户信任设置的一部分存储 由于可以覆盖,我使用Keychain Accessapp更改了不受信任证书的信任设置,如下所示: 然而,这似乎没有什么区别,结果仍然是ksectrustsresultre

在我的
SecTrustRef
对象上调用
SecTrustEvaluateWithError()
时,API总是返回
kSecTrustResultRecoverableTrustFailure
。根据头文件,这意味着:

指示用户可以覆盖的信任策略失败。此值可由
SecTrustEvaluate
函数返回,但不作为用户信任设置的一部分存储

由于可以覆盖,我使用
Keychain Access
app更改了不受信任证书的信任设置,如下所示:


然而,这似乎没有什么区别,结果仍然是
ksectrustsresultrecoverabletrustfailure
,那么我做错了什么?

结果表明问题是由调用
SecTrustSetAnchorCertificates()
引起的,在调用
SecTrustSetAnchorCertificates()之前,我使用它添加自己的CA证书

同时,不推荐使用的函数
SecTrustEvaluate()
在文档中包含一个重要注释:

作为例外,如果您的应用程序以前调用过
SecTrustSetAnchorCertificates
将忽略用户指定的信任设置,并且证书链必须包含指定的锚证书之一

资料来源:

虽然
SecTrustEvaluateWithError()
文档中缺少此注释,但它也适用于此函数以及
sectrustEvaluateSyncWithError()
。如果我确保从不调用
SecTrustSetAnchorCertificates()
,则用户覆盖按预期工作(有了该覆盖,证书被系统视为受信任,没有它则不受信任,这是预期行为)