iOS NSURLConnection с SSL: принятие самозаверяющего сертификата с истекшим сроком действия

У меня есть поставляемое приложение, которое использует следующий код для защиты соединения 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-сертификаты истекают. Поэтому, когда истечет срок годности, я предполагаю, что приложение перестанет работать должным образом! Я ничего не могу сделать для текущей версии приложения — скоро она перестанет работать.

Мне нужно выпустить обновление, и чтобы избежать этого в будущем, я хотел бы разрешить самозаверяющий сертификат, даже если срок его действия истек.

Как изменить мой код выше, чтобы доверять сертификату, даже если срок его действия истек?


person djskinner    schedule 11.09.2013    source источник
comment
Достаточно ли просто принять kSecTrustResultRecoverableTrustFailure как еще один приемлемый результат доверия?   -  person djskinner    schedule 12.09.2013
comment
Это именно то, что я сделал, и это сработало   -  person djskinner    schedule 19.02.2014