2012-01-25 10 views
6

हम एक HTTP स्ट्रीमिंग आईओएस ऐप विकसित कर रहे हैं जिसके लिए हमें एक सुरक्षित साइट से प्लेलिस्ट प्राप्त करने की आवश्यकता है। इस साइट के लिए हमें स्वयं हस्ताक्षरित SSL प्रमाणपत्र का उपयोग करके प्रमाणित करने की आवश्यकता है।एवीप्लेयर को SSL द्वारा सुरक्षित प्लेलिस्ट पुनर्प्राप्त करने दें कैसे?

प्राधिकरण चुनौती पर प्रतिक्रिया करने के लिए हम एक प्रतिनिधि के साथ NSURLConnection का उपयोग करने से पहले हम एक .p12 फ़ाइल से प्रमाण-पत्र पढ़ते हैं।

- (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge 
{ 
    [[challenge sender] useCredential: self.credentials forAuthenticationChallenge:challenge]; 
} 

- (BOOL)connection:(NSURLConnection *)connection canAuthenticateAgainstProtectionSpace:(NSURLProtectionSpace *)protectionSpace 
{ 
    return YES; 
} 

यूआरएल को यह प्रारंभिक कनेक्शन जहां हम के .m3u8 प्लेलिस्ट हो रही प्लेलिस्ट AVPlayer का उपयोग कर वापस खेलने में सक्षम हम के ऐसा करने से। समस्या यह है कि यह विधि केवल सिम्युलेटर में काम करती है।

नोट: हम डिवाइस पर NSURLConnection का उपयोग कर प्लेलिस्ट डाउनलोड करने में सक्षम हैं। इसका मतलब यह होना चाहिए कि AVPlayer किसी भी तरह से इस प्रारंभिक कनेक्शन के दौरान स्थापित ट्रस्ट का उपयोग जारी नहीं रख सकता है।

हमने किसी भी भाग्य के बिना [NSURLCredentialStorage sharedCredentialStorage] को प्रमाण-पत्र जोड़ने का भी प्रयास किया है।

NSURLProtectionSpace *protectionSpace = [[NSURLProtectionSpace alloc] 
             initWithHost:host 
             port:443 
             protocol:@"https" 
             realm:nil 
             authenticationMethod:NSURLAuthenticationMethodClientCertificate]; 



[[NSURLCredentialStorage sharedCredentialStorage] setDefaultCredential:creds 
                forProtectionSpace:protectionSpace]; 

    NSURLProtectionSpace *protectionSpace2 = [[NSURLProtectionSpace alloc] 
             initWithHost:host 
             port:443 
             protocol:@"https" 
             realm:nil 
             authenticationMethod:NSURLAuthenticationMethodServerTrust]; 



[[NSURLCredentialStorage sharedCredentialStorage] setDefaultCredential:creds 
                forProtectionSpace:protectionSpace2]; 

संपादित करें: this question के अनुसार: उपरोक्त विधि प्रमाणपत्र के साथ काम नहीं

नीचे उस के लिए हमारे बन्दूक दृष्टिकोण इस प्रकार है।

किसी भी संकेत के लिए कि यह डिवाइस पर क्यों काम नहीं करता है, या वैकल्पिक समाधान का स्वागत है!

+0

इस प्रश्न के मुताबिक: http://stackoverflow.com/questions/4164846/nsurlcredentialstorage-and-client-certificate- प्रमाणीकरण NSURLCredentialStorage प्रमाण पत्र के लिए काम नहीं करता है। मुझे लगता है कि अभी भी मामला है। – Nailer

उत्तर

6

आईओएस 6 से आगे AVAssetResourceLoader का उपयोग HTTPS सुरक्षित प्लेलिस्ट या कुंजी फ़ाइल को पुनर्प्राप्त करने के लिए किया जा सकता है।

एक AVAssetResourceLoader ऑब्जेक्ट एक AVURLASSet ऑब्जेक्ट से आपके द्वारा प्रदान किए जाने वाले प्रतिनिधि ऑब्जेक्ट के संसाधन संसाधनों को मध्यस्थ करता है। जब कोई अनुरोध आता है, तो संसाधन लोडर आपके प्रतिनिधि से पूछता है कि क्या वह अनुरोध को संभालने में सक्षम है और परिणाम को संपत्ति को वापस रिपोर्ट करता है।

कृपया नीचे नमूना कोड प्राप्त करें।

// AVURLAsset + Loader 
AVURLAsset  *asset   = [[AVURLAsset alloc] initWithURL:url options:nil]; 
AVPlayerItem *playerItem  = [AVPlayerItem playerItemWithAsset:asset]; 
AVAssetResourceLoader *loader = asset.resourceLoader; 
[loader setDelegate:self queue:dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)]; 

// AVPlayer 
AVPlayer  *avPlayer  = [AVPlayer playerWithPlayerItem:playerItem]; 

आप resourceLoader संभाल करने की आवश्यकता होगी: shouldWaitForLoadingOfRequestedResource: प्रतिनिधि विधि है जो जब एक प्रमाणीकरण की आवश्यकता नहीं है और आप सुरक्षित संसाधन के लिए अनुरोध करने के लिए उपयोग कर सकते हैं NSURLConnection बुलाया जाएगा।

(BOOL)resourceLoader:(AVAssetResourceLoader *)resourceLoader shouldWaitForLoadingOfRequestedResource:(AVAssetResourceLoadingRequest *)loadingRequest 
{ 

//Handle NSURLConnection to the SSL secured resource here 
    return YES; 
} 

