kSecTrustResultRecoverableTrustFailure是什么原因造成的?

n3u*_*ino 6 ssl certificate objective-c ios

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

kSecTrustResultRecoverableTrustFailure 
Run Code Online (Sandbox Code Playgroud)

代替

kSecTrustResultProceed 要么 kSecTrustResultUnspecified

似乎发生了

  • 证书是md5哈希(IOS5)
  • 服务器不提供根证书和中间证书
  • SecTrustSetAnchorCertificatesOnly(trust,YES) 设置和锚证书只是在内置的锚证书
  • 证书已过期

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

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

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

作为一种替代方法是有一种方法CSSM_ALGID_MD5从一个SecCertificateRef

gwd*_*wdp 3

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

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

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

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

    [ 服务器 ]
    basicConstraints = 关键,CA:FALSE
    keyUsage = 数字签名、密钥加密、数据加密
    扩展密钥使用 = 服务器验证
    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;
}

}
Run Code Online (Sandbox Code Playgroud)

希望现在它有帮助:)!