CFNetwork SSLHandshake iOS 9 में विफल रहा


207

IOS 9 बीटा 1 के साथ किसी को भी इस मुद्दे था?

मैं webservice से जुड़ने के लिए मानक NSURLConnection का उपयोग करता हूं और जैसे ही webservice को कॉल किया जाता है, मुझे नीचे की त्रुटि मिलती है। यह वर्तमान में iOS 8.3 में काम कर रहा है

संभव बीटा बग? किसी भी विचार या विचार महान होगा! आईओएस 9 के विकास में मुझे इसकी बहुत पहले से जानकारी है

यहाँ पूरी त्रुटि है:

CFNetwork SSLHandshake विफल (-9824) NSURLSession / NSURLConnection HTTP लोड विफल हुआ (kCFStreamErrorDomainSSL, -9824)

 NSURLRequest * urlRequest = [NSURLRequest requestWithURL:[NSURL URLWithString:@"https://mywebserviceurl"]];
        NSURLResponse * response = nil;
        NSError * error = nil;
        NSData * data = [NSURLConnection sendSynchronousRequest:urlRequest
                                                  returningResponse:&response
                                                              error:&error];

जवाबों:


310

iOS 9 और OSX 10.11 को उन सभी मेजबानों के लिए TLSv1.2 SSL की आवश्यकता होती है, जब तक आप अपने ऐप की Info.plist फ़ाइल में अपवाद डोमेन निर्दिष्ट नहीं करते, तब तक आपसे डेटा अनुरोध करने की योजना है।

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 insecure HTTP requests-->
      <key>NSExceptionAllowsInsecureHTTPLoads</key>
      <true/>
      <!--Include to specify minimum TLS version-->
      <key>NSExceptionMinimumTLSVersion</key>
      <string>TLSv1.1</string>
    </dict>
  </dict>
</dict>

यदि आपका एप्लिकेशन (उदाहरण के लिए एक तृतीय-पक्ष वेब ब्राउज़र) को मनमाने मेजबानों से कनेक्ट करने की आवश्यकता है, तो आप इसे इस तरह कॉन्फ़िगर कर सकते हैं:

<key>NSAppTransportSecurity</key>
<dict>
    <!--Connect to anything (this is probably BAD)-->
    <key>NSAllowsArbitraryLoads</key>
    <true/>
</dict>

यदि आप ऐसा कर रहे हैं, तो शायद आपके सर्वर को TLSv1.2 और SSL का उपयोग करने के लिए अपडेट करना सबसे अच्छा है, यदि वे पहले से ऐसा नहीं कर रहे हैं। इसे एक अस्थायी समाधान माना जाना चाहिए।

आज तक, प्रीलेरेज प्रलेखन किसी भी विशिष्ट तरीके से इनमें से किसी भी कॉन्फ़िगरेशन विकल्प का उल्लेख नहीं करता है। एक बार ऐसा हो जाने पर, मैं संबंधित दस्तावेज़ से लिंक करने के लिए उत्तर को अपडेट कर दूंगा।


1
ऐप ट्रांसपोर्ट सिक्योरिटी (ATS) एक ऐप को अपनी Info.plist फ़ाइल में एक घोषणा जोड़ने देता है जो उन डोमेन को निर्दिष्ट करता है जिनके साथ इसे सुरक्षित संचार की आवश्यकता होती है। एटीएस आकस्मिक प्रकटीकरण को रोकता है, सुरक्षित डिफ़ॉल्ट व्यवहार प्रदान करता है, और अपनाने में आसान है। आपको जल्द से जल्द एटीएस को अपनाना चाहिए, भले ही आप एक नया ऐप बना रहे हों या किसी मौजूदा को अपडेट कर रहे हों। यदि आप एक नया ऐप विकसित कर रहे हैं, तो आपको विशेष रूप से HTTPS का उपयोग करना चाहिए। यदि आपके पास एक मौजूदा ऐप है, तो आपको HTTPS का उपयोग उतना ही करना चाहिए जितना आप अभी कर सकते हैं, और जितनी जल्दी हो सके अपने बाकी ऐप को माइग्रेट करने के लिए एक योजना बनाएं।
user3099837

2
@StevenPeterson अरे स्टीवे आई कैंट को अपवाद डोमेन उदाहरण के लिए काम करने लगता है, क्या आपके पास संयोग से कोई विचार है, मैंने अभी कॉपी किया है और पेस्ट किया है। // आदि
user3099837

