In my iPhone app I\'m using an https
connection with a self-signed SSL
certificate to download sensible data (username and password) from a server.
The term you're looking for is SSL Pinning, where the app verifies that a known certificate or public key matches one presented by a remote server.
AFNetworking supports both pinning with certificates or public keys. You'll need to add the certificate(s) or public key(s) to your app's Bundle, and enable the feature by setting either the defaultSSLPinningMode property on AFHttpClient or the SSLPinningMode property on AFURLConnectionOperation
.
You can pin using AFSSLPinningModePublicKey
or AFSSLPinningModeCertificate
. AFSSLPinningModeCertificate
means that the server's certificate must exactly match one of those in the bundle.
AFSSLPinningModePublicKey
is more liberal and means that the server's certificate must match for any public key in the bundle, or any public key attached to certificates in the bundle.
There's an example of setting the pinning mode in the AppDotNet example.
To expand a bit on David's answer with respect to AFSSLPinningModePublicKey
versus AFSSLPinningModeCertificate
. Ideally, you would pin the public key and not the certificate. That's because some sites and services, like Google, rotate their certificates every 30 days or so. But they re-certify the same public key.
The certificates are rotated frequently to keep the size of the CRL small for mobile clients. But they re-certify the same public key (rather than creating a new one) to allow for key continuity testing.
Public key pinning is why tools like Certificate Patrol miss the mark. The certificate is expected to change; the public key is not.
Public key pinning is a lot like SSH's StrictHostKeyChecking
, if you are familiar with it.
OWASP has a write-up on it too at Certificate and Public Key Pinning.