2017-02-24 5 views
11

में प्रोग्रामिक रूप से रूट सीए प्रमाण पत्र पढ़ें निम्नलिखित कोड मैकोज़ में रूट प्रमाणपत्र पढ़ता है।आईओएस

मुझे आश्चर्य है कि आईओएस में समकक्ष कोड क्या हैं?

https://github.com/HaxeFoundation/hxcpp/blob/7bd5ff3/src/hx/libs/ssl/SSL.cpp#L455-L491

CFMutableDictionaryRef search; 
CFArrayRef result; 
SecKeychainRef keychain; 
SecCertificateRef item; 
CFDataRef dat; 
sslcert *chain = NULL; 

// Load keychain 
if(SecKeychainOpen("/System/Library/Keychains/SystemRootCertificates.keychain",&keychain) != errSecSuccess) 
    return null(); 

// Search for certificates 
search = CFDictionaryCreateMutable(NULL, 0, NULL, NULL); 
CFDictionarySetValue(search, kSecClass, kSecClassCertificate); 
CFDictionarySetValue(search, kSecMatchLimit, kSecMatchLimitAll); 
CFDictionarySetValue(search, kSecReturnRef, kCFBooleanTrue); 
CFDictionarySetValue(search, kSecMatchSearchList, CFArrayCreate(NULL, (const void **)&keychain, 1, NULL)); 
if(SecItemCopyMatching(search, (CFTypeRef *)&result) == errSecSuccess){ 
    CFIndex n = CFArrayGetCount(result); 
    for(CFIndex i = 0; i < n; i++){ 
     item = (SecCertificateRef)CFArrayGetValueAtIndex(result, i); 

     // Get certificate in DER format 
     dat = SecCertificateCopyData(item); 
     if(dat){ 
      if(chain == NULL){ 
       chain = new sslcert(); 
       chain->create(NULL); 
      } 
      mbedtls_x509_crt_parse_der(chain->c, (unsigned char *)CFDataGetBytePtr(dat), CFDataGetLength(dat)); 
      CFRelease(dat); 
     } 
    } 
} 
CFRelease(keychain); 
if(chain != NULL) 
    return chain; 
+0

चूंकि आपने जो कोड दिखाया है वह सीपीपी में लिखा गया है, तब भी आप इसका उपयोग सीधे कर सकते हैं क्योंकि सीपीपी में उपयोग किए गए सभी कीवर्ड ऐप्पल से 'सुरक्षा.फ्रेमवर्क' से आते हैं, क्या आपने इसका उपयोग करने की कोशिश की है, आप पूरी तरह से उपयोग कर सकते हैं 'SSL.cpp'? मुझे लगता है कि यह आपके लिए काम करेगा। – iphonic

+0

'/ सिस्टम/लाइब्रेरी/कीचेन्स/SystemRootCertificates.keychain' बस आईओएस पर मौजूद नहीं है। या कम से कम आप इसे पढ़ नहीं सकते हैं क्योंकि सब कुछ सैंडबॉक्स है। – KevinResoL

उत्तर

3

मुझे डर लग रहा है कि यह आईओएस में एक समान एप्लिकेशन पारिस्थितिकी तंत्र को देखते हुए ऐसा करना संभव नहीं होगा सैंडबॉक्स है।

अपने उद्देश्यों को जानने के बिना, इसे निपटाने के लिए सामान्य दृष्टिकोण apple.com/certificateauthority से सेब रूट प्रमाणपत्र डाउनलोड कर रहा है और फिर इसे पढ़ने के लिए इसे अपने ऐप में संग्रहीत कर रहा है।

आपको प्रेरणा देने के लिए यह article देखें।

पीएस: यदि यह जेलब्रोकन हो तो आईओएस डिवाइस में ऐसा करना संभव हो सकता है।

+0

उद्देश्य आईओएस में mbedtls (जिसे पहले पोलारएसएसएल के नाम से जाना जाता है) का उपयोग करना है। चूंकि mbedtls को रूट CA को फ़ंक्शन करने की आवश्यकता होती है। पोस्ट किया गया मैकोज़ कोड उस सटीक चीज़ को करता है। – KevinResoL

+0

[वे] (https://github.com/robotmedia/RMStore/blob/master/RMStore/Optional/RMAppReceipt.m#L247) समान कार्य कर रहे हैं। यह आपको प्रेरित कर सकता है। एक विकल्प के रूप में आप इसे मामले में डीईआर प्रारूप में परिवर्तित कर सकते हैं। – Ricowere

+0

वह उदाहरण इंटरनेट से केवल एक रूट प्रमाण (ऐप्पल एक) डाउनलोड करता है, या ऐप के अंदर इसे बंडल करता है। तो यह मेरी आवश्यकता से काफी अलग है। (मुझे डिवाइस में संग्रहीत सभी रूट कर्टों की आवश्यकता है) – KevinResoL

2

Security.framework से फ़ंक्शन Security.framework जो आपको सिस्टम में संग्रहीत रूट प्रमाणपत्र पुनर्प्राप्त करने देता है केवल मैकोज़ पर उपलब्ध है। उत्सुकता से, यह कुछ कार्यों में से एक है (संबंधित कार्यों के सेट से) जो आईओएस पर उपलब्ध नहीं है। जानबूझकर, कौन जानता है?

+0

क्षमा करें, मुझे काफी कुछ नहीं मिला है। मेरे कोड ने 'SecTrustCopyAnchorCertificates' का उपयोग नहीं किया है, इसलिए मुझे यकीन नहीं है कि आपने इसका उल्लेख क्यों किया। या दूसरे शब्दों में, क्या आपका मतलब है कि मेरे मूल प्रश्न का कोई समाधान नहीं है क्योंकि कुछ एपीआई बस आईओएस पर उपलब्ध नहीं हैं? – KevinResoL

+0

हां। मैकोज़ पर, सिस्टम में रूट प्रमाणपत्र पुनर्प्राप्त करने के विभिन्न तरीके हैं। आईओएस के सैंडबॉक्स प्रतिबंधों के कारण आपके प्रश्न में कोड स्निपेट आईओएस पर काम नहीं करेगा। 'SecTrustCopyAnchorCertificates' और 'SecTrustSettingsCopyCertificates' दो फ़ंक्शन हैं जो आपको आईओएस पर रूट प्रमाणपत्र पुनर्प्राप्त करने की क्षमता दे सकते हैं; लेकिन जो भी कारणों से, वे आईओएस पर उपलब्ध नहीं हैं। –