27
लंबी चैट के लिए क्षमा करें, लेकिन मुझे लगा कि मुझे निष्क्रिय करने की आवश्यकता है <key> NSTemporaryExceptionRequiresForwardSecrecy </ key> <false />
user3099837

2
@RashmiRanjanmallick NSTemporaryExceptionMinimumTLSVersion का उपयोग एटीएस को यह बताने के लिए किया जाता है कि आप एक गैर 1.2 सर्वर के साथ काम कर रहे हैं। उदाहरण के लिए, इसका उपयोग करें यदि आप एक होस्ट से कनेक्ट करने का प्रयास कर रहे हैं जो टीएलएस 1.0 का उपयोग करता है। आपको NSTemporaryExceptionRequiresForwardSecrecy का उपयोग झूठा करने के लिए करना होगा, जैसा कि उपयोक्ता 3099837 ने संकेत दिया है।
वोमबल

2
ste.vn/2015/06/10/… - यह वह ब्लॉग है जहाँ से उत्तर को खट्टा किया गया है।
सीन देव

66

IOS 10+ में, TLS स्ट्रिंग "TLSv1.0" फॉर्म का होना चाहिए। यह सिर्फ "1.0" नहीं हो सकता। (साँस)


अन्य उत्तरों के निम्नलिखित संयोजन काम करता है।

मान लीजिए कि आप एक होस्ट (у_HOST.COM) से कनेक्ट करने का प्रयास कर रहे हैं जिसमें केवल TLS 1.0 है।

इन्हें अपने ऐप के Info.plist में जोड़ें

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSExceptionDomains</key>
    <dict>
        <key>YOUR_HOST.COM</key>
        <dict>
            <key>NSIncludesSubdomains</key>
            <true/>
            <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
            <true/>
            <key>NSTemporaryExceptionMinimumTLSVersion</key>
            <string>TLSv1.0</string>
            <key>NSTemporaryExceptionRequiresForwardSecrecy</key>
            <false/>
        </dict>
    </dict>
</dict>

9
लगता है कि जोड़ने NSTemporaryExceptionRequiresForwardSecrecyने मेरे लिए चाल चली, धन्यवाद!
जोश वल्दिविसो

2
इस संस्करण ने iOS9.1 पर मेरे लिए काम नहीं किया - मुझे किसी अन्य उत्तर <कुंजी> NSTemporaryExceptionMinimumTLSVersion </ key> <string> TLSv1.1 / / string>
300baud

यह काम करता है, लेकिन मेरा सवाल यह है: क्या इसका मतलब यह है कि मेरा ऐप ssl का उपयोग नहीं करता है जब ये पैरामीटर चालू होते हैं और डेटा एन्क्रिप्ट नहीं किया जाता है?
डीडीसी

33

अधिक जानकारी के लिए iOS 9 और OSX 10.11 में ऐप ट्रांसपोर्ट सिक्योरिटी एक्सेप्शन कॉन्फ़िगर करना

उत्सुकता से, आप देखेंगे कि कनेक्शन आपके कोड में गलतियों से बचाने के लिए http प्रोटोकॉल को https में बदलने का प्रयास करता है, जहाँ आपने गलती से URL गलत तरीके से बना लिया होगा। कुछ मामलों में, यह वास्तव में काम कर सकता है, लेकिन यह भी भ्रामक है।

इस शिपिंग के साथ ऐप ट्रांसपोर्ट सिक्योरिटी वाला ऐप कुछ अच्छे डिबगिंग टिप्स को कवर करता है

एटीएस की विफलता

अधिकांश ATS विफलताओं -9800 श्रृंखला में एक कोड के साथ CFErors के रूप में पेश करेंगे। ये Security / SecureTransport.h हेडर में परिभाषित किए गए हैं

2015-08-23 06:34:42.700 SelfSignedServerATSTest[3792:683731] NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9813)

CFNETWORK_DIAGNOSTICS

विफलता के बारे में कंसोल पर अधिक जानकारी प्राप्त करने के लिए पर्यावरण चर CFNETWORK_DIAGNOSTICS को 1 पर सेट करें

nscurl

