2013-05-22 28 views
6

Uygulamamın güvenliğini artırmak ve kullanıcıyı MITM saldırılarına karşı korumak için, this post içeriğinin ardından kendinden imzalı sertifikamla SSL sabitleme yapmaya çalışıyorum.SSL iOS'ta sabitleme

Bu yüzden, sunucudan aldığım sertifikayı uygulamada bir paketle karşılaştırmak için aşağıdaki kodu kullanıyorum. Benim kod ve ben bağlantılı blog yazısı biri arasında farklı olan

- (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]; 
    } 
} 

tek şey ismi ve sertifikamı temsil kaynağın uzantısı (.crt .cer) ve iki NSLogs ekledim Bu problemin ne olduğunu göstermek için daha sonra işe yarayacak.

bu kod bu çıktıyı almak yürütüldüğünde Aslında:

verinin uzunluğu farklıdır ve bu yüzden de sabitlemeyi arızalandığı için
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 

Açıkçası Yerel ve Uzaktan sertifikaları arasındaki karşılaştırma başarısız olur.

Bu neden oluyor ve bu sorunu nasıl çözebilirim?

+1

İade edilen sertifika verilerini bir dosyaya kaydetmeyi ve kullanmayı mı düşündünüz? Aksi takdirde, veriler üzerinde bir fark yapın ve neyin farklı olduğunu görün. –

+0

Hayır Bunu düşünmedim! İyi fikir, hemen deneyeceğim! – BigLex

+0

Eğer Alamofire kullanıyorsanız, bu http://jayprakashdubey.blogspot.in/2017/07/ssl-pinning-in-ios-swift-code.html adresine bakın. –

cevap

5

Aynı sorunu yaşadım. Sorun muhtemelen .crt dosyanızı doğru biçime dönüştürmediğiniz içindir. iOS & OSX, .der biçiminde olması için sertifikanızı bekliyor. Dönüştürmek için openssl kullanmanız gerekir. Here, bu konuda çok yararlı bir makaledir. Kamu sertifikam bir Apache sunucusundan geldi (Sizinki de yaptığınızı farz ediyorum). Openssl belgelerine baktıktan sonra bunu nasıl çalıştıracağımı anlayabildim.

1) Terminali açın ve dizininizi .crt konumunuza değiştirin.

2) Bu komutu yürütün:

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

Bu 'your_output_file.der' adlı bir çıkış dosyası oluşturur. XCode projeye bu aktarmak ve NSURLConnectionDelegate uygulamasının

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

yönteminde bunu başvurmalıdır.

Umarım bu yardımcı olur!