आईओएस 10 के साथ शुरू, यह पीईएम निजी कुंजी आयात करने के लिए वास्तव में संभव है w/o उन्हें पीकेसीएस # 12 (जो क्रिप्टोग्राफी से संबंधित सब कुछ के लिए एक बहुत ही सार्वभौमिक कंटेनर प्रारूप है) और इस प्रकार ओपनएसएसएल का उपयोग कमांड लाइन पर या इसके साथ स्थिर रूप से लिंक करने वाले ऐप्स । मैकोज़ पर यहां उल्लेख किए गए लोगों की तुलना में एक अलग फ़ंक्शन का उपयोग करके 10.7 के बाद भी संभव है (लेकिन अब तक यह आईओएस के लिए मौजूद नहीं है)। वास्तव में नीचे वर्णित तरीका मैकोज़ 10.12 और बाद में भी काम करेगा।
एक प्रमाण पत्र आयात करने के लिए, यह सिर्फ,
-----BEGIN CERTIFICATE-----
और
-----END CERTIFICATE-----
लाइनों पट्टी तो डेटा छोड़ दिया से अधिक बेस 64 डिकोडिंग चलाने के लिए पर्याप्त है, परिणाम मानक डीईआर प्रारूप में एक प्रमाणपत्र , जिसे SecCertificateRef
प्राप्त करने के लिए केवल SecCertificateCreateWithData()
पर खिलाया जा सकता है। आईओएस 10 से पहले यह हमेशा काम कर रहा है।
एक निजी कुंजी आयात करने के लिए, थोड़ा अतिरिक्त काम की आवश्यकता हो सकती है। यदि निजी कुंजी
-----BEGIN RSA PRIVATE KEY-----
के साथ लपेटा गया है तो यह बहुत आसान है। दोबारा, पहली और आखिरी पंक्ति को छीनने की जरूरत है, शेष डेटा को बेस 64 डीकोड किया जाना चाहिए और परिणाम पीकेसीएस # 1 प्रारूप में आरएसए कुंजी है।यह प्रारूप केवल आरएसए कुंजी रख सकता है और यह सीधे पठनीय है, SecKeyRef
प्राप्त करने के लिए केवल डीकोड किए गए डेटा को SecKeyCreateWithData()
में फ़ीड करें। तो कुंजी में बिट्स की संख्या (उदाहरण के लिए 1024, 2048, आदि) के साथ CFNumberRef
:
kSecAttrKeyType
: kSecAttrKeyTypeRSA
kSecAttrKeyClass
: kSecAttrKeyClassPrivate
kSecAttrKeySizeInBits
attributes
शब्दकोश सिर्फ निम्नलिखित कुंजी/मान जोड़े की जरूरत है यदि ज्ञात नहीं है, तो यह जानकारी वास्तव में कच्चे कुंजी डेटा से पढ़ी जा सकती है, जो एएसएन .1 डेटा है (यह इस उत्तर के दायरे से थोड़ा सा है, लेकिन मैं उस प्रारूप को कैसे पार्स करने के बारे में नीचे कुछ सहायक लिंक प्रदान करूंगा)। यह मान शायद वैकल्पिक है! मेरे परीक्षणों में यह मूल्य निर्धारित करने के लिए वास्तव में आवश्यक नहीं था; अगर अनुपस्थित है, तो एपीआई ने अपने मूल्य को निर्धारित किया है और इसे हमेशा बाद में सही ढंग से सेट किया गया था।
मामले में निजी कुंजी -----BEGIN PRIVATE KEY-----
से लपेटा जाता है, तो बेस 64 एन्कोडेड डेटा PKCS # 1 स्वरूप में नहीं है लेकिन PKCS # 8 प्रारूप, तथापि, यह एक बस एक अधिक सामान्य कंटेनर है वह भी गैर RSA कुंजियों पकड़ सकते हैं, लेकिन आरएसए चाबी के लिए कि कंटेनर के भीतरी डेटा, PKCS # 1 के बराबर है तो एक आरएसए चाबी के लिए कह सकते हैं PKCS # 8 है PKCS # 1 एक अतिरिक्त हेडर के साथ और आपको बस इतना करना है कि वह अतिरिक्त हेडर अलग कर रहा है। बस बेस 64 डीकोडेड डेटा के पहले 26 बाइट्स को पट्टी करें और आपके पास PKCS # 1 फिर से है। हाँ, यह वास्तव में इतना आसान है।
पीईएम एन्कोडिंग में पीकेसीएस # एक्स प्रारूपों के बारे में अधिक जानने के लिए, have a look at this site। ASN.1 प्रारूप, here's a good site for that के बारे में अधिक जानने के लिए। और यदि आपको विभिन्न प्रारूपों के साथ खेलने के लिए एक सरल, अभी तक शक्तिशाली और इंटरैक्टिव ऑनलाइन ASN.1 पार्सर की आवश्यकता है, जो कि पीईएम डेटा को सीधे पढ़ सकता है, साथ ही आधार 64 और हेक्सडंप में ASN.1, try this site।
बहुत महत्वपूर्ण: जब कीचेन पर एक निजी कुंजी जोड़ना जो आप के रूप में ऊपर बनाया, ध्यान रखें कि इस तरह के एक निजी कुंजी एक सार्वजनिक कुंजी हैश शामिल नहीं है, अभी तक एक सार्वजनिक कुंजी हैश महत्वपूर्ण है के लिए वे चाबी का गुच्छा कृपया एक कुंजी बनाने के लिए एपीआई (SecIdentityRef
), सार्वजनिक कुंजी हैश का उपयोग करने के रूप में एपीआई को एक आयातित प्रमाणपत्र से संबंधित सही निजी कुंजी मिलती है (SecIdentityRef
एक निजी कुंजी के SecKeyRef
और संयुक्त रूप से बनाए गए प्रमाण के SecCertificateRef
है ऑब्जेक्ट और यह सार्वजनिक कुंजी हैश है, जो उन्हें एक साथ बांधता है)। तो जब आप कीचेन में निजी कुंजी जोड़ने की योजना बनाते हैं, तो सार्वजनिक कुंजी हैश मैन्युअल रूप से सेट करना सुनिश्चित करें, अन्यथा आप इसके लिए कभी भी पहचान प्राप्त नहीं कर पाएंगे और इसके बिना आप साइनइन या डिक्रिप्टिंग जैसे कार्यों के लिए कीचेन एपीआई का उपयोग नहीं कर सकते डेटा। सार्वजनिक कुंजी हैश को kSecAttrApplicationLabel
नामक एक विशेषता में संग्रहीत किया जाना चाहिए (बेवकूफ नाम, मुझे पता है, लेकिन यह वास्तव में एक लेबल नहीं है और उपयोगकर्ता कभी भी देख सकता है, दस्तावेज़ीकरण की जांच करें)। उदा।
OSStatus error = SecItemAdd(
(__bridge CFDictionaryRef)@{
(__bridge NSString *)kSecClass:
(__bridge NSString *)kSecClassKey,
(__bridge NSString *)kSecAttrApplicationLabel:
hashOfPublicKey, // hashOfPublicKey is NSData *
#if TARGET_OS_IPHONE
(__bridge NSString *)kSecValueRef:
(__bridge id)privateKeyToAdd, // privateKeyToAdd is SecKeyRef
#else
(__bridge NSString *)kSecUseItemList:
@[(__bridge id)privateKeyToAdd], // privateKeyToAdd is SecKeyRef
#endif
},
&outReference // Can also be NULL,
// otherwise reference to added keychain entry
// that must be released with CFRelease()
);
मुझे लगता है कि आपको यहां अपना उत्तर मिल जाएगा: http://stackoverflow.com/questions/1595013/iphone-how-to-create-a-seckeyref-from-a-public-key-file-pem –