टूल एटीएस अपवादों के कई अलग-अलग संयोजनों के माध्यम से चलेगा, प्रत्येक एटीएस कॉन्फ़िगरेशन के तहत दिए गए होस्ट के लिए सुरक्षित कनेक्शन की कोशिश करेगा और परिणाम की रिपोर्ट करेगा।

nscurl --ats-diagnostics https://example.com

1
केवल इंगित करें कि nscurl केवल Mac OS X "El Capitan" में उपलब्ध है
webo80

1
एक और डिबगिंग टिप, यह जांचने के लिए कि आपके सर्वर द्वारा किस TLS कनेक्शन सिफर का उपयोग किया जा रहा है: curl -v https: // <hostname>
André Morujão

1
यदि कर्ल पास सभी चरणों को ठीक करता है तो समस्या के बारे में कोई विचार हो सकता है?
एस्टन

@ onmyway133 क्या आप "पर्यावरण चर CFNETWORK_DIAGNOSTICS 1" पर सेट करने के तरीके पर अन्वेषण जोड़ सकते हैं?
याकिरण

1
@YakirNa के बारे में आप पढ़ सकते हैं कि कैसे करें कि यहाँ nshipster.com/launch-arguments-and-environment-variables यह बहुत सीधा है :)
onmyway133

2

यदि आपका बैकएंड एक सुरक्षित कनेक्शन चींटी का उपयोग करता है, तो आप NSURLSession का उपयोग कर सकते हैं

CFNetwork SSLHandshake failed (-9801)
NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9801)

आपको एटीएस संस्करण और एसएसएल प्रमाणपत्र प्राप्त करने के लिए विशेष रूप से अपने सर्वर कॉन्फ़िगरेशन की जांच करने की आवश्यकता है जानकारी:

सेटिंग द्वारा केवल असुरक्षित कनेक्शन देने केNSExceptionAllowsInsecureHTTPLoads = YES बजाय, यदि आपके सर्वर को एटीएस (या सर्वर पक्ष को ठीक करने के लिए बेहतर) के लिए न्यूनतम आवश्यकता (v1.2) को पूरा न करने की स्थिति में अनुमति देने की आवश्यकता होती है।

सिंगल सर्वर पर सिक्योरिटी कम करना

<key>NSExceptionDomains</key>
<dict>
    <key>api.yourDomaine.com</key>
    <dict>
        <key>NSExceptionMinimumTLSVersion</key>
        <string>TLSv1.0</string>
        <key>NSExceptionRequiresForwardSecrecy</key>
        <false/>
    </dict>
</dict>

सर्टिफिकेट की जांच करने के लिए और ओपन सर्वर का उपयोग करके अपने सर्वर कॉन्फ़िगरेशन को प्राप्त करने के लिए ओपनसेल क्लाइंट का उपयोग करें:

openssl s_client  -connect api.yourDomaine.com:port //(you may need to specify port or  to try with https://... or www.)

.. अंत में पता करें

SSL-Session:
    Protocol  : TLSv1
    Cipher    : AES256-SHA
    Session-ID: //
    Session-ID-ctx: 
    Master-Key: //
    Key-Arg   : None
    Start Time: 1449693038
    Timeout   : 300 (sec)
    Verify return code: 0 (ok)

ऐप ट्रांसपोर्ट सिक्योरिटी (ATS) को ट्रांसपोर्ट लेयर सिक्योरिटी (TLS) प्रोटोकॉल वर्जन 1.2 की आवश्यकता होती है।

एटीएस का उपयोग कर कनेक्ट करने के लिए आवश्यकताएँ:

ऐप ट्रांसपोर्ट सिक्योरिटी (एटीएस) का उपयोग करने के लिए एक वेब सेवा कनेक्शन के लिए आवश्यकताओं में सर्वर, कनेक्शन सिफर और प्रमाण पत्र शामिल हैं:

प्रमाणपत्र निम्न प्रकार की कुंजियों में से एक पर हस्ताक्षर किए जाने चाहिए:

  • सुरक्षित हैश अल्गोरिथम 2 (SHA-2) कम से कम 256 (यानी, SHA-256 या तो) की लंबाई के साथ कुंजी

  • एलिप्टिक-कर्व क्रिप्टोग्राफी (ईसीसी) कम से कम 256 बिट्स के आकार के साथ कुंजी

  • कम से कम 2048 बिट्स की लंबाई के साथ रिवरेस्ट-शमीर-एडलमैन (आरएसए) कुंजी एक अमान्य प्रमाणपत्र परिणाम में एक कठिन विफलता और कोई संबंध नहीं है।

