IOS पर काम करने के लिए CRL और OSCP चेकिंग कैसे प्राप्त करें?


9

मैं CRL को iOS पर काम नहीं करवा सकता। मैंने दो टेस्ट केस बनाए हैं। मेरे पास एक प्रमाण पत्र है जो वैध है, एक सीए द्वारा जारी किया गया है। मेरे पास एक और प्रमाण पत्र है जो मान्य है, एक सीए द्वारा जारी किया गया है, लेकिन सीए ने उस प्रमाणपत्र को अपने सीआरएल में जोड़ दिया है।

मैं तब एक निरस्तीकरण नीति स्थापित करता हूं जो CRL को सक्षम बनाता है, और आवश्यकता है कि यह सफल हो।

func crlValidationTest(trustedCert: SecCertificate, certToVerify: SecCertificate) -> Bool {

    let basicPolicy = SecPolicyCreateBasicX509()

    let crlPolicy = SecPolicyCreateRevocation(kSecRevocationOCSPMethod | kSecRevocationCRLMethod | kSecRevocationRequirePositiveResponse)!

    var trust: SecTrust?

    SecTrustCreateWithCertificates(NSArray(object: certToVerify), NSArray(objects: basicPolicy, crlPolicy), &trust)
    SecTrustSetAnchorCertificates(trust!, NSArray(object: trustedCert))
    SecTrustSetNetworkFetchAllowed(trust!, true)

    var trustResult = SecTrustResultType.invalid

    guard SecTrustEvaluate(trust!, &trustResult) == errSecSuccess else {
        return false
    }

    return trustResult == SecTrustResultType.proceed || trustResult == SecTrustResultType.unspecified
}

मेरी उम्मीद है कि CRL पर जो सर्टिफिकेट है, वह अविश्‍वसनीय होगा, और जो सर्टिफिकेट साफ है, उस पर भरोसा किया जाएगा।

उपरोक्त विन्यास को देखते हुए, दोनों अविश्वास के रूप में विफल होते हैं। अगर मैं kSecRevocationRequirePositiveResponseझंडा हटा दूं तो दोनों सफल हो जाते हैं। मैंने केवल ओएससीपी या केवल सीआरएल का उपयोग करने के सभी अलग-अलग क्रमांकन की कोशिश की है, और कुछ भी उस तरह से काम नहीं करता है जिसकी मुझे उम्मीद थी।

सेब प्रलेखन के लिए SecPolicyCreateRevocationकहता है:

जब तक आप डिफ़ॉल्ट सिस्टम व्यवहार को ओवरराइड करने की इच्छा नहीं रखते हैं, उदाहरण के लिए, किसी विशेष विधि को बाध्य करने के लिए, या पूरी तरह से निरस्तीकरण जाँच को अक्षम करने के लिए, आमतौर पर यह आवश्यक नहीं है कि आप स्वयं एक निरसन नीति बनाएँ।

केवल SecPolicyCreateBasicX509पॉलिसी का उपयोग करने से दोनों को सफल होने की अनुमति मिलती है (जब दूसरा प्रमाण पत्र विफल होना चाहिए), इसलिए Apple का डिफ़ॉल्ट व्यवहार CRL की जांच बिल्कुल नहीं करना है?

मैंने अपने डिवाइस में CharlesProxy को संलग्न किया , और सभी नेटवर्क ट्रैफ़िक को सुनते हुए कोड को कई बार चलाया, और कोई भी आउटबाउंड अनुरोध कभी CRL में नहीं जाता, जो बताता है कि RequirePositiveResponseध्वज की जाँच होने पर सभी विफल क्यों हो जाते हैं ।

मैंने डिवाइस से सीधे CRL का उपयोग करके भी नेविगेट करने की कोशिश की URLRequest, और बिना किसी समस्या के डिवाइस पर CRL डेटा प्राप्त करने में सक्षम था।

क्या CRL चेकिंग Apple सुरक्षा लाइब्रेरी के माध्यम से समर्थित नहीं है? यदि ऐसा है, तो क्या किसी ने कॉन्फ़िगरेशन को ठीक से प्रतिक्रिया देने के लिए प्राप्त किया है? CRL सत्यापन करने के लिए किन विकल्पों का उपयोग किया जा रहा है, मुझे लगता है कि वित्तीय जिले या अन्य संवेदनशील क्षेत्रों में काम करने वाले उच्च-सुरक्षा मोबाइल एप्लिकेशन इस कवरेज गैप की अनुमति नहीं देंगे।