आशा है कि इससे मदद मिलती है!

पीएस: CocoaHTTPServer का उपयोग कर प्रॉक्सी दृष्टिकोण अच्छी तरह से काम करता है लेकिन AVAssetResourceLoader का उपयोग करना एक और अधिक सुरुचिपूर्ण समाधान है।

+0

इस अद्यतन के लिए धन्यवाद! मैं लंबे समय से विभिन्न चरागाहों पर चले गए हैं, लेकिन यह हर किसी के लिए बहुत उपयोगी है। – Nailer

5

ऐसा लगता है कि जब तक ऐप्पल हमें यह नियंत्रित करने देता है कि AVRLlayonne एवीप्लेयर का उपयोग केवल एक ही जवाब का उपयोग करता है, तो एक HTTP लूपबैक सर्वर को लागू करना प्रतीत होता है।

एक अन्य विकल्प है कि कम से लूपबैक HTTP सर्वर और बिंदु ग्राहक वस्तुओं को लागू करने की है:

सेब प्रतिनिधि है कि हमारे समर्थन सवाल का जवाब के शब्दों में। ग्राहक HTTP का उपयोग कर सकते हैं (क्योंकि उनके अनुरोध डिवाइस को कभी भी बंद नहीं करते हैं), जबकि लूपबैक HTTP सर्वर स्वयं सर्वर से कनेक्ट करने के लिए HTTPS का उपयोग कर सकता है। दोबारा, यह आपको अंतर्निहित NSURLConnections तक पहुंच प्रदान करता है, जिससे आप कस्टम सर्वर ट्रस्ट मूल्यांकन कर सकते हैं।

UIWebView के साथ इस तकनीक का उपयोग करना मुश्किल नहीं होगा जब तक कि आप मूल सर्वर पर पूरी तरह से सामग्री को नियंत्रित नहीं करते हैं। यदि मूल सर्वर मनमाने ढंग से सामग्री वापस कर सकता है, तो आपको HTTP से वापस लौटना होगा और सभी लिंक को फिर से लिखना होगा, जो बहुत मजेदार नहीं है। समान प्रतिबंध MPMoviePlayerController/AVPlayer पर लागू होता है, लेकिन इस मामले में सभी सामग्री को नियंत्रित करने के लिए और अधिक आम है और इस प्रकार गैर-रिश्तेदार लिंक से बचने में सक्षम हो।

संपादित करें: मैं HttpResponse और HTTPConnection CocoaHTTPServer

में पाया वर्गों के कस्टम implemenations का उपयोग कर रहा नहीं कर सकते स्रोत का खुलासा हुआ लूपबैक सर्वर को लागू करने में कामयाब रहे, लेकिन मैं का एक मिश्रण के साथ एक साथ इस्तेमाल किया NSURLConnection AsyncHTTPResponse और DataHTTPResponse प्रदर्शन प्रतिक्रियाएं।

संपादित करें: स्थापित करने के लिए myHttpServerObject.interface = @"loopback";

संपादित करें याद रखें: चेतावनी !!! यह दृष्टिकोण एयरप्ले के साथ काम नहीं कर रहा है क्योंकि एयरप्ले डिवाइस 127.1.1.1 से एन्क्रिप्शन कुंजी के लिए पूछेगा। सही दृष्टिकोण यहां परिभाषित किया गया है: https://developer.apple.com/library/content/documentation/AudioVideo/Conceptual/AirPlayGuide/EncryptionandAuthentication/EncryptionandAuthentication.html#//apple_ref/doc/uid/TP40011045-CH5-SW1

"अनुप्रयोग-परिभाषित यूआरएल योजना का उपयोग कर .m3u8 फ़ाइलों में कुंजी निर्दिष्ट करें।"

संपादित करें: एक सेब टीवी और आईओएस अपडेट ने ऊपर दिए गए संपादन में उल्लिखित मुद्दे का समाधान किया है!

+0

मैं आपकी तकनीक की नकल करने की कोशिश कर रहा हूं और मैंने एक दीवार मारा है। आपने अपने स्थानीय सर्वर और अपने ऐप के बीच यातायात को कैसे सुरक्षित किया? HTTP और जेलब्रोकन आईओएस डिवाइस के साथ, टीसीपीडम्प के साथ यातायात को पकड़ना मुश्किल है। HTTPS का उपयोग करने के लिए, आपको एक प्रमाणपत्र की आवश्यकता है जो AVPlayer स्वीकार करेगा (इसे डिवाइस के रूट प्रमाणपत्र प्राधिकरणों में से एक द्वारा जारी किया जाना चाहिए)। –

+0

हमने स्थानीय सर्वर और ऐप के बीच यातायात को सुरक्षित नहीं किया है। जिस ग्राहक के लिए हम इस ऐप को विकसित कर रहे हैं, वे अच्छी तरह जानते हैं कि एक समर्पित हैकर सुरक्षा तोड़ सकता है। यही कारण है कि वे भविष्य में किसी तीसरे पक्ष के मीडिया प्लेयर विक्रेता को अपग्रेड कर रहे हैं। – Nailer

+0

'ऐसा लगता है कि जब तक ऐप्पल हमें यह नियंत्रित करने देता है कि AVRLlayonne एवीप्लेयर का उपयोग केवल एक ही जवाब का उपयोग करता है, तो एक HTTP लूपबैक सर्वर को लागू करना प्रतीत होता है।' आईओएस 5 के लिए यह अभी भी सच है? – Marcel

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