निम्नलिखित कनेक्शन सिफर आगे गोपनीयता (एफएस) का समर्थन करते हैं और एटीएस के साथ काम करते हैं:

TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384 TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA

अपडेट: यह पता चलता है कि ओपनसेल केवल न्यूनतम प्रोटोकॉल संस्करण प्रोटोकॉल प्रदान करता है: TLSv1 लिंक


यह सवाल बना रहता है कि क्या सर्वर की आवश्यकता पूरी होती है, यह पता लगाने के लिए ओपनसेल जानकारी की व्याख्या करना संभव है। इसके अलावा प्रोटोकॉल: TLSv1 1x के बजाय मेक वर्जन हो सकता है
इडली

मैं इसे सामान्य बनाता हूं, पोर्ट का उपयोग करने के मामले में
इडली

जवाब से अधिक सवाल खुला छोड़ देता है। ऐसा लगता है कि एक मुद्दा हो सकता है कि ओपनसेल रिपोर्ट और ऐप्पल प्रलेखन के बीच क्या अंतर है। टीएलएस 1.2 का समर्थन किया जाता है, यह निर्धारित करने के लिए ओपनसेल आउटपुट से संभव नहीं है। उत्तर यह भी निर्धारित करने की अनुमति नहीं देता है कि क्या परफेक्ट फॉरवर्ड सेक्रेसी का समर्थन किया गया है।
zaph

2

दो दिनों की कोशिशों और असफलताओं के बाद, मेरे लिए जो काम किया, वह है वोमबेल का कोड

एक परिवर्तन के साथ, इस पोस्ट के अनुसार हमें उस तरह के कन्वेंशन के NSExceptionDomains डिक्शनरी से जुड़े उप-कुंजियों का उपयोग करना बंद कर देना चाहिए

  NSTemporaryExceptionMinimumTLSVersion

और नए कन्वेंशन में उपयोग करें

  NSExceptionMinimumTLSVersion

बजाय।

सेब प्रलेखन

मेरा कोड

<key>NSAppTransportSecurity</key>
    <dict>
        <key>NSExceptionDomains</key>
        <dict>
            <key>YOUR_HOST.COM</key>
            <dict>
                <key>NSExceptionAllowsInsecureHTTPLoads</key>
                <true/>
                <key>NSExceptionMinimumTLSVersion</key>
                <string>TLSv1.0</string>
                <key>NSExceptionRequiresForwardSecrecy</key>
                <false/>
                <key>NSIncludesSubdomains</key>
                <true/>
            </dict>
        </dict>
    </dict>

1

एक अन्य उपयोगी उपकरण है नैम्प (शराब की भठ्ठी स्थापित करें)

nmap --script ssl-enum-ciphers -p 443 google.com

आउटपुट देता है

