Question

Les documents disent: « Si tous les certificats nécessaires pour vérifier le certificat de feuille sont inclus dans l'objet de gestion de la confiance, puis les recherches SecTrustEvaluate de certificats dans la liste de recherche de porte-clés (voir SecTrustSetKeychains) et dans le magasin de certificats d'ancrage du système ( voir SecTrustSetAnchorCertificates). »

Toutefois, étant donné SecTrustSetKeychains () ne sont pas disponibles sur iOS, il ne sait pas si cette fonction se penchera également sur le porte-clés de l'application.

Était-ce utile?

La solution 3

eskimo1 d'Apple Devforums a répondu à cette façon:

  
      
  1. Est-ce regard SecTrustEvaluate () pour les certificats racine dans la   porte-clés d'application?
  2.   

Non par défaut. Cependant, il est facile de le faire faire en obtenant les certificats de votre trousseau (ou peu importe où) et de les appliquer à l'objet SecTrust en utilisant SecTrustSetAnchorCertificates.

SecTrustEvaluation / va / trouver des certificats intermédiaires dans votre trousseau.

Autres conseils

On dirait qu'il a été un moment que vous avez publié, donc je ne sais pas si vous avez encore la réponse. Si votre cas d'utilisation est « Je suis d'être frappé avec connection:didReceiveAuthenticationChallenge:, et je voudrais vous assurer que exact certificat est en cours d'évaluation, alors vous pouvez utiliser iOS intégré dans les méthodes de confiance ou faire peu plus de travail via les API Foundation: (notez que SecTrustEvaulate n'est pas appelé spécifiquement ici, mais il pourrait être ajouté assez facilement)

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

A partir de là, vous pouvez itérer la gamme complète de certs, et le comparer à quelque chose comme un SHA1 de référence de confiance du serveur du défi:

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

Il est écrit dans le doc maintenant:

  

Note: Bien que cette fonction recherche porte-clés de l'utilisateur (ou l'application Trousseau dans iOS) pour les certificats intermédiaires, il ne recherche pas les porte-clés pour les certificats d'ancrage (root). Pour ajouter un certificat d'ancrage, vous devez appeler SecTrustSetAnchorCertificates.

Source: documentation SecTrustEvaluate

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top