अद्यतन तुलना के लिए, मैं भाग गयाcertutil -f -urlfetch -verify MYCERT.cercertutil का उपयोग कर, और मैं संलग्न फ़िडलर आदेश चलाकर बॉक्स करने के लिए। मुझे अपेक्षित परिणाम प्राप्त होते हैं जो iOS मुझे नहीं दे रहा है, और मैं CRL से HTTP के माध्यम से fiddler के माध्यम से एक आउटबाउंड अनुरोध देखता हूं।

मैंने इसमें कुछ और रुचि पैदा करने के लिए एक इनाम बनाया है। मुझे उम्मीद है कि किसी के पास अधिक विवरण है जो ऊपर गलत किया जा रहा है, या यह आईओएस पर काम क्यों नहीं करता है।

जवाबों:


7

Apple प्लेटफ़ॉर्म पर, क्लाइंट न तो CA का सर्टिफिकेट निरस्तीकरण सूची (CRL) चेक करते हैं, न ही वे डिफ़ॉल्ट रूप से OCSP का उपयोग करते हैं।

Apple प्लेटफॉर्म हालांकि OCSP स्टेपलिंग का समर्थन कर रहे हैं और वैकल्पिक रूप से वे एक तंत्र प्रदान करते हैं जिसे वे Revocation संवर्द्धन कहते हैं, जो वास्तव में OCSP कॉल का कारण बन सकता है, नीचे विवरण देखें।

OCSP स्टेपलिंग

पहले OCSP स्टेपलिंग की व्याख्या:

ऑनलाइन प्रमाणपत्र स्थिति प्रोटोकॉल (OCSP) स्टैपल , औपचारिक रूप से के रूप में जाना टीएलएस प्रमाणपत्र स्थिति अनुरोध विस्तार, 509 डिजिटल प्रमाणपत्र का निरस्तीकरण स्थिति की जाँच के लिए एक मानक है। 1 यह प्रमाणपत्र के प्रस्तुतकर्ता को ऑनलाइन सर्टिफिकेट स्टेटस प्रोटोकॉल (OCSP) प्रतिक्रियाएं प्रदान करने में शामिल संसाधन लागत को वहन करने की अनुमति देता है ("स्टेपलिंग"), जो समय-प्रारंभिक TLS हैंड्सकेक को CA द्वारा हस्ताक्षरित OCSP प्रतिक्रिया की आवश्यकता को समाप्त करता है। सुरक्षा और प्रदर्शन दोनों को बेहतर बनाने के उद्देश्य से, ग्राहकों से CA से संपर्क करने के लिए।

देख https://en.wikipedia.org/wiki/OCSP_stapling

OCSP और OCSP स्टेपलिंग के बीच अंतर

यदि कोई क्लाइंट पारंपरिक OCSP प्रवाह में एक सर्वर से जुड़ता है और प्रमाणपत्र को पुनः प्राप्त करता है, तो यह जाँचता है कि प्राप्त प्रमाणपत्र CA के लिए अनुरोध करके निरस्त किया गया है या नहीं। इसके कुछ नुकसान हैं, उदाहरण के लिए, एक अतिरिक्त नेटवर्क कनेक्शन की आवश्यकता है, जानकारी अनएन्क्रिप्टेड है और इसलिए डेटा गोपनीयता समस्या का प्रतिनिधित्व करता है।

OCSP स्टेपलिंग के माध्यम से, सर्वर CA से एक हस्ताक्षरित निरस्तीकरण जानकारी का अनुरोध करता है और उसे TLS हैंडशेक में जोड़ता है।

इसका मतलब यह भी है, जब OCSP स्टेपलिंग का उपयोग करते हैं, तो आप iOS से CA सर्वर के लिए OCSP अनुरोध नहीं देखते हैं।

OCSP स्टेपलिंग की कमियां

सर्वर जिसे आप कनेक्ट कर रहे हैं, उसे OCSP स्टेपलिंग का समर्थन करना चाहिए। यह दुर्भावनापूर्ण सर्वर से भी सुरक्षा नहीं करता है।

यही कारण है कि Apple एक प्रत्यावर्तन संवर्धन प्रदान कर रहा है।

Apple का प्रत्यावर्तन संवर्धन

यहां देखिए यह कैसे काम करता है:

  • प्रमाणपत्र पारदर्शिता लॉग प्रविष्टियाँ Apple द्वारा एकत्रित की जाती हैं
  • इस जानकारी के साथ Apple CA से विद्रोह के बारे में जानकारी एकत्र करता है
  • यह समग्र जानकारी तो सभी Apple ग्राहकों को नियमित रूप से उपलब्ध कराई जाती है
  • इस जानकारी के आधार पर, जब एक iOS ऐप सर्वर को एक निरस्त प्रमाण पत्र से जोड़ने का प्रयास करता है, तो यह OCSP के माध्यम से एक अतिरिक्त जांच करता है।