Starting Nmap 7.12 ( https://nmap.org ) at 2016-08-11 17:25 IDT
Nmap scan report for google.com (172.217.23.46)
Host is up (0.061s latency).
Other addresses for google.com (not scanned): 2a00:1450:4009:80a::200e
PORT    STATE SERVICE
443/tcp open  https
| ssl-enum-ciphers: 
|   TLSv1.0: 
|     ciphers: 
|       TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA (secp256r1) - A
|       TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA (secp256r1) - A
|       TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA (secp256r1) - A
|       TLS_RSA_WITH_AES_128_CBC_SHA (rsa 2048) - A
|       TLS_RSA_WITH_3DES_EDE_CBC_SHA (rsa 2048) - C
|       TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA (secp256r1) - A
|       TLS_RSA_WITH_AES_256_CBC_SHA (rsa 2048) - A
|     compressors: 
|       NULL
|     cipher preference: server
|   TLSv1.1: 
|     ciphers: 
|       TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA (secp256r1) - A
|       TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA (secp256r1) - A
|       TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA (secp256r1) - A
|       TLS_RSA_WITH_AES_128_CBC_SHA (rsa 2048) - A
|       TLS_RSA_WITH_3DES_EDE_CBC_SHA (rsa 2048) - C
|       TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA (secp256r1) - A
|       TLS_RSA_WITH_AES_256_CBC_SHA (rsa 2048) - A
|     compressors: 
|       NULL
|     cipher preference: server
|   TLSv1.2: 
|     ciphers: 
|       TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA (secp256r1) - A
|       TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256 (secp256r1) - A
|       TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 (secp256r1) - A
|       TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA (secp256r1) - A
|       TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384 (secp256r1) - A
|       TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384 (secp256r1) - A
|       TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256 (secp256r1) - A
|       TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA (secp256r1) - A
|       TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256 (secp256r1) - A
|       TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (secp256r1) - A
|       TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA (secp256r1) - A
|       TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384 (secp256r1) - A
|       TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (secp256r1) - A
|       TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256 (secp256r1) - A
|       TLS_RSA_WITH_3DES_EDE_CBC_SHA (rsa 2048) - C
|       TLS_RSA_WITH_AES_128_CBC_SHA (rsa 2048) - A
|       TLS_RSA_WITH_AES_128_CBC_SHA256 (rsa 2048) - A
|       TLS_RSA_WITH_AES_128_GCM_SHA256 (rsa 2048) - A
|       TLS_RSA_WITH_AES_256_CBC_SHA (rsa 2048) - A
|       TLS_RSA_WITH_AES_256_CBC_SHA256 (rsa 2048) - A
|       TLS_RSA_WITH_AES_256_GCM_SHA384 (rsa 2048) - A
|     compressors: 
|       NULL
|     cipher preference: client
|_  least strength: C

Nmap done: 1 IP address (1 host up) scanned in 5.48 seconds

प्रमाणपत्र समस्या को दूर करने के लिए बहुत उपयोगी है
लोपाखिन

0

जब मैं एक छोटी गाड़ी / दुर्घटना कॉर्डोवा आईओएस संस्करण का उपयोग कर रहा था तो यह त्रुटि लॉग में दिखाई दे रही थी। जब मैंने कॉर्डोवा iOS को अपग्रेड या डाउनग्रेड किया तो यह दूर चली गई।

मैं जिस सर्वर से जुड़ रहा था वह TLSv1.2 SSL का उपयोग कर रहा था, इसलिए मुझे पता था कि यह समस्या नहीं थी।


0

.plistइस अनुमति को जोड़ने में आपकी परियोजना फ़ाइल में:

<key>NSAppTransportSecurity</key>
<dict>
    <!--Connect to anything (this is probably BAD)-->
    <key>NSAllowsArbitraryLoads</key>
    <true/>
</dict>

0

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 insecure HTTP requests-->
  <key>NSExceptionAllowsInsecureHTTPLoads</key>
  <true/>
  <!--Include to specify minimum TLS version-->
  <key>NSExceptionMinimumTLSVersion</key>
  <string>TLSv1.1</string>
   </dict>
 </dict>


0

अपडेटेड उत्तर (डब्ल्यूडब्ल्यूडीसी 2016):

2016 के अंत तक iOS ऐप को सुरक्षित HTTPS कनेक्शन की आवश्यकता होगी। ATS को बंद करने की कोशिश करने से भविष्य में आपका ऐप अस्वीकृत हो सकता है।

ऐप ट्रांसपोर्ट सिक्योरिटी, या एटीएस, एक ऐसी सुविधा है जिसे Apple ने iOS 9 में पेश किया है। जब एटीएस सक्षम होता है, तो यह ऐप को गैर-सुरक्षित HTTP के बजाय HTTPS कनेक्शन पर वेब सेवाओं से जुड़ने के लिए मजबूर करता है।

हालाँकि, डेवलपर्स अभी भी एटीएस को बंद कर सकते हैं और अपने ऐप्स को उपरोक्त उत्तरों में उल्लिखित HTTP कनेक्शन पर डेटा भेजने की अनुमति दे सकते हैं। 2016 के अंत में, ऐप्पल उन सभी डेवलपर्स के लिए एटीएस अनिवार्य कर देगा, जो ऐप स्टोर में अपने ऐप सबमिट करने की उम्मीद करते हैं। संपर्क


0

जिस डिवाइस पर मैंने परीक्षण किया, वह गलत समय निर्धारित था। इसलिए जब मैंने प्रमाण पत्र के साथ एक पृष्ठ तक पहुंचने की कोशिश की, जो जल्द ही बाहर निकल जाएगा, तो यह एक्सेस से इनकार करेगा क्योंकि प्रमाणपत्र समाप्त हो गया था। ठीक करने के लिए, डिवाइस पर उचित समय निर्धारित करें!

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.