Непрерывно получая kSecTrustResultRecoverableTrustFailure при оценке доверия - iphone

Я хочу безопасно общаться с моим сервером, и вот что я делаю...

NSURLProtectionSpace *protectionSpace = [challenge protectionSpace];
SecTrustRef trust = [protectionSpace serverTrust];
NSURLCredential *credential = [NSURLCredential credentialForTrust:trust];

    SecPolicyRef myPolicy = SecPolicyCreateBasicX509();

NSArray * certs = [[NSArray alloc] initWithObjects:(id)certificate,nil]; //certificate is my server's cert.
credential = [NSURLCredential credentialForTrust:trust];

    SecTrustSetAnchorCertificates(trust,
                                  (CFArrayRef) [NSArray arrayWithObject:(id) certificate ]);    

OSStatus status = SecTrustCreateWithCertificates(certs, myPolicy, &trust);

SecTrustResultType trustResult = 0;

if (status == noErr) {
    status = SecTrustEvaluate(trust, &trustResult);
}

    NSLog(@"Trust I get: %d", trustResult);
[certs release];

if (trustResult == kSecTrustResultRecoverableTrustFailure) {
    NSLog(@"Recoverable Failure");
    CFAbsoluteTime trustTime,currentTime,timeIncrement,newTime;
    CFDateRef newDate;

    trustTime = SecTrustGetVerifyTime(trust);             
    timeIncrement = 31536000;                               
    currentTime = CFAbsoluteTimeGetCurrent();              
    newTime = currentTime - timeIncrement;                  
    if (trustTime - newTime){                               
        newDate = CFDateCreate(NULL, newTime);              
        SecTrustSetVerifyDate(trust, newDate);            
        status = SecTrustEvaluate(trust, &trustResult);   
    }
    NSLog(@"Trust again:%d", trustResult);// AGAIN kSecTrustResultRecoverableTrustFailure(5) over here

}

У кого-то есть идея, почему это происходит... Кажется, речь идет не об истечении срока действия сертификата (что на самом деле не так), но может быть причиной.

благодарю вас

аль

1 ответ

SecTrustResultRecoverableTrustFailure случается, если

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

Я решил свою проблему, настроив веб-сервер на отправку всей цепочки сертификатов, а не только сертификата сервера.

Настроив мой apache mod_ssl: https://httpd.apache.org/docs/2.2/mod/mod_ssl.html

Другие вопросы по тегам