SecTrustEvaluate retourne toujours kSecTrustResultRecoverableTrustFailure avec SecPolicyCreateSSL
Mon application tente d'évaluer un serveur de certificat de confiance d'un certificat auto-signé. Cela fonctionne bien avec SecPolicyCreateBasicX509 mais ne fonctionne pas pour SecPolicyCreateSSL
Voici mon code:
if (challenge.protectionSpace.authenticationMethod == NSURLAuthenticationMethodServerTrust) {
//create trust from protection space
SecTrustRef trustRef;
int trustCertificateCount = SecTrustGetCertificateCount(challenge.protectionSpace.serverTrust);
NSMutableArray* trustCertificates = [[NSMutableArray alloc] initWithCapacity:trustCertificateCount];
for (int i = 0; i < trustCertificateCount; i++) {
SecCertificateRef trustCertificate = SecTrustGetCertificateAtIndex(challenge.protectionSpace.serverTrust, i);
[trustCertificates addObject:(id) trustCertificate];
}
//set evaluation policy
SecPolicyRef policyRef;
//policyRef = SecPolicyCreateBasicX509(); this is working
policyRef = SecPolicyCreateSSL(NO, (CFStringRef)
SecTrustCreateWithCertificates((CFArrayRef) trustCertificates, policyRef, &trustRef);
[trustCertificates release];
//load known certificates from keychain and set as anchor certificates
NSMutableDictionary* secItemCopyCertificatesParams = [[NSMutableDictionary alloc] init];
[secItemCopyCertificatesParams setObject:(id)kSecClassCertificate forKey:(id)kSecClass];
[secItemCopyCertificatesParams setObject:@"Server_Cert_Label" forKey:(id)kSecAttrLabel];
[secItemCopyCertificatesParams setObject:(id)kCFBooleanTrue forKey:(id)kSecReturnRef];
[secItemCopyCertificatesParams setObject:(id)kSecMatchLimitAll forKey:(id)kSecMatchLimit];
CFArrayRef certificates;
certificates = nil;
SecItemCopyMatching((CFDictionaryRef) secItemCopyCertificatesParams, (CFTypeRef*) &certificates);
if (certificates != nil && CFGetTypeID(certificates) == CFArrayGetTypeID()) {
SecTrustSetAnchorCertificates(trustRef, certificates);
SecTrustSetAnchorCertificatesOnly(trustRef, NO);
}
SecTrustResultType result;
OSStatus trustEvalStatus = SecTrustEvaluate(trustRef, &result);
if (trustEvalStatus == errSecSuccess) {
if (result == kSecTrustResultConfirm || result == kSecTrustResultProceed || result == kSecTrustResultUnspecified) {
//evaluation OK
[challenge.sender useCredential:[NSURLCredential credentialForTrust: challenge.protectionSpace.serverTrust] forAuthenticationChallenge:challenge];
} else {
//evaluation failed
//ask user to add certificate to keychain
} else {
//evaluation failed - cancel authentication
[[challenge sender] cancelAuthenticationChallenge:challenge];
}
}
Après beaucoup de recherches, j'ai déjà fait des changements pour le certificat auto-signé par l'ajout de l'extension comme mentionné dans ce post: Incapable de faire confiance à un certificat auto-signé sur iphone
Quelqu'un aurait-il une autre astuce de ce que pourrait être absent ici?
OriginalL'auteur Matoz | 2011-10-26
Vous devez vous connecter pour publier un commentaire.
Après beaucoup d'essais, j'ai travaillé sur ce problème. La suite a été changé.
La politique est définie sur NON pour le serveur d'évaluation. Cela signifie que le certificat est vérifiée pour l'authentification du client. Évidemment, le certificat du serveur n'aura pas cette! Réglage de ce paramètre sur OUI effectivement vérifier si
extendedKeyUsage
est fixé àserverAuth
pour le certificat de serveur.SecTrustSetAnchorCertificates
etSecTrustSetAnchorCertificatesOnly
doit toujours être appelée avant d'évaluation et non pas seulement si vous fournissez votre propre point d'ancrage des certificats. Vous devez appeler cela avec un tableau vide, sinon le système d'ancrage des certificats ne sont pas utilisés à des fins d'évaluation. Même installé les certificats racine de confiance de MDM sont travail alors.Voici un exemple de travail basé sur le premier code:
Espère que cela aidera quelqu'un.
kSecTrustResultConfirm
est obsolète à partir de iOS7.OriginalL'auteur Matoz
Il peut être un serveur de problème de certificat....
Vérifier ici, j'ai résolu mon kSecTrustResultRecoverableTrustFailure problème, en ajoutant
subjectAltName = DNS:example.com
dans openssl fichier de config, plus précisément dans la génération de clés de serveur...Si vous n'êtes pas à l'aide d'openssl pour générer, je suis désolé mais je peux vous aider.. de toute façon si vous voulez utiliser openssl, ici est un bon tutoriel pour générer ces clés et signe ensuite avec votre propre autorité de certification racine.
De ce tutoriel, je viens de changer mon openssl fichier de configuration de serveur:
Espère que cela aide !
OriginalL'auteur gwdp