2016-12-21 16 views
6

में pinning मैं प्रमाणपत्र pinning in Androidप्रमाणपत्र 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(); 

कैसे मैं आईओएस में एक ही कार्य को प्राप्त NSURLSession विधि का उपयोग करते हैं के लिए नीचे दिए गए कोड मिल गया?

यहाँ कुछ संदर्भ कोड समझे

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

संपादित भाग

मैं समाधान है, जो प्रतिनिधि समारोह NSURLSession में स्वचालित रूप से कहा जाता है नीचे मिला है, किसी को भी यह कैसे काम करेगा व्याख्या कर सकते हैं? गुणक प्रमाण पत्र भेजने की भी आवश्यकता है मैं इसे कैसे कर सकता हूं?

(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

मुझे लगता है कि कई आईओएस डेवलपर एंड्रॉइड से परिचित नहीं हैं। – KudoCC

+0

मुझे भी ...: डी lol ग्राहक आवश्यकता – iphonemaclover

+1

आप Alamofire को देखा है के अनुसार आईओएस के लिए इसी तरह के कोड बनाया करने की जरूरत है - कि संभालती pinning https://github.com/Alamofire/Alamofire – Flexicoder

उत्तर

1

The Block स्किप के प्रमाण पत्र pinning अगर अगर प्रमाणीकरण विधि NSURLAuthenticationMethodServerTrust है। मुझे पूरा यकीन नहीं है कि आप ऐसा क्यों करेंगे --- आपको उस स्रोत को देखना होगा जहां आपको यह कोड स्निपेट मिला है और देखें कि इसकी क्या आवश्यकताएं हैं।

यदि प्रमाणीकरण विधि कुछ और है, तो अन्य ब्लॉक प्रमाणपत्र पिनिंग करता है।

परिवर्तनीय serverTrust सर्वर से SSL लेनदेन स्थिति को भेजा जाता है। यहां मुख्य बात यह है कि इसमें प्रमाणपत्रों की एक श्रृंखला है जो सर्वर को प्रमाणीकृत करती है। अगली पंक्ति में, certificate श्रृंखला में पत्ती प्रमाण पत्र पर सेट है, यानी सर्वर का प्रमाणपत्र।

remoteCertificateData अनिवार्य रूप से प्रमाण पत्र में जानकारी का प्रतिनिधित्व करने वाला एक बड़ा बाइनरी ब्लॉब है। CFBridgingRelease करने के लिए कॉल स्मृति प्रबंधन के लिए आवश्यक है (सभी CFxxx कार्यों C/C++ काम करता है, नहीं ऑब्जेक्टिव-सी हैं, और स्मृति प्रबंधन सामान्य से थोड़ा और अधिक जटिल है)।

localCertData प्रमाण पत्र की स्थानीय प्रति में जानकारी का एक बाइनरी ब्लॉब है। ध्यान दें कि iOS एप्लिकेशन (कम या ज्यादा) निर्माण प्रक्रिया के हिस्से के रूप निष्पादन सहित फ़ाइलों के साथ-साथ विभिन्न संसाधनों, आदि का एक संग्रह कर रहे हैं, आप सर्वर का सुरक्षा प्रमाणपत्र की एक प्रति के लिए व्यवस्था होगी एचटीएमएल संग्रह में शामिल किया जाना (NSBundle) फाइलों के। cerPath चर प्रमाणपत्र की स्थानीय प्रतिलिपि के फ़ाइल पथ पर सेट है।

अंत में, हम अगर दो द्विआधारी धब्बे बराबर हैं देखने के लिए जाँच। यदि नहीं, तो सर्वर से प्रमाण पत्र फर्जी है और हम अनुरोध के साथ आगे बढ़ते नहीं हैं।

मैं पूरी तरह से सुनिश्चित करें कि आप द्वारा क्या मतलब है नहीं कर रहा हूँ "गुणक प्रमाण पत्र भेजने की आवश्यकता है"। आपके द्वारा संदर्भित जावा कोड से निर्णय लेते हुए मैं मान रहा हूं कि आपका क्या मतलब है कि आप कई स्थानीय प्रमाणपत्रों के साथ सर्वर प्रमाणपत्र की तुलना करना चाहते हैं। उस स्थिति में, कुछ (मोटे तौर पर) निम्न की तरह (नोट: अनचाहे कोड):

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");