2012-05-23 15 views
6

मैं NSURLConnection में स्वयं-हस्ताक्षरित प्रमाणपत्र स्वीकार करने की कोशिश कर रहा हूं, जैसा कि मेरे सामने है। पकड़ यह है कि मैं केवल उन गर्ट्स के श्वेतसूची से सीर्ट स्वीकार करना चाहता हूं जो मुझे विश्वास है। मैं एक प्रमाण को स्वीकार करने के तरीके को समझने के लिए बसूंगा।आईओएस में एक श्वेतसूची से मैं स्वयं हस्ताक्षरित सर्वर प्रमाणपत्र कैसे स्वीकार कर सकता हूं?

- (void)connection:(NSURLConnection *)connection willSendRequestForAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge { 
    if ([challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust]) { 
     NSString *thePath = [[NSBundle mainBundle] pathForResource:@"trusted" ofType:@"der"]; 
     NSData *certData = [[NSData alloc] initWithContentsOfFile:thePath]; 
     CFDataRef myCertData = (__bridge_retained CFDataRef)certData; 
     SecCertificateRef myCert = SecCertificateCreateWithData(NULL, myCertData); 
     SecPolicyRef myPolicy = SecPolicyCreateBasicX509(); 
     SecCertificateRef certArray[1] = { myCert }; 
     CFArrayRef myCerts = CFArrayCreate(NULL, (void *)certArray, 1, NULL); 
     SecTrustRef myTrust; 
     OSStatus status = SecTrustCreateWithCertificates(myCerts, myPolicy, &myTrust); 

     SecTrustResultType trustResult; 
     if (status == noErr) { 
      status = SecTrustEvaluate(myTrust, &trustResult); 
     } 
     BOOL trusted = NO; 

     if (trustResult == kSecTrustResultUnspecified) { 
      // I never get here. Instead, trustResult is always kSecTrustResultRecoverableTrustFailure 
      trusted = YES; 
     } 

     if (trusted) { 
      [challenge.sender useCredential:[NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust] 
       forAuthenticationChallenge:challenge]; 
     } else { 
      [challenge.sender performDefaultHandlingForAuthenticationChallenge:challenge]; 
     } 
     CFRelease(myTrust); 
     CFRelease(myCerts); 
     CFRelease(myPolicy); 
     CFRelease(myCert); 
     CFRelease(myCertData); 
    } else { 
     [challenge.sender performDefaultHandlingForAuthenticationChallenge:challenge]; 
    } 
} 

आप टिप्पणी में देख सकते हैं, मैं वास्तव में कभी kSecTrustResultUnspecified है, जो है जो मैं प्राप्त करने की उम्मीद मिलता है: यहाँ कोड मैं अपने NSURLConnectionDelegate में अब तक मिल गया है है। मैंने सत्यापित किया कि मेरा प्रमाणपत्र सही है, और सही प्रारूप (डीईआर) में।

उत्तर

14

ठीक है, इसे समझ लिया। यह पता चला है कि आपको केवल सर्वर ट्रस्ट की जांच करने की आवश्यकता है, और वास्तव में प्रमाण डेटा का उपयोग करें।

- (void)connection:(NSURLConnection *)connection willSendRequestForAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge { 
    BOOL trusted = NO; 
    if ([challenge.protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodServerTrust]) { 
     NSString *thePath = [[NSBundle mainBundle] pathForResource:@"trusted" ofType:@"der"]; 
     NSData *certData = [[NSData alloc] initWithContentsOfFile:thePath]; 
     CFDataRef certDataRef = (__bridge_retained CFDataRef)certData; 
     SecCertificateRef cert = SecCertificateCreateWithData(NULL, certDataRef); 
     SecPolicyRef policyRef = SecPolicyCreateBasicX509(); 
     SecCertificateRef certArray[1] = { cert }; 
     CFArrayRef certArrayRef = CFArrayCreate(NULL, (void *)certArray, 1, NULL); 
     SecTrustRef serverTrust = challenge.protectionSpace.serverTrust; 
     SecTrustSetAnchorCertificates(serverTrust, certArrayRef); 
     SecTrustResultType trustResult; 
     SecTrustEvaluate(serverTrust, &trustResult); 
     trusted = (trustResult == kSecTrustResultUnspecified); 
     CFRelease(certArrayRef); 
     CFRelease(policyRef); 
     CFRelease(cert); 
     CFRelease(certDataRef); 
    } 
    if (trusted) { 
     [challenge.sender useCredential:[NSURLCredential credentialForTrust:challenge.protectionSpace.serverTrust] forAuthenticationChallenge:challenge]; 
    } else { 
     [challenge.sender performDefaultHandlingForAuthenticationChallenge:challenge]; 
    } 
} 
+0

आपको 'trust.der' फ़ाइल कैसे मिलती है? – Hlung

+0

आप एक बनाने के लिए ऑनलाइन एक ट्यूटोरियल देख सकते हैं, और उसके बाद इसे अपने ऐप से पैकेज कर सकते हैं। Google बाकी के साथ मदद करने में सक्षम होना चाहिए। –

+0

मैं सिर्फ उत्सुक हूं कि Google क्रोम की तरह, एक ऐप के अंदर ही इसे उत्पन्न करने के लिए एक तरीका हो सकता है। धन्यवाद बीटीडब्ल्यू। – Hlung

संबंधित मुद्दे