В чем причина kSecTrustResultRecoverableTrustFailure? - PullRequest
6 голосов
/ 10 октября 2011

Я хотел бы проверить свои сертификаты сервера ssl с некоторыми дополнительными проверками.И иногда я получаю

kSecTrustResultRecoverableTrustFailure 

вместо

kSecTrustResultProceed или kSecTrustResultUnspecified

Это, кажется, происходит, если

  • сертификат хешируется md5 (IOS5)
  • сервер не предоставляет корневые и промежуточные сертификаты
  • установлен SecTrustSetAnchorCertificatesOnly(trust,YES) и сертификат привязки находится только во встроенных сертификатах привязки
  • срок действия сертификата истек
  • ?

Это зависит от политики AppleX509TP, используемой для оценки доверия.

Моя проблема в том, что я не хочу доверятьесли цепочка не работает, но я хочу доверять, если используется MD5.

Есть ли способ выяснить, почему оценка не удалась?

В качестве альтернативы есть способ извлечь CSSM_ALGID_MD5 из SecCertificateRef?

1 Ответ

3 голосов
/ 20 января 2012

Это может быть проблема с сертификатом сервера ....

Проверьте здесь , я решил мою проблему kSecTrustResultRecoverableTrustFailure , добавив subjectAltName = DNS:example.com в файл конфигурации openssl, в частности, при генерации ключа сервера ...

Если вы не используете openssl для его генерации, извините, но я могу вам помочь. В любом случае, если вы хотите использовать openssl, здесь - хорошее руководство для генерации этих ключей и подписи. с собственным корневым центром сертификации.

Из этого урока я просто изменил свой конфигурационный файл сервера openssl на:

    [ server ]
    basicConstraints = critical,CA:FALSE
    keyUsage = digitalSignature, keyEncipherment, dataEncipherment
    extendedKeyUsage = serverAuth
    nsCertType = server
    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;
}

}

Надеюсь, теперь это помогает :)!

...