15 votes

SSL Pinning avec AFNetworking

Dans mon application, j'utilise https et un certificat SSL auto-signé pour sécuriser la connexion entre mon client et le serveur.

J'ai essayé de faire en sorte que la bibliothèque AFNetworking fasse un Pinning SSL sur une copie de mon certificat inclus dans l'application.

Dans le AFURLConnectionOperation tête, j'ai défini les deux :

#define _AFNETWORKING_ALLOW_INVALID_SSL_CERTIFICATES_ =1
#define _AFNETWORKING_PIN_SSL_CERTIFICATES_ =1

Et avant d'appeler le start sur mon AFJSONRequestOperation J'ai mis le SSLPinningMode à la propriété AFSSLPinningModeCertificate .

Mais lorsque j'essaie d'effectuer une requête JSON, je continue à obtenir l'erreur suivante :

Error Domain=NSURLErrorDomain Code=-1012 "The operation couldn’t be completed. 
(NSURLErrorDomain error -1012.)" UserInfo=0x758f120 
{NSErrorFailingURLKey=https://mydomain.com,
NSErrorFailingURLStringKey=https://mydomain.com}

Dans le AFURLConnectionOperation En-tête J'ai lu que l'épinglage SSL fonctionne avec les certificats .cer mais dans mon serveur Web OS X auto-hébergé, j'ai un certificat .crt.

Est-ce là le problème ? Existe-t-il un moyen de faire fonctionner AFNetworking avec .crt ?

Sur une machine Windows, j'ai converti mon fichier .crt en .cer et j'ai essayé de l'intégrer à mon application, mais j'obtiens toujours la même erreur. Dois-je essayer de remplacer le fichier .crt par le nouveau fichier .cer, même du côté du serveur ?

20voto

orange80 Points 5822

Je l'ai fait fonctionner.

Je me suis retrouvé dans la situation où j'avais créé un certificat auto-signé pour accéder à mon propre serveur API depuis mon application iOS. J'ai créé mon certificat avec OpenSSL. Lorsque j'ai fini de le créer, j'avais plusieurs fichiers, dont l'un était "server.crt". Au départ, j'ai essayé de le renommer en "server.cer" et d'utiliser "AFSSLPinningModeCertificate" pour mes objets AFURLConnectionOperation. Cela n'a pas fonctionné, et j'ai remarqué que l'exemple utilise "AFSSLPinningModePublicKey", alors j'ai essayé, toujours sans succès.

J'ai donc comparé mon fichier (qui était le fichier ".crt" renommé) au sien.
J'ai remarqué que "server.crt" était encodé en base64, et comme ceci :

-----BEGIN CERTIFICATE-----
394230AFDFD... 
-----END CERTIFICATE-----

J'ai remarqué dans l'exemple de Mattt dans AFNetworking que le fichier "adn.cer" qu'il utilise n'est pas codé en base64. Il s'agit simplement d'octets bruts. Donc, j'ai fait ceci :

$ base64 -D -i ./server.crt -o ./server.cer

J'ai réglé mon AFURLConnectionOperation sur AFSSLPinningModePublicKey.
Je l'ai remis dans le projet et j'ai fait un nettoyage et une construction de mon projet iOS, et tout a fonctionné correctement.

J'espère que cela vous aidera !

Vous remarquerez que Xcode affichera des informations pour votre clé ".crt" ou ".cer", qu'il s'agisse de la clé base64 ou de la clé brute, donc ne laissez pas cela vous troubler. Vous devriez être capable de voir les données du certificat dans les deux cas, c'est juste que AF n'acceptera que le certificat brut (non-base64).

UPDATE :
Si vous avez des problèmes avec la base64, voici ce qui fonctionne pour moi sur OS X en utilisant OpenSSL :

$ openssl base64 -d -in ./server.crt -out ./server.cer

3voto

junjie Points 770

Si vous utilisez AFNetworking 2.x, que vous utilisez le .cer correct mais que vous recevez toujours le code d'erreur -1012 lors de vos appels, vous devez désactiver la fonction validatesCertificateChain :

AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModePublicKey];
securityPolicy.validatesCertificateChain = NO;

ou vous pouvez passer le tout dans la chaîne de certificat entière en pinnedCertificates .

0voto

Xeieshan Points 986

Votre certificat doit avoir l'extension cer et non crt et doit être au format .der. Ajoutez le fichier de sortie à votre projet Xcode.

Vous pouvez utiliser la commande suivante :

openssl x509 -in your.crt -out certificate_cer.cer -outform der

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