kSecTrustResultRecoverableTrustFailure的原因是什么?
我想用一些额外的检查来validation我的ssl服务器证书。 有时我会得到一个
kSecTrustResultRecoverableTrustFailure
代替
kSecTrustResultProceed
或kSecTrustResultUnspecified
这似乎发生如果
- 证书是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; } }
希望现在它可以帮助:)!