У меня есть поставляемое приложение, которое использует следующий код для защиты соединения SSL с помощью самозаверяющего сертификата, поставляемого с приложением.
- (void) connection:(NSURLConnection *)conn willSendRequestForAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge
{
NSLog(@"didReceiveAuthenticationChallenge %@ FAILURES=%d", [[challenge protectionSpace] authenticationMethod], (int)[challenge previousFailureCount]);
/* Setup */
NSURLProtectionSpace *protectionSpace = [challenge protectionSpace];
assert(protectionSpace);
SecTrustRef trust = [protectionSpace serverTrust];
assert(trust);
CFRetain(trust); // Make sure this thing stays around until we're done with it
NSURLCredential *credential = [NSURLCredential credentialForTrust:trust];
/* Build up the trust anchor using our root cert */
int err;
SecTrustResultType trustResult = 0;
err = SecTrustSetAnchorCertificates(trust, certs);
if (err == noErr) {
err = SecTrustEvaluate(trust,&trustResult);
}
CFRelease(trust); // OK, now we're done with it
// http://developer.apple.com/library/mac/#qa/qa1360/_index.html
BOOL trusted = (err == noErr) && ((trustResult == kSecTrustResultProceed) || (trustResult == kSecTrustResultConfirm) || (trustResult == kSecTrustResultUnspecified));
// Return based on whether we decided to trust or not
if (trusted) {
[[challenge sender] useCredential:credential forAuthenticationChallenge:challenge];
} else {
NSLog(@"Trust evaluation failed for service root certificate");
[[challenge sender] cancelAuthenticationChallenge:challenge];
}
}
К сожалению, я допустил огромную оплошность. SSL-сертификаты истекают. Поэтому, когда истечет срок годности, я предполагаю, что приложение перестанет работать должным образом! Я ничего не могу сделать для текущей версии приложения — скоро она перестанет работать.
Мне нужно выпустить обновление, и чтобы избежать этого в будущем, я хотел бы разрешить самозаверяющий сертификат, даже если срок его действия истек.
Как изменить мой код выше, чтобы доверять сертификату, даже если срок его действия истек?
kSecTrustResultRecoverableTrustFailure
как еще один приемлемый результат доверия? - person djskinner   schedule 12.09.2013