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.