kSecTrustResultRecoverableTrustFailure的原因是什么?

我想用一些额外的检查来validation我的ssl服务器证书。 有时我会得到一个

kSecTrustResultRecoverableTrustFailure 

代替

kSecTrustResultProceedkSecTrustResultUnspecified

这似乎发生如果

  • 证书是MD5散列(IOS5)
  • 服务器不提供根证书和中间证书
  • SecTrustSetAnchorCertificatesOnly(trust,YES)被设置并且锚证书仅在内build的锚证书中
  • 证书已过期

这取决于用于评估信任的AppleX509TP策略。

我的问题是我不想相信链条是否失败,但是我想要相信是否使用了MD5。

有没有办法找出评估失败的原因?

另一种方法是从SecCertificateRef提取SecCertificateRef

这可能是一个服务器证书问题….

在这里检查,我解决了我的kSecTrustResultRecoverableTrustFailure问题,添加subjectAltName = DNS:example.com到opensslconfiguration文件,特别是在服务器密钥生成…

如果你不使用openssl来生成它,我很抱歉,但我可以帮你。无论如何,如果你想使用openssl, 这是一个很好的教程来生成这些密钥,然后用自己的根证书颁发机构签名。

在本教程中,我只是将我的openssl服务器configuration文件更改为:

     [服务器]
     basicConstraints = critical,CA:FALSE
     keyUsage = digitalSignature,keyEncipherment,dataEncipherment
     extendedKeyUsage = serverAuth
     nsCertType =服务器
     subjectAltName = IP:10.0.1.5,DNS:office.totendev.com
    

希望能帮助到你 !

编辑:

我的服务器评估代码:

 #pragma mark - SERVER Auth Helper //Validate server certificate with challenge + (BOOL)validateServerWithChallenge:(NSURLAuthenticationChallenge *)challenge { //Get server trust management object a set anchor objects to validate it SecTrustSetAnchorCertificates([challenge.protectionSpace serverTrust], (__bridge CFArrayRef)[self allowedCAcertificates]); //Set to server trust management object to JUST ALLOW those anchor objects assigned to it (ABOVE), and disable apple CA trusts SecTrustSetAnchorCertificatesOnly([challenge.protectionSpace serverTrust], YES); //Try to evalute it SecTrustResultType evaluateResult = kSecTrustResultInvalid; //evaluate result OSStatus sanityCheck = SecTrustEvaluate([challenge.protectionSpace serverTrust], &evaluateResult); //Check for no evaluate error if (sanityCheck == noErr) { //Check for result if ([[self class] validateTrustResult:evaluateResult]) { return YES ; } } //deny! return NO ; } //Validate SecTrustResulType + (BOOL)validateTrustResult:(SecTrustResultType)result { switch (result) { case kSecTrustResultProceed: { TDLog(kLogLevelHandshake,nil,@"kSecTrustResultProceed"); return YES ; } break; case kSecTrustResultConfirm: { TDLog(kLogLevelHandshake,nil,@"kSecTrustResultConfirm"); return YES ; } break; case kSecTrustResultUnspecified: { TDLog(kLogLevelHandshake,nil,@"kSecTrustResultUnspecified"); return YES ; } break; case kSecTrustResultDeny: { TDLog(kLogLevelHandshake,nil,@"kSecTrustResultDeny"); return YES ; } break; case kSecTrustResultFatalTrustFailure: { TDLog(kLogLevelHandshake,nil,@"kSecTrustResultFatalTrustFailure"); return NO ; } break; case kSecTrustResultInvalid: { TDLog(kLogLevelHandshake,nil,@"kSecTrustResultInvalid"); return NO ; } break; case kSecTrustResultOtherError: { TDLog(kLogLevelHandshake,nil,@"kSecTrustResultOtherError"); return NO ; } break; case kSecTrustResultRecoverableTrustFailure: { TDLog(kLogLevelHandshake,nil,@"kSecTrustResultRecoverableTrustFailure"); return NO ; } break; default: { TDLog(kLogLevelHandshake,nil,@"unkown certificate evaluate result type! denying..."); return NO ; } break; } } 

希望现在它可以帮助:)!