objective-c - kSecTrustResultRecoverableTrustFailure 的原因是什么?

标签 objective-c ios ssl certificate

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

kSecTrustResultRecoverableTrustFailure 

代替

kSecTrustResultProceedkSecTrustResultUnspecified

如果

似乎会发生
  • 证书经过 md5 哈希处理 (IOS5)
  • 服务器不提供根证书和中间证书
  • SecTrustSetAnchorCertificatesOnly(trust,YES) 已设置且 anchor 证书仅在内置 anchor 证书中
  • 证书已过期
  • ?

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

我的问题是如果链失败我不想信任,但如果使用 MD5 我想信任。

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

作为替代方案,有没有办法从 SecCertificateRef 中提取 CSSM_ALGID_MD5

最佳答案

可能是服务器证书问题....

检查 here ,我解决了我的 kSecTrustResultRecoverableTrustFailure 问题,将 subjectAltName = DNS:example.com 添加到 openssl 配置文件中,特别是在服务器 key 生成中...

如果您没有使用 openssl 来生成它,很抱歉,但我可以帮助您。无论如何,如果您想使用 openssl,here是生成这些 key 并使用您自己的根证书颁发机构签名的好教程。

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

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

Hope it helps !

EDITED:

My Server evaluation code:

#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;
}

}

希望现在对您有所帮助:)!

关于objective-c - kSecTrustResultRecoverableTrustFailure 的原因是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7715426/

相关文章:

objective-c - 是否可以让用户在 iOS 中手动将铃声导入我的应用程序?

iphone - 如何将复选框添加到 UITableViewCell?

ios - Alamofire 没有发现错误

iOS:有没有办法知道 iOS 的当前用户是否使用过我的应用程序

iOS 推送通知 SSL 证书

c++ - 使用全局变量的 Xcode C++ 单元测试

ios - iPhone 6 和 6Plus 缩放显示的自动布局问题

ssl - rtm_connect 到 slackbot 给出 SSL 证书验证错误

java - 如何在没有证书的情况下连接到 https 网络服务?

iphone - 当用户退出时,是否有一种可以用来重置 iPhone 应用程序的万能方法?