2016-12-21 21 views
6

tôi bên dưới mã cho giấy chứng nhận pinning in AndroidCertificate ghim trong Xcode

CertificatePinner certificatePinner = new CertificatePinner.Builder() 
.add("publicobject.com", "sha1/DmxUShsZuNiqPQsX2Oi9uv2sCnw=") 
.add("publicobject.com", "sha1/SXxoaOSEzPC6BgGmxAt/EAcsajw=") 
.add("publicobject.com", "sha1/blhOM3W9V/bVQhsWAcLYwPU6n24=") 
.add("publicobject.com", "sha1/T5x9IXmcrQ7YuQxXnxoCmeeQ84c=") 
.build(); 

Làm thế nào để tôi đạt được cùng một nhiệm vụ trong IOS sử dụng phương pháp NSURLSession?

Got một số mã tham khảo ở đây

- (void)connection:(NSURLConnection *)connection willSendRequestForAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge 
{ 
SecTrustRef serverTrust = challenge.protectionSpace.serverTrust; 
SecCertificateRef certificate = SecTrustGetCertificateAtIndex(serverTrust, 0); 
NSData *remoteCertificateData = CFBridgingRelease(SecCertificateCopyData(certificate)); 
NSString *cerPath = [[NSBundle mainBundle] pathForResource:@"MyLocalCertificate" ofType:@"cer"]; 
NSData *localCertData = [NSData dataWithContentsOfFile:cerPath]; 
if ([remoteCertificateData isEqualToData:localCertData]) { 
NSURLCredential *credential = [NSURLCredential credentialForTrust:serverTrust]; 
[[challenge sender] useCredential:credential forAuthenticationChallenge:challenge]; 
} 
else { 
[[challenge sender] cancelAuthenticationChallenge:challenge]; 
} 

EDIT PHẦN

tôi dưới đây giải pháp, trong đó chức năng đại biểu được gọi là tự động trong NSURLSession, bất cứ ai có thể giải thích như thế nào nó sẽ làm việc? CSONG Cần gửi chứng chỉ số nhân như thế nào để tôi làm điều đó?

(void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition, NSURLCredential * _Nullable))completionHandler 
{ 
    NSString *authMethod = [[challenge protectionSpace] authenticationMethod]; 

    if ([authMethod isEqualToString:NSURLAuthenticationMethodServerTrust]) { 

     NSURLCredential *credential = [NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust]; 
     completionHandler(NSURLSessionAuthChallengeUseCredential,credential); 
    } else { 
     SecTrustRef serverTrust = challenge.protectionSpace.serverTrust; 
     SecCertificateRef certificate = SecTrustGetCertificateAtIndex(serverTrust, 0); 
     NSData *remoteCertificateData = CFBridgingRelease(SecCertificateCopyData(certificate)); 
     NSString *cerPath = [[NSBundle mainBundle] pathForResource:@"MyLocalCertificate" ofType:@"cer"]; 
     NSData *localCertData = [NSData dataWithContentsOfFile:cerPath]; 
     NSURLCredential *credential; 

     if ([remoteCertificateData isEqualToData:localCertData]) { 
      credential = [NSURLCredential credentialForTrust:serverTrust]; 
      [[challenge sender] useCredential:credential forAuthenticationChallenge:challenge]; 
     } 
     else { 
      [[challenge sender] cancelAuthenticationChallenge:challenge]; 
     } 



     completionHandler(NSURLSessionAuthChallengeUseCredential, credential); 
     NSLog(@"Finished Challenge"); 
    } 
} 
+0

Tôi nghĩ rằng nhiều nhà phát triển iOS không quen thuộc với Android. – KudoCC

+0

tôi cũng vậy ...: D lol cần phải tạo mã tương tự cho IOS theo yêu cầu của khách hàng – iphonemaclover

+1

Bạn đã xem Alamofire - xử lý ghim https://github.com/Alamofire/Alamofire – Flexicoder

Trả lời

1

Các nếu giấy chứng nhận bỏ qua khối ghim nếu phương pháp xác thực là NSURLAuthenticationMethodServerTrust. Tôi không hoàn toàn chắc chắn lý do tại sao bạn sẽ làm điều đó --- bạn sẽ phải nhìn vào nguồn nơi bạn có đoạn mã này và xem những yêu cầu của nó là gì.

Nếu phương thức xác thực là bất cứ điều gì khác, khối khác thực hiện chứng chỉ ghim.

Biến số serverTrust được gửi đến trạng thái giao dịch SSL từ máy chủ. Điều chính ở đây là nó có một chuỗi các chứng chỉ xác thực máy chủ. Trong dòng tiếp theo, certificate được đặt thành chứng chỉ lá trong chuỗi, nghĩa là chứng chỉ của máy chủ.

remoteCertificateData về bản chất là một đốm màu nhị phân lớn thể hiện thông tin trong chứng chỉ. Cuộc gọi đến CFBridgingRelease là cần thiết để quản lý bộ nhớ (tất cả các chức năng CFxxx là các hàm C/C++, không phải Mục tiêu-C và quản lý bộ nhớ phức tạp hơn một chút so với bình thường).

localCertData là một đốm màu nhị phân của thông tin trong bản sao chứng chỉ cục bộ. Lưu ý rằng các ứng dụng iOS (nhiều hay ít) tập hợp các tệp bao gồm tệp thực thi cũng như các tài nguyên khác nhau, v.v. Là một phần của quá trình xây dựng, bạn sẽ sắp xếp một bản sao chứng chỉ của máy chủ được bao gồm trong bộ sưu tập thes (NSBundle)) của tệp. Biến số cerPath được đặt thành đường dẫn tệp của bản sao chứng chỉ cục bộ.

Cuối cùng, chúng tôi kiểm tra xem hai đốm màu nhị phân có bằng nhau hay không. Nếu không, thì chứng chỉ từ máy chủ là không có thật và chúng tôi không tiếp tục yêu cầu.

Tôi không hoàn toàn chắc chắn ý bạn là gì "Cần gửi chứng chỉ nhân". Đánh giá từ mã Java mà bạn tham chiếu, tôi giả sử ý của bạn là bạn muốn so sánh chứng chỉ máy chủ với nhiều chứng chỉ cục bộ. Trong trường hợp đó, một cái gì đó (gần như) như sau (lưu ý: mã chưa được kiểm tra):

SecTrustRef serverTrust = challenge.protectionSpace.serverTrust; 
    SecCertificateRef certificate = SecTrustGetCertificateAtIndex(serverTrust, 0); 
    NSData *remoteCertificateData = CFBridgingRelease(SecCertificateCopyData(certificate)); 

    BOOL match = NO; 
    NSURLCredential *credential; 

    for (NSString *path in [[NSBundle mainBundle] pathsForResourcesOfType:@"cer" inDirectory:@"."]) { 
      NSData *localCertData = [NSData dataWithContentsOfFile:path]; 

      if ([remoteCertificateData isEqualToData:localCertData]) { 
       credential = [NSURLCredential credentialForTrust:serverTrust]; 
       match = YES; 
       break; 
      } 
    }  

    if (match) { 
     [[challenge sender] useCredential:credential forAuthenticationChallenge:challenge]; 
    } else { 
     [[challenge sender] cancelAuthenticationChallenge:challenge]; 
    } 

    completionHandler(NSURLSessionAuthChallengeUseCredential, credential); 
    NSLog(@"Finished Challenge"); 
Các vấn đề liên quan