web-dev-qa-db-fra.com

Utiliser un certificat SSL auto-signé dans une application iPhone

Je m'excuse à l'avance pour cette question de longue haleine. J'ai des problèmes avec un certificat SSL auto-signé et je veux documenter tout ce que j'ai essayé jusqu'à présent.

Je travaille sur une application qui communique avec un service REST. Le serveur de test utilise un certificat ssl auto-signé que je peux installer sans problème sur mon ordinateur. C'est un fichier .p12 qui nécessite un mot de passe à installer. Sans ce certificat installé, toutes les demandes au serveur renvoient un 403.

Le .p12 installe trois éléments dans le trousseau, un "autorité de certification racine", un certificat "utilisateur de test" émis par l '"autorité de certification racine" et une clé privée associée au certificat "utilisateur de test".

J'ai installé ce certificat sur mon iPad en m'envoyant par e-mail le fichier .p12. J'ai tapé sur la pièce jointe, saisi le mot de passe et je peux maintenant accéder au site dans Safari. Malheureusement, en raison du sandboxing d'application, cela ne suffit pas pour que mon application communique avec le service REST.

J'utilise ASIHTTPRequest pour toutes les communications avec le service REST de mon application. Chaque demande est une sous-classe de ASIHTTPRequest. La première chose que j'ai trouvée que je devais faire était d'appeler [self setValidatesSecureCertificate:NO]; pour qu'il tente même la connexion SSL au serveur. Si c'est tout ce que je fais, je reçois 403 codes d'erreur en retour du service.

Maintenant, je n'arrive pas à comprendre comment obtenir la demande d'utilisation du certificat. J'ai essayé d'exporter les trois éléments en tant que fichier .cer séparé, en les incluant dans le projet et en les ajoutant à la demande en utilisant le code ci-dessous:

NSData *data = [NSData dataWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"cert" ofType:@"cer"]];
SecCertificateRef cert = SecCertificateCreateWithData(NULL, (CFDataRef)data);
...
[self setClientCertificates:[NSArray arrayWithObjects:(id)cert, ..., nil]];

Alors que le code s'exécute sans problème en utilisant cette approche, j'obtiens toujours l'erreur 403.

J'ai même essayé d'inclure le fichier .p12 dans mon application et de l'importer en utilisant le même code. Cela échoue car SecCertificateCreateWithData renvoie nil.

J'avoue que je ne sais pas vraiment ce que je fais ici. Tout cela est un peu au-dessus de ma tête et toute aide que quelqu'un pourrait me donner serait grandement appréciée.

34
Jose Ibanez

OK, je l'ai compris. J'étais en train d'aboyer le mauvais arbre.

Les informations les plus importantes que j'ai trouvées étaient dans la documentation d'Apple pour Guide de programmation des certificats, clés et services de confiance , en particulier, la page "Tâches pour iOS". Cela a détaillé comment extraire l'identité de sécurité du fichier .p12 et comment ajouter une exception d'approbation.

La dernière pièce du puzzle était dans la documentation d'ASIHTTPRequest sur Support de certificat client . En utilisant l'identité que j'ai extraite directement du fichier p12, j'ai pu transmettre cela à la demande et obtenir tout authentifié correctement.

J'espère que cela aide toute autre personne qui doit implémenter une fonctionnalité similaire.

29
Jose Ibanez