34 votes

Utiliser un certificat ssl auto-signé dans une application iphone

Je m'excuse par avance pour cette longue question. 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 sur mon ordinateur sans problème. Il s'agit d'un fichier .p12 qui nécessite un mot de passe pour être installé. Si ce certificat n'est pas installé, toutes les demandes adressées au serveur renvoient un message 403.

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

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

J'utilise ASIHTTPRequest pour toutes les communications avec le service REST depuis mon application. Chaque requête est une sous-classe de ASIHTTPRequest. La première chose que j'ai trouvée à faire est d'appeler [self setValidatesSecureCertificate:NO]; pour qu'il tente même la connexion SSL avec le serveur. Si je ne fais que ça, le service me renvoie des codes d'erreur 403.

Maintenant, je n'arrive pas à comprendre comment faire en sorte que la demande utilise le certificat. J'ai essayé d'exporter les trois éléments sous forme de fichiers .cer séparés, de les inclure dans le projet et de les ajouter à la demande à l'aide du 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]];

Bien que le code s'exécute sans problème avec cette approche, je reçois 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 retourne nil.

J'admets que je ne sais pas vraiment ce que je fais ici. Tout cela me dépasse un peu et toute aide que vous pourriez m'apporter serait grandement appréciée.

29voto

Jose Ibanez Points 1767

OK, j'ai compris. J'étais en quelque sorte en train d'aboyer sur le mauvais arbre.

L'information la plus importante que j'ai trouvée se trouvait dans la documentation d'Apple pour Guide de programmation des services de certificats, de clés et de confiance en particulier, la page "Tasks for iOS". Celle-ci explique en détail comment extraire l'identité de sécurité du fichier .p12 et comment ajouter une exception de confiance.

La dernière pièce du puzzle se trouvait dans la documentation de ASIHTTPRequest sur Support des certificats clients . En utilisant l'identité que j'ai extraite directement du fichier p12, j'ai pu la transmettre à la demande et obtenir une authentification correcte.

J'espère que cela aidera toute autre personne devant mettre en œuvre une fonction similaire.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X