iOS VPN प्रोफ़ाइल: पासवर्ड नहीं, passwordReference
कीचेन संदर्भ एक हैंडल है, रहस्य नहीं। बाइट भेजना -50 त्रुटि, रीबूट की विफलता और सहेजी गई VPN प्रोफ़ाइलों में रोटेशन के जाल को समझाता है।
आप एक प्रोफ़ाइल इंस्टॉल करते हैं, टनल ऊपर आता है, और सब कुछ पूरा लगता है। फिर फ़ोन रीबूट होता है, on-demand बिना किसी ऐप के फ़ोरग्राउंड में कनेक्शन जगाता है, और टनल शुरू होने से इनकार कर देता है। प्रोफ़ाइल अब भी वहीं है और पासवर्ड अब भी सही है, इसीलिए यह विफलता लोगों को गलत जगह खोजने भेजती है। Network Extension आपका रहस्य प्रोफ़ाइल से नहीं पढ़ सकता: उसे कीचेन का एक संदर्भ चाहिए जिसे वह स्वयं हल कर सके।
नीचे दिया गया वॉकथ्रू उसी सौंपे जाने से होकर एक कनेक्शन प्रयास का पीछा करता है, संदर्भ बनाने वाली क्वेरी से लेकर उसे परखने वाले रीबूट तक।
प्रोफ़ाइल हैंडल रखती है, रहस्य नहीं
NEVPNProtocol किसी कारण से passwordReference और sharedSecretReference को खोलता है। जब डेमॉन टनल शुरू करता है तो हो सकता है वह आपकी प्रक्रिया के भीतर न चल रहा हो, इसलिए वह आपका कोड बुलाकर पासवर्ड नहीं माँग सकता। वह कीचेन का एक स्थायी संदर्भ पढ़ता है, उसे अपने संदर्भ में हल करता है और आइटम स्वयं लाता है।
आप वह संदर्भ कीचेन से माँगकर बनाते हैं, जो डेटा माँगने से अलग अनुरोध है:
let query: [String: Any] = [
kSecClass as String: kSecClassGenericPassword,
kSecAttrService as String: "vpn-credentials",
kSecAttrAccount as String: "user",
kSecReturnPersistentRef as String: true,
kSecMatchLimit as String: kSecMatchLimitOne
]लौटाई गई वस्तु प्रोटोकॉल को दें, आइटम का डेटा नहीं। व्यवहार में प्रोफ़ाइल दर्ज करती है कि रहस्य कहाँ रहता है, इसीलिए कॉन्फ़िगरेशन का बैकअप पासवर्ड को चुपचाप plist में नकल नहीं करता।
API -50 क्यों उत्तर देता है
errSecParam का अर्थ है कि अनुरोध या मान उस क्रिया के लिए विकृत था, और संदर्भ व डेटा के अनुरोध गड्ड-मड्ड होने पर यही त्रुटि सबसे अधिक दिखती है। जब प्राप्त करने वाला कोड संदर्भ की अपेक्षा कर रहा हो तब डेटा माँगना, passwordReference में कच्चे बाइट रखना, या ऐसे एक्सेस ग्रुप के साथ क्वेरी करना जिसे ऐप उपयोग नहीं कर सकता—ये सब उसे पैदा करते हैं।
रैपर लाइब्रेरीज़ इसके लिए निमंत्रण देती हैं। बाइट लौटाने वाला सहायक संदर्भ लौटाने वाले के साथ बदला नहीं जा सकता, इसलिए सुधार आमतौर पर दूसरा पासवर्ड नहीं, दूसरी क्वेरी होती है।
यही असंगति उस प्रोफ़ाइल को समझाती है जो बिना शिकायत सहेजी जाती है और फिर कनेक्ट नहीं होती: सहेजा गया ब्लॉब है, हैंडल नहीं, और डेमॉन के पास हल करने को कुछ नहीं है।
अच्छी तरह सहेजती है, कनेक्ट होते समय विफल
सहेजना आपके ऐप का संदर्भ इस्तेमाल करता है। कनेक्ट होना डेमॉन का, और दोनों की पहुँच एक नहीं है। इसलिए प्रोफ़ाइल सिम्युलेटर में आपके हर परीक्षण को पार कर सकती है और पहले on-demand शुरू होने पर विफल हो सकती है।
रीबूट के लक्षण का आकार भी यही है: यह तब तक काम करता है जब तक ऐप खुला है और मर जाता है जब सिस्टम स्वयं टनल शुरू करता है।
जारी करने से पहले बैकग्राउंड पथ को जानबूझकर परखें। ऐप बंद रखकर on-demand कनेक्शन भड़काएँ, फिर ऐप का लॉग नहीं बल्कि डिवाइस कंसोल पढ़ें, क्योंकि विफलता उसी प्रक्रिया द्वारा दर्ज होती है जिसने संदर्भ हल करने की कोशिश की। यदि कंसोल दिखाता है कि डेमॉन आइटम को अस्वीकार कर रहा है, तो संदर्भ ठीक है और समस्या आइटम की ऍक्सेसिबिलिटी है।
रीबूट काम करेगा या नहीं, यह ऍक्सेसिबिलिटी तय करती है
टनल शुरू करने वाली किसी भी सिस्टम प्रक्रिया के लिए आइटम पठनीय होना चाहिए, और ऐप के फ़ोरग्राउंड में रहने की तुलना में यह व्यापक दर्शक है। वही बाध्यता आपके लिए ऍक्सेसिबिलिटी विशेषता चुनती है। पहले अनलॉक तक सुरक्षित आइटम डिवाइस के एक बार अनलॉक होने के बाद बैकग्राउंड शुरुआत के लिए उपलब्ध है; जो आइटम माँगता है कि डिवाइस अभी अनलॉक हो, वह उपलब्ध नहीं है।
अधिक कड़ी श्रेणी चुनना लुभावना है और वही लॉक किए फ़ोन पर on-demand प्रोफ़ाइल तोड़ता है।
श्रेणी बदलने के बाद मौजूदा आइटम के गुण संपादित करने के बजाय आइटम फिर से बनाएँ, फिर नए संदर्भ के साथ प्रोटोकॉल दोबारा सहेजें। मौजूदा आइटम पर गुण परिवर्तन हमेशा वह व्यवहार नहीं देते जो दस्तावेज़ संकेत करते हैं, और फिर से बना आइटम संदेह हटा देता है।
रोटेशन वह जगह है जहाँ सहेजी गई प्रोफ़ाइलें सड़ती हैं
कीचेन में पासवर्ड बदलने से सहेजी गई प्रोफ़ाइल जिस ओर इशारा करती है वह अपने आप नहीं बदलता। आइटम हटाना और बुरा है: प्रोफ़ाइल ऐसी चीज़ का संदर्भ रखती है जो अब नहीं है, और विफलता प्रमाणीकरण की अस्वीकृति जैसी दिखती है।
एक ही क्रम में रोटेट करें। आइटम अपडेट करें, नया स्थायी संदर्भ क्वेरी करें, प्रोटोकॉल दोबारा सहेजें, फिर ऐप बंद रखकर कनेक्ट करें ताकि साबित हो कि डेमॉन अब भी उसे हल कर सकता है। उपयोगकर्ता का पासवर्ड और साझा रहस्य अलग-अलग आइटम में रखें ताकि हर एक अपने समय-चक्र पर घूमे, और क्वेरी शब्दकोश या स्वयं संदर्भ को कभी लॉग न करें। हैंडल रहस्य नहीं है, पर वह उसका नक्शा है।