आवश्यकता

इसका समर्थन करने के लिए किसी एप्लिकेशन की एकमात्र आवश्यकता यह है कि उपयोग किए गए सर्वर प्रमाणपत्र को प्रमाणपत्र पारदर्शिता लॉग में जोड़ा जाए। आम तौर पर एक CA पहले से ही ऐसा करता है, लेकिन आपको यह जांचना चाहिए कि डोमेन प्रमाणपत्र सार्वजनिक प्रमाणपत्र के लिए सक्रिय पारदर्शिता लॉग में है, उदाहरण के लिए निम्न लिंक का उपयोग करके: https://transparencyreport.google.com/https/certports

WWDC 2017, सत्र 701

एक उत्कृष्ट WWDC सत्र है जिसमें इस विषय और Apple के उद्देश्यों के बारे में विस्तार से बताया गया है: WWDC 2017, सत्र 701: https://developer.apple.com/videos/play/wwdc2017/701/

लगभग 12:10 मिनट पर एक Apple इंजीनियर पूरे निरसन विषय को विस्तार से बताता है। लगभग 15:30 पर वह बताती हैं कि सामान्य OCSP को अतिरिक्त API के उपयोग की आवश्यकता होगी।

IOS पर OCSP स्टेपलिंग का टेस्ट

परीक्षण के लिए हमें एक सर्वर की आवश्यकता होती है जो OCSP स्टेपलिंग का समर्थन करता है और एक निरस्त प्रमाण पत्र का उपयोग करता है: https://revoked.grc.com (इस सर्वर को इस सर्वरफॉल्ट उत्तर में मिला: https://serverfault.com/a/645066 )

तब हम आईओएस से एक छोटे परीक्षण कार्यक्रम के साथ जुड़ने की कोशिश कर सकते हैं जो HTML प्रतिक्रिया को डाउनलोड करने और इसे कंसोल पर आउटपुट करने की कोशिश करता है।

ऊपर वर्णित WWDC सत्र से मिली जानकारी के आधार पर, कनेक्शन का प्रयास विफल होना चाहिए।

...
let session = URLSession(configuration: .default)
...

func onDownloadAction() {
    let url = URL(string: "https://revoked.grc.com")!
    self.download(from: url) { (result, error) in
        if let result = result {
            print("result: " + result)
        } else {
            print("download failed")
            if let error = error {
                print("error: \(error)")
            }
        }
    }
}


func download(from url: URL, completion: @escaping(String?, Error?)->Void) {
    let dataTask = self.session.dataTask(with: url) { data, response, error in
        guard let data = data else {
            if let error = error {
                completion(nil, error)
                return
            }
            completion(nil, NSError(domain: "DownloadFailure", code: 0, userInfo:nil))
            return
        }

        guard let response = response as? HTTPURLResponse else {
            completion(nil, NSError(domain: "ResponseFailure", code: 0, userInfo:nil))
            return
        }
        print("http status: \(response.statusCode)")
        let res = String(bytes: data, encoding: .utf8)
        completion(res, nil)
    }
    dataTask.resume()
}

यदि हम iOS सिम्युलेटर में उपरोक्त दिनचर्या को निष्पादित करते हैं, तो हम यह जांचने के लिए Wireshark का उपयोग कर सकते हैं कि क्या CA द्वारा हस्ताक्षरित टाइम-स्टैक्ड OCSP प्रतिक्रिया TLS हैंडशेक पर स्टेपल की गई है।

साथ nslookup revoked.grc.comहम सर्वर का IP पता हो और साथ Wireshark में फ़िल्टर कर सकते हैं ip.addr==4.79.142.205

स्क्रीनशॉट में कोई भी देख सकता है, कि प्रमाणपत्र की स्थिति है revoked

वायरशार्क

तो Xcodes कंसोल पर एक नज़र डालने से निम्न आउटपुट को देख सकते हैं:

2019-10-12 21:32:25.734382+0200 OCSPTests[6701:156558] ATS failed system trust
2019-10-12 21:32:25.734526+0200 OCSPTests[6701:156558] Connection 1: system TLS Trust evaluation failed(-9802)
2019-10-12 21:32:25.734701+0200 OCSPTests[6701:156558] Connection 1: TLS Trust encountered error 3:-9802
2019-10-12 21:32:25.734787+0200 OCSPTests[6701:156558] Connection 1: encountered error(3:-9802)
2019-10-12 21:32:25.737672+0200 OCSPTests[6701:156558] Task <12408947-689F-4537-9642-C8F95E86CA62>.<1> HTTP load failed, 0/0 bytes (error code: -1200 [3:-9802])
download failed
error: Error Domain=NSURLErrorDomain Code=-1200 "An SSL error has occurred and a secure connection to the server cannot be made." UserInfo={NSURLErrorFailingURLPeerTrustErrorKey=<SecTrustRef: 0x6000037f8510>, NSLocalizedRecoverySuggestion=Would you like to connect to the server anyway?, _kCFStreamErrorDomainKey=3, _kCFStreamErrorCodeKey=-9802, NSErrorPeerCertificateChainKey=(
    "<cert(0x7fda78828200) s: revoked.grc.com i: DigiCert SHA2 Secure Server CA>",
    "<cert(0x7fda7882b200) s: DigiCert SHA2 Secure Server CA i: DigiCert Global Root CA>"
), NSUnderlyingError=0x600000be9170 {Error Domain=kCFErrorDomainCFNetwork Code=-1200 "(null)" UserInfo={_kCFStreamPropertySSLClientCertificateState=0, kCFStreamPropertySSLPeerTrust=<SecTrustRef: 0x6000037f8510>, _kCFNetworkCFStreamSSLErrorOriginalValue=-9802, _kCFStreamErrorDomainKey=3, _kCFStreamErrorCodeKey=-9802, kCFStreamPropertySSLPeerCertificates=(
    "<cert(0x7fda78828200) s: revoked.grc.com i: DigiCert SHA2 Secure Server CA>",
    "<cert(0x7fda7882b200) s: DigiCert SHA2 Secure Server CA i: DigiCert Global Root CA>"
)}}, NSLocalizedDescription=An SSL error has occurred and a secure connection to the server cannot be made., NSErrorFailingURLKey=https://revoked.grc.com/, NSErrorFailingURLStringKey=https://revoked.grc.com/, NSErrorClientCertificateStateKey=0}

iOS एक TLS त्रुटि के साथ सर्वर से कनेक्ट करने के प्रयास को रोक देता है।

टेस्ट रद्द किया गया। badssl.com

Revoked.badssl.com OCSP स्टेपलिंग का समर्थन नहीं करता है।

यदि हम https://revoked.badssl.com के प्रमाणपत्र विवरणों पर एक नज़र डालते हैं , तो हम यह पता लगा सकते हैं:

यदि कोई .crl फ़ाइल (2.5MB) डाउनलोड करता है और जारी करता है a

openssl crl -inform DER -text -in ssca-sha2-g6.crl | grep 0371B58A86F6CE9C3ECB7BF42F9208FC

कोई देख सकता है कि यह प्रमाणपत्र CRL के माध्यम से निरस्त किया गया है।

दिलचस्प है, न तो सफारी और न ही क्रोम और न ही iOS इस निरस्त स्थिति को पहचानते हैं। केवल मोज़िला फ़ायरफ़ॉक्स एक त्रुटि संदेश प्रदर्शित करता है ( सहकर्मी प्रमाणपत्र रद्द कर दिया गया है। त्रुटि कोड: SEC_ERROR_REVOKED_CERTIFICATE )।

इसका कारण यह हो सकता है कि प्रमाणपत्र को कुछ दिनों पहले ही नवीनीकृत किया गया था और इसलिए अभी तक यह सभी ब्राउज़रों और ऑपरेटिंग सिस्टमों के स्थानीय रिवोक सूचियों में अपना रास्ता नहीं खोज पाया है।


यहाँ बढ़िया जानकारी। विचारशील जवाब के लिए धन्यवाद। जैसा कि मैंने इस विषय पर शोध जारी रखा है कि मैंने आपके जैसा ही देखा है, CRL का समर्थन प्रमुख ब्राउज़रों / OS's द्वारा गिराया जा रहा है और OCSP स्टेपलिंग नया अनुशंसित सुरक्षा तंत्र प्रतीत होता है। WWDC वीडियो में Apple प्रतिनिधि बताता है: "दुर्भाग्य से हमारे प्लेटफ़ॉर्म वर्तमान में डिफ़ॉल्ट रूप से निरस्तीकरण की जाँच नहीं करते हैं"। मैंने अपने प्रयोगों के माध्यम से पाया है कि न केवल यह डिफ़ॉल्ट रूप से समर्थित नहीं है, लेकिन यह बिल्कुल भी समर्थित नहीं है (भले ही आप सेटिंग्स को बाध्य करते हों) @ स्टेफ़ेन श्लेच
अनोम
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.