Pregunta

Los documentos dicen: “Si no todos los certificados necesarios para verificar el certificado de la hoja se incluyen en el objeto de gestión de la confianza, las búsquedas a continuación SecTrustEvaluate de certificados en la lista de búsqueda llavero (véase SecTrustSetKeychains) y en la tienda del sistema de certificados de anclaje ( ver SecTrustSetAnchorCertificates) “.

Sin embargo, desde SecTrustSetKeychains () no está disponible en iOS, no está claro si esta función también se verá en el llavero de la aplicación.

¿Fue útil?

Solución 3

eskimo1 de Apple Devforums respondió este modo:

  1. ¿El SecTrustEvaluate () mirada de certificados raíz en el llavero aplicación?

No por defecto. Sin embargo, es fácil de hacer que haga esto consiguiendo los certificados de su llavero (o de donde sea) y su aplicación al objeto SecTrust usando SecTrustSetAnchorCertificates.

SecTrustEvaluation / va / encontrar los certificados intermedios en su llavero.

Otros consejos

Parece que ha pasado un tiempo desde que envió así que no estoy seguro de si todavía necesita la respuesta. Si su caso de uso es "Estoy siendo golpeado con connection:didReceiveAuthenticationChallenge:, y me gustaría asegurarse de que exacta está siendo evaluado certificado, a continuación, puede utilizar cualquiera de iOS los métodos incorporados de confianza o hacer una poco más de trabajo a través de las API de la Fundación: (nota que SecTrustEvaulate no está siendo llamado específicamente aquí, pero podría ser añadido en bastante facilidad)

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

A partir de ahí, se puede recorrer toda la gama de los CERT, y compararlo con algo así como un SHA1 de referencia de confianza del servidor del reto:

// 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

Está escrito en el documento ahora:

Nota: Aunque esta función busca llavero del usuario (o la aplicación llavero en IOS) para los certificados intermedios, no qué la búsqueda de esos llaveros de anclaje certificados (root). Para agregar un certificado de anclaje, debe llamar SecTrustSetAnchorCertificates.

Fuente: documentación SecTrustEvaluate

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top