Domanda

La documentazione dire: “Se non tutti i certificati necessari per verificare il certificato foglia sono comprese nell'oggetto gestione fiduciaria, le ricerche poi SecTrustEvaluate per i certificati nell'elenco di ricerca portachiavi (vedi SecTrustSetKeychains) e nel negozio del sistema di certificati di ancoraggio ( vedi SecTrustSetAnchorCertificates) “.

Tuttavia, poiché SecTrustSetKeychains () non è disponibile su iOS, non è chiaro se questa funzione sarà anche guardare nel portachiavi dell'applicazione.

È stato utile?

Soluzione 3

eskimo1 da Apple Devforums risposto questo modo:

  
      
  1. non SecTrustEvaluate () look per i certificati radice nel   portachiavi applicazione?
  2.   

Non per impostazione predefinita. Tuttavia, è facile per fargli fare questo ottenendo i certificati dal vostro portachiavi (o ovunque) e la loro applicazione all'oggetto SecTrust utilizzando SecTrustSetAnchorCertificates.

SecTrustEvaluation / vi / trovare i certificati intermedi nel vostro portachiavi.

Altri suggerimenti

Sembra come se fosse stato un po 'che hai postato, quindi non sono sicuro se hai ancora bisogno di una risposta. Se il vostro caso d'uso è "Sto essere colpiti con connection:didReceiveAuthenticationChallenge:, e mi piacerebbe fare in modo che esattamente certificato è in corso di valutazione, allora è possibile utilizzare iOS built-in metodi di fiducia o di fare un 'più di lavoro tramite le API della Fondazione: (notare che SecTrustEvaulate non si chiede specificamente qui, ma potrebbe essere aggiunto in abbastanza facilmente)

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

Da lì, è possibile scorrere la gamma completa di certs, e confrontarlo con qualcosa come uno SHA1 di riferimento server di fiducia del sfida:

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

E 'scritto nel documento ora:

  

Nota: Anche se questa funzione ricerca portachiavi dell'utente (o l'applicazione portachiavi a iOS) per i certificati intermedi, che non si cercano quei portachiavi per ancoraggio (root) certificati. Per aggiungere un certificato di ancoraggio, è necessario chiamare SecTrustSetAnchorCertificates.

Fonte: documentazione SecTrustEvaluate

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top