Ищет ли SecTrustEvaluate () корневые сертификаты в цепочке для ключей приложения? - PullRequest
2 голосов
/ 12 января 2011

В документах говорится: «Если не все сертификаты, необходимые для проверки конечного сертификата, включены в объект управления доверием, то SecTrustEvaluate выполняет поиск сертификатов в списке поиска цепочки для ключей (см. SecTrustSetKeychains) и в системном хранилище сертификатов привязки (см. SecTrustSetAnchorCertificates). »

Однако, поскольку SecTrustSetKeychains () недоступна в iOS, неясно, будет ли эта функция также выглядеть в цепочке для ключей приложения.

Ответы [ 3 ]

3 голосов
/ 05 октября 2011

Похоже, прошло много времени с тех пор, как вы отправили сообщение, поэтому я не уверен, что вам все еще нужен ответ.Если ваш вариант использования «Я получаю connection:didReceiveAuthenticationChallenge:», и я хотел бы убедиться, что точный сертификат оценивается, то вы можете использовать встроенные методы доверия iOS или сделатьнемного больше работы через API-интерфейсы Foundation: (обратите внимание, что SecTrustEvaulate здесь специально не вызывается, но его можно добавить довольно просто)

#import <Security/Security.h>
#import <CommonCrypto/CommonDigest.h>

Оттуда вы можете выполнять итерацию всего массива сертификатов,и сравните его с чем-то вроде SHA1 ссылки доверия сервера запроса:

// way #1 - iOS built-in ================================================ //
SecTrustRef trust = challenge.protectionSpace.serverTrust;
CFIndex cnt = SecTrustGetCertificateCount(trust);

// way #2 - build it in yourself from a file ============================ //
OSErr err;
NSString *path = [[NSBundle mainBundle] pathForResource:@"my.cert" 
                                                 ofType:@"der"];
NSData *derData = [NSData dataWithContentsOfFile:path];

SecCertificateRef myCert = 
    SecCertificateCreateWithData(NULL, (CFDataRef)derData);

CFMutableArrayRef array = CFArrayCreateMutable(NULL, 1, NULL);
CFArrayInsertValueAtIndex(array, 0, myCert);

err = SecTrustSetAnchorCertificates(trust, array);
if (err != errSecSuccess) {
    // do something smarter here, obviously, logging would be a start
    abort();
}
CFArrayRef certs = NULL;
err = SecTrustCopyCustomAnchorCertificates(trust, &certs);
if (err != errSecSuccess) {
    // again, better choices needed
    abort();
}
CFIndex cnt = CFArrayGetCount(certs);

// loop and compare 'em
for (int i = 0; i < cnt; i++) {
    SecCertificateRef cert = SecTrustGetCertificateAtIndex(trust, i);

    CFDataRef cdata = SecCertificateCopyData(cert);
    NSData *data = [[NSData alloc] initWithData:(NSData *)cdata];

    unsigned char digest_result[CC_SHA1_DIGEST_LENGTH];

    CC_SHA1(data.bytes, data.length, digest_result);
    // compare each byte with your in-code SHA1 bytes
    if (allBytesMatch) {
        NSURLCredential *cred = [NSURLCredential credentialForTrust:trust];
        [challenge.sender useCredential:cred 
             forAuthenticationChallenge:challenge];
    }
}
// don't forget to release & CFRelease all the alloc'ed stuff from above
2 голосов
/ 29 октября 2013

В документе написано:

Примечание. Хотя эта функция ищет в цепочке ключей пользователя (или в цепочке ключей приложения в iOS) промежуточные сертификаты, она не ищет в этих цепочках ключей привязанные (корневые) сертификаты. Чтобы добавить сертификат привязки, необходимо вызвать SecTrustSetAnchorCertificates.

Источник: SecTrustEvaluateся документация

0 голосов
/ 04 апреля 2012

eskimo1 от Apple Devforums ответил на это так:

  1. Ищет ли SecTrustEvaluate () корневые сертификаты в цепочке для ключей приложения?

Не подефолт.Однако это легко сделать, получив сертификаты из цепочки для ключей (или откуда-либо) и применив их к объекту SecTrust с помощью SecTrustSetAnchorCertificates.

SecTrustEvaluation / найдет / найдет промежуточные сертификаты в цепочке для ключей.

...