मैं iOS 9 में ऐप ट्रांसपोर्ट सिक्योरिटी के साथ HTTP URL कैसे लोड कर सकता हूं?




nsurl ios9 (6)

इस सवाल का पहले से ही यहाँ एक जवाब है:

इसलिए, कल रात को जारी किए गए iOS के नए बीटा एसडीके में "ऐप ट्रांसपोर्ट सिक्योरिटी" है जो डेवलपर्स को http के बजाय https का उपयोग करने के लिए प्रोत्साहित करता है। सिद्धांत रूप में, यह एक महान विचार है, और मैं पहले से ही हमारे मंचन / उत्पादन वातावरण में https का उपयोग करता हूं। हालाँकि, मेरे पास अपने स्थानीय विकास वातावरण में https सेट नहीं है, जब iOS ऐप मैं अपने लैपटॉप पर चलने वाली वेब सेवा से कनेक्ट कर रहा हूं।

आज सुबह के आसपास खेलने से, यह प्रतीत होता है कि URL लोडिंग सिस्टम, भले ही आप इसे एक http URL के रूप में सौंप दें, इसके बजाय https का उपयोग करने का निर्णय लें। क्या किसी को पता है कि इस व्यवहार को कैसे निष्क्रिय किया जाए - यहां तक ​​कि सिर्फ विशेष URL के लिए?


@Adurdin और @User द्वारा दिए गए संकलन संकलन

अपनी जानकारी में अनुवर्ती जोड़ें। अपने संबंधित डोमेन नाम के साथ, localhost.com को बदलें और आप कई डोमेन भी जोड़ सकते हैं:

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
    <key>NSExceptionDomains</key>
    <dict>
        <key>localhost.com</key>
        <dict>
            <key>NSIncludesSubdomains</key>
            <false/>
            <key>NSExceptionAllowsInsecureHTTPLoads</key>
            <false/>
            <key>NSExceptionRequiresForwardSecrecy</key>
            <true/>
            <key>NSExceptionMinimumTLSVersion</key>
            <string>TLSv1.2</string>
            <key>NSThirdPartyExceptionAllowsInsecureHTTPLoads</key>
            <false/>
            <key>NSThirdPartyExceptionRequiresForwardSecrecy</key>
            <true/>
            <key>NSThirdPartyExceptionMinimumTLSVersion</key>
            <string>TLSv1.2</string>
            <key>NSRequiresCertificateTransparency</key>
            <false/>
        </dict>
    </dict>
</dict>
</plist>

आपको जानकारी है। इस तरह दिखना चाहिए:


इसका अनुसरण this ।

मैंने इसे info.plist में कुछ कुंजी जोड़कर हल कर लिया है। मैंने जिन चरणों का पालन किया है वे हैं:

  1. मेरी परियोजनाओं की जानकारी खोल दी

  2. एक Dictionary रूप में NSAppTransportSecurity नामक एक कुंजी को जोड़ा गया।

  3. NSAllowsArbitraryLoads नामक एक उपकुंजी को Boolean रूप में जोड़ा गया और निम्न छवि की तरह इसका मान YES सेट किया गया।

प्रोजेक्ट को साफ करें और अब पहले की तरह सबकुछ ठीक चल रहा है।

रेफरी Link ।


जैसा कि स्वीकृत उत्तर ने आवश्यक जानकारी प्रदान की है, और ऐप परिवहन सुरक्षा का उपयोग करने और अक्षम करने के बारे में अधिक जानकारी के लिए इस पर अधिक जानकारी प्राप्त कर सकते हैं

प्रति-डोमेन अपवाद के लिए इन्हें Info.plist में जोड़ें:

<key>NSAppTransportSecurity</key>
<dict>
  <key>NSExceptionDomains</key>
  <dict>
    <key>yourserver.com</key>
    <dict>
      <!--Include to allow subdomains-->
      <key>NSIncludesSubdomains</key>
      <true/>
      <!--Include to allow HTTP requests-->
      <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
      <true/>
      <!--Include to specify minimum TLS version-->
      <key>NSTemporaryExceptionMinimumTLSVersion</key>
      <string>TLSv1.1</string>
    </dict>
  </dict>
</dict>

लेकिन क्या होगा अगर मुझे पता नहीं है कि सभी असुरक्षित डोमेन मुझे उपयोग करने की आवश्यकता है? अपने Info.plist में निम्नलिखित कुंजी का उपयोग करें

<key>NSAppTransportSecurity</key>
<dict>
  <!--Include to allow all connections (DANGER)-->
  <key>NSAllowsArbitraryLoads</key>
      <true/>
</dict>

अधिक विवरण के लिए आप इस लिंक से प्राप्त कर सकते हैं।


पूर्ण विवरण के लिए Apple का Info.plist संदर्भ देखें (धन्यवाद @ gnasher729)।

आप अपने Info.plist में विशिष्ट डोमेन के लिए अपवाद जोड़ सकते हैं:

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSExceptionDomains</key>
    <dict>
        <key>testdomain.com</key>
        <dict>
            <key>NSIncludesSubdomains</key>
            <true/>
            <key>NSExceptionAllowsInsecureHTTPLoads</key>
            <true/>
            <key>NSExceptionRequiresForwardSecrecy</key>
            <true/>
            <key>NSExceptionMinimumTLSVersion</key>
            <string>TLSv1.2</string>
            <key>NSThirdPartyExceptionAllowsInsecureHTTPLoads</key>
            <false/>
            <key>NSThirdPartyExceptionRequiresForwardSecrecy</key>
            <true/>
            <key>NSThirdPartyExceptionMinimumTLSVersion</key>
            <string>TLSv1.2</string>
            <key>NSRequiresCertificateTransparency</key>
            <false/>
        </dict>
    </dict>
