Cómo comparar certificates SSL con AFNetworking

En mi aplicación de iPhone, estoy usando una connection https con un certificate SSL autofirmado para download datos sensibles (nombre de usuario y contraseña) de un server.

Esta aplicación es solo para uso privado, no está destinada a la producción.

Estoy usando AFNetworking para administrar la connection https pero, dado que mi certificate no está firmado por una CA, para hacerlo funcionar, tuve que agregar lo siguiente al encabezado de la class AFURLConnectionOperation :

 #define _AFNETWORKING_ALLOW_INVALID_SSL_CERTIFICATES_ 1 

Pero con esto mi aplicación permitirá cualquier certificate.

¿Hay alguna forma de permitir que solo el certificate de mi server lo agrupe en la aplicación y lo compare con el certificate proporcionado por el server en la connection https? Y si fuera posible, ¿habría alguna ventaja significativa en términos de security?

Soy muy nuevo en security y estoy algo confundido.

El término que está buscando es SSL Pinning , donde la aplicación verifica que un certificate conocido o key pública coincida con uno presentado por un server remoto.

AFNetworking admite tanto el establecimiento con certificates o keys públicas. Deberá agregar los certificates o las keys públicas al package de la aplicación y habilitar la característica estableciendo la propiedad defaultSSLPinningMode en AFHttpClient o la propiedad AFURLConnectionOperation en AFURLConnectionOperation .

Puede AFSSLPinningModePublicKey utilizando AFSSLPinningModePublicKey o AFSSLPinningModeCertificate . AFSSLPinningModeCertificate significa que el certificate del server debe coincidir exactamente con uno de los packages.

AFSSLPinningModePublicKey es más liberal y significa que el certificate del server debe coincidir con cualquier key pública del package o cualquier key pública asociada a los certificates en el package.

Hay un ejemplo de cómo configurar el modo de fijación en el ejemplo de AppDotNet.

Para expandir un poco la respuesta de David con respecto a AFSSLPinningModePublicKey versus AFSSLPinningModeCertificate . Idealmente, pincharías la key pública y no el certificate. Esto se debe a que algunos sitios y services, como Google, rotan sus certificates cada 30 días aproximadamente. Pero ellos vuelven a certificar la misma key pública.

Los certificates se rotan con frecuencia para mantener el tamaño de la CRL pequeña para los clientes mobilees. Pero vuelven a certificar la misma key pública (en lugar de crear una nueva) para permitir las testings de continuidad key.

La fijación de keys públicas es la razón por la que herramientas como la Patrulla de Certificados pierden la marca. Se espera que el certificate cambie; la key pública no lo es.

La fijación de key pública se parece mucho a la de StrictHostKeyChecking de SSH, si está familiarizada con ella.

OWASP también tiene un informe sobre esto en el certificate y la fijación de key pública .