Nano Hash - криптовалюты, майнинг, программирование

NSUrlConnection sendAsynchronousRequest и самозаверяющие сертификаты

Я пишу некоторый код API, который выполняет HTTP-запросы, и я использовал [NSUrlConnection:sendAsynchronousRequest:queue:completionHandler] для вызовов, так как это позволяет довольно легко писать простые обработчики, а также чтобы я не должны иметь разные классы с разными делегатами для каждого вызова.

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

23.07.2012

Ответы:


1

Нет, но вызовы делегатов не так уж и сложны. Это код, который вам нужен:

1) Сделать этот файл статическим

static CFArrayRef certs;

2) СДЕЛАЙТЕ это в своей инициализации:

    // I had a crt certificate, needed a der one, so found this site:
    // http://fixunix.com/openssl/537621-re-der-crt-file-conversion.html
    // and did this from Terminal: openssl x509 -in crt.crt -outform der -out crt.der
    NSString *path = [[NSBundle mainBundle] pathForResource:@"<your name>" ofType:@"der"];
    assert(path);
    NSData *data = [NSData dataWithContentsOfFile:path];
    assert(data);

    SecCertificateRef rootcert = SecCertificateCreateWithData(NULL, (__bridge CFDataRef)data);
    if(rootcert) {
        const void *array[1] = { rootcert };
        certs = CFArrayCreate(NULL, array, 1, &kCFTypeArrayCallBacks);
        CFRelease(rootcert);    // for completeness, really does not matter 
    } else {
        NSLog(@"BIG TROUBLE - ROOT CERTIFICATE FAILED!");
    }

3) Затем добавьте этот метод:

- (void)connection:(NSURLConnection *)conn didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge
{
#pragma unused(conn)
    // NSLog(@"didReceiveAuthenticationChallenge %@ FAILURES=%zd", [[challenge protectionSpace] authenticationMethod], (ssize_t)[challenge previousFailureCount]);

    /* Setup */
    NSURLProtectionSpace *protectionSpace   = [challenge protectionSpace];
    assert(protectionSpace);
    SecTrustRef trust                       = [protectionSpace serverTrust];
    assert(trust);
    CFRetain(trust);                        // Don't know when ARC might release protectionSpace
    NSURLCredential *credential             = [NSURLCredential credentialForTrust:trust];

    BOOL trusted = NO;
    OSStatus err;
    SecTrustResultType trustResult = 0;

    err = SecTrustSetAnchorCertificates(trust, certs);
    if (err == noErr) {
        err = SecTrustEvaluate(trust, &trustResult);
        if(err == noErr) {
        // http://developer.apple.com/library/mac/#qa/qa1360/_index.html
            switch(trustResult) {
            case kSecTrustResultProceed:
            case kSecTrustResultConfirm:
            case kSecTrustResultUnspecified:
                trusted = YES;
                break;
            }       
        }
    }
    CFRelease(trust);

    // Return based on whether we decided to trust or not
    if (trusted) {
        [[challenge sender] useCredential:credential forAuthenticationChallenge:challenge];
    } else {
        NSLog(@"Trust evaluation failed");
        [[challenge sender] cancelAuthenticationChallenge:challenge];
    }
}
23.07.2012
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..