</dict>

प्रत्येक अपवादित डोमेन के लिए सभी कुंजी वैकल्पिक हैं। स्पीकर किसी भी कुंजी पर विस्तृत नहीं था, लेकिन मुझे लगता है कि वे सभी यथोचित स्पष्ट हैं।

(स्रोत: WWDC 2015 सत्र 703, "गोपनीयता और आपका ऐप" , 30:18)

आप एक ही कुंजी के साथ सभी ऐप ट्रांसपोर्ट सुरक्षा प्रतिबंधों को भी अनदेखा कर सकते हैं, यदि आपके ऐप के पास ऐसा करने का एक अच्छा कारण है:

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
</dict>

यदि आपके ऐप में एक अच्छा कारण नहीं है, तो आप अस्वीकृति का जोखिम उठा सकते हैं:

NSAllowsArbitavorLoads को सही पर सेट करने से यह काम करने की अनुमति देगा, लेकिन Apple इसमें बहुत स्पष्ट था कि वे उन ऐप्स को अस्वीकार करने का इरादा रखते हैं जो एक विशिष्ट कारण के बिना इस ध्वज का उपयोग करते हैं। NSAllowsArbiteathLoads का उपयोग करने का मुख्य कारण मैं सोच सकता हूं कि उपयोगकर्ता निर्मित सामग्री (लिंक साझा करना, कस्टम वेब ब्राउज़र, आदि) होगा। और इस मामले में, Apple अभी भी आपसे उन अपवादों को शामिल करने की उम्मीद करता है जो आपके द्वारा नियंत्रित URL के लिए ATS लागू करते हैं।

यदि आपको TLS 1.2 पर सेवा नहीं देने वाले विशिष्ट URL तक पहुँच की आवश्यकता है, तो आपको उन डोमेन के लिए विशिष्ट अपवाद लिखने की आवश्यकता है, न कि NSAllowsArbiteathLoads का उपयोग करने के लिए सेट करें। आप NSURLSesssion WWDC सत्र में अधिक जानकारी प्राप्त कर सकते हैं।

कृपया NSAllowsArbiteathLoads समाधान साझा करने में सावधानी बरतें। यह एप्पल से अनुशंसित फिक्स नहीं है।

- kcharwood (धन्यवाद @ मार्को-टॉलमैन)


यदि आप केवल स्थानीय देव सर्वर के लिए ऐप ट्रांसपोर्ट पॉलिसी को निष्क्रिय करना चाहते हैं तो निम्नलिखित समाधान अच्छी तरह से काम करते हैं। जब आप असमर्थ हों, या HTTPS स्थापित करने के लिए यह अव्यावहारिक हो (जैसे Google App Engine dev सर्वर का उपयोग करते समय) यह उपयोगी है।

हालांकि अन्य लोगों ने कहा है कि एटीपी को निश्चित रूप से उत्पादन ऐप के लिए बंद नहीं किया जाना चाहिए।

1) डिबग के लिए एक अलग प्लिस्ट का उपयोग करें

अपनी Plist फाइल और NSAllowsArbiteathLoads कॉपी करें। डिबगिंग के लिए इस प्लिस्ट का उपयोग करें।

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
</dict>

2) स्थानीय सर्वरों को छोड़ दें

वैकल्पिक रूप से, आप एक एकल फ़ाइल का उपयोग कर सकते हैं और विशिष्ट सर्वर को बाहर कर सकते हैं। हालाँकि, ऐसा नहीं लगता है कि आप IP 4 पतों को बाहर कर सकते हैं, इसलिए आपको इसके बजाय सर्वर नाम का उपयोग करने की आवश्यकता हो सकती है (सिस्टम प्राथमिकताएँ -> साझा करना, या अपने स्थानीय DNS में कॉन्फ़िगर करना)।

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSExceptionDomains</key>
    <dict>
        <key>server.local</key>
        <dict/>
        <key>NSExceptionAllowsInsecureHTTPLoads</key>
        <true/>
    </dict>
</dict>

यहाँ मेरे लिए क्या काम किया गया है:

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <false/>
    <key>NSExceptionDomains</key>
    <dict>
        <key><!-- your_remote_server.com / localhost --></key>
        <dict>
            <key>NSIncludesSubdomains</key>
            <true/>
            <key>NSExceptionAllowsInsecureHTTPLoads</key>
            <true/>
            <key>NSExceptionRequiresForwardSecrecy</key>
            <true/>
        </dict>
    <!-- add more domain here -->
    </dict>
</dict>

मैं सिर्फ दूसरों की मदद करने और कुछ समय बचाने के लिए इसे जोड़ना चाहता हूं:

यदि आप उपयोग कर रहे हैं: CFStreamCreatePairWithSocketToHost । सुनिश्चित करें कि आपका host आपके पास .plist में वही है या यदि आपके पास सॉकेट के लिए अलग डोमेन है तो इसे वहीं जोड़ें।

CFStreamCreatePairWithSocketToHost(NULL, (__bridge CFStringRef)/*from .plist*/, (unsigned int)port, &readStream, &writeStream);

आशा है कि यह उपयोगी है। चीयर्स। :)





app-transport-security