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