Ищет ли SecTrusteValuate () для корневых сертификатов в ключевой матче приложения?
Вопрос
Документы говорят: «Если не все сертификаты, необходимые для проверки сертификата LEAF, включены в объект управления доверием, то SecTrustEvaliate для получения сертификатов в списке поиска ключей (см. SectrustKeyChains) и в системном хранилище сертификатов якоря (см. SecTrustSetAnchorCertificates) . "
Однако, поскольку SecTrusteKeyChains () недоступен на iOS, неясно, будет ли эта функция также смотреть в ключевой матче приложения.
Решение 3
Eskimo1 из Apple Devorums ответил на это:
- Ищет ли SecTrusteValuate () для корневых сертификатов в ключевой матче приложения?
Не по умолчанию. Тем не менее, легко заставить его сделать это, вытащив сертификаты из вашей ключей (или откуда, где бы) и применив их к объекту SecTrust, используя SecTrustsetAnchorCertificatiations.
Sectrustevaluation / Will / найдите промежуточные сертификаты в вашей ключей.
Другие советы
Похоже, прошло много времени с тех пор, как вы опубликовали, поэтому я не уверен, что вам все еще нужен ответ. Если ваш вариант использования: «Меня поражают connection:didReceiveAuthenticationChallenge:
, и я хотел бы убедиться, что это точный Сертификат оценивается, тогда вы можете либо использовать встроенные методы доверия iOS, либо выполнять немного большей работы с помощью API-интерфейсов Foundation: (Обратите внимание, что Sectrustevaulate здесь не называется конкретно, но его можно добавить довольно легко)
#import <Security/Security.h>
#import <CommonCrypto/CommonDigest.h>
Оттуда вы можете перевернуть полный массив сердечков и сравнить его с чем -то вроде SHA1 Ссылки на доверие сервера Challenge:
// 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
Это написано в доке сейчас:
ПРИМЕЧАНИЕ. Хотя эта функция ищет ключевую матч пользователя (или ключевой матч приложений в iOS) для промежуточных сертификатов, она не ищет эти ключ для сертификатов Anchor (Root). Чтобы добавить сертификат привязки, вы должны позвонить в SectrustShateNchorCertificates.
Источник: Сектростеуставатная документация