Per migliorare la sicurezza della mia app e proteggere l'utente dagli attacchi MITM, sto provando a eseguire il blocco SSL con il mio certificato autofirmato in seguito al contenuto di this post.Blocco SSL su iOS
Quindi sto usando il seguente codice per confrontare il certificato che ottengo dal server con quello incluso nell'app.
- (void)connection:(NSURLConnection *)connection willSendRequestForAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge
{
SecTrustRef serverTrust = challenge.protectionSpace.serverTrust;
SecCertificateRef certificate = SecTrustGetCertificateAtIndex(serverTrust, 0);
NSData *remoteCertificateData = CFBridgingRelease(SecCertificateCopyData(certificate));
NSLog(@"Remote Certificate Data Length: %d",[remoteCertificateData length]);
NSString *cerPath = [[NSBundle mainBundle] pathForResource:@"apache" ofType:@"crt"];
NSData *localCertData = [NSData dataWithContentsOfFile:cerPath];
NSLog(@"Local Certificate Data Length: %d",[localCertData length]);
if ([remoteCertificateData isEqualToData:localCertData]) {
NSURLCredential *credential = [NSURLCredential credentialForTrust:serverTrust];
[[challenge sender] useCredential:credential forAuthenticationChallenge:challenge];
}
else {
[[challenge sender] cancelAuthenticationChallenge:challenge];
}
}
Le uniche cose che sono diverse tra il mio codice e quello nel post del blog ho linkato sono il nome e l'estensione (cer a CRT) per la risorsa che rappresenta il mio certificato e le due NSLogs ho aggiunto che verrà a portata di mano più tardi per mostrare qual è il problema.
Infatti quando questo codice viene eseguito ottengo questo output:
2013-05-22 16:08:53.331 HTTPS Test[5379:c07] Remote Certificate Data Length: 880
2013-05-22 16:09:01.346 HTTPS Test[5379:c07] Local Certificate Data Length: 1249
Ovviamente il confronto tra il locale e certificati remota fallisce perché la lunghezza dei dati è diverso e così fallisce anche il pinning.
Perché ciò accade e come è possibile risolvere questo problema?
Hai considerato di salvare i dati del certificato restituito in un file e di utilizzarlo? Altrimenti, fai una diff sui dati e vedi cosa è diverso. –
No, non ci ho pensato! Buona idea, proverò subito! – BigLex
Se si utilizza Alamofire, controllare questo http://jayprakashdubey.blogspot.in/2017/07/ssl-pinning-in-ios-swift-code.html –