Непрерывно получая 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