2013-05-22 16 views
6

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?

+1

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. –

+0

No, non ci ho pensato! Buona idea, proverò subito! – BigLex

+0

Se si utilizza Alamofire, controllare questo http://jayprakashdubey.blogspot.in/2017/07/ssl-pinning-in-ios-swift-code.html –

risposta

5

Ho avuto lo stesso problema. Il problema è probabilmente dovuto al fatto che il file .crt non è stato convertito nel formato corretto. iOS & OSX sta cercando il tuo certificato nel formato .der. Devi usare openssl per convertirlo. Here è un articolo molto utile su questo argomento. Il mio certificato pubblico proveniva da un server Apache (presumo che anche il tuo abbia funzionato). Dopo aver esaminato la documentazione di openssl, sono riuscito a capire come farlo funzionare.

1) Aprire il Terminale e cambiare la directory nella posizione del file .crt.

2) Eseguire questo comando:

openssl x509 -in your_cert.crt -outform der -out your_output_name.der 

Questo creerà un file di output chiamato 'your_output_file.der'. È necessario importare questo nel progetto Xcode e fare riferimento a esso nel metodo

- (void)connection:(NSURLConnection *)connection willSendRequestForAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge 

della vostra NSURLConnectionDelegate implementazione.

Spero che questo aiuti!