【问题标题】:What is the reason of kSecTrustResultRecoverableTrustFailure?kSecTrustResultRecoverableTrustFailure 的原因是什么?
【发布时间】:2011-12-04 15:38:00
【问题描述】:

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

kSecTrustResultRecoverableTrustFailure 

而不是

kSecTrustResultProceedkSecTrustResultUnspecified

如果

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

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

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

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

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

【问题讨论】:

    标签: objective-c ios ssl certificate


    【解决方案1】:

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

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

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

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

    [ 服务器 ] 基本约束 = 关键,CA:FALSE keyUsage = 数字签名、密钥加密、数据加密 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;
    }
    
    }
    

    现在希望它有所帮助:)!

    【讨论】:

    • 感谢您的建议。但我的问题是我自己不颁发证书。
    • 所以您的问题是您的 CA 证书或在您的评估中!你是如何导入你的密钥的?从每个来源,是一个文件?在我的评论中编辑的是我的评估代码...
    • 嗨。感谢更新。我的问题是如何获得 kSecTrustResultRecoverableTrustFailure 的原因,因为有时我想返回 YES。
    • 嗯....您可能需要更深入!您是否尝试过将自己的到期验证设置为 stackoverflow.com/questions/5340937/… ??
    • 可能如果我想知道我的 'kSecTrustResultRecoverableTrustFailure' 的原因,我会自己进行每个验证,这样我就可以知道哪里失败了。努力工作只是为了知道是什么原因并可能接受它。最好只接受好的证书......
    【解决方案2】:

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

    在调用SecTrustEvaluate()之后再调用SecTrustCopyProperties()

    SecTrustRef trust = ...;
    SecTrustResultType trustResult = kSecTrustResultOtherError;
    OSStatus status = SecTrustEvaluate(trust, &trustResult);
    if (trustResult == kSecTrustResultRecoverableTrustFailure) {
        NSArray * trustProperties = (__bridge_transfer id)
            SecTrustCopyProperties(certTrust);
    }
    

    trustProperties 是一个字典数组,评估的证书链中的每个证书都有一个字典。每个字典都有一个条目title,包含证书的名称,如果证书没有评估,它还包含一个包含错误的条目error。例如。如果问题是证书已过期,则error 的值将是CSSMERR_TP_CERT_EXPIRED

    【讨论】:

      猜你喜欢
      • 2017-04-10
      • 2016-08-28
      • 2016-09-01
      • 2011-08-29
      • 1970-01-01
      • 1970-01-01
      • 2016-03-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多