2012-04-05 21 views
10

द्वारा सही रूप से आयात करने के लिए एक वैध पी 12 फ़ाइल कैसे बनाएं I XML PSA निजी कुंजी को पीईएम फ़ाइल में परिवर्तित करने की मेरी प्रीवियोस समस्या हल हो गई है, लेकिन मैं एक और समस्या में चलाता हूं कि मुझे पी 12 निजी कुंजी आयात करते समय शून्य डेटा मिलता है। बाद मेरे कदमों है:SecPKCS12Import

openssl> pkcs12 -export -in rsa.pem -inkey rsa.pem -out rsa.p12 -nocerts 
  • पढ़ें P12 फ़ाइल आईओएस परियोजना के लिए

    NSString *path = [[NSBundle bundleForClass:[self class]]  
            pathForResource:@"MyPrivateKey" ofType:@"p12"]; 
    NSData *p12data = [NSData dataWithContentsOfFile:path]; 
    if (![self getPrivateKeyRef]) 
        RSAPrivateKey = getPrivateKeywithRawKey(p12data); 
    
  • आयात P12 P12 फाइल करने के लिए

    1. Convert पीईएम फ़ाइल निजी कुंजी

      SecKeyRef getPrivateKeywithRawKey(NSData *pfxkeydata) 
      { 
          NSMutableDictionary * options = [[[NSMutableDictionary alloc] init] autorelease]; 
      
          // Set the public key query dictionary 
          //change to your .pfx password here 
          [options setObject:@"MyPassword" forKey:(id)kSecImportExportPassphrase]; 
      
          CFArrayRef items = CFArrayCreate(NULL, 0, 0, NULL); 
      
          OSStatus securityError = SecPKCS12Import((CFDataRef) pfxkeydata, 
                    (CFDictionaryRef)options, &items); 
      
          CFDictionaryRef identityDict = CFArrayGetValueAtIndex(items, 0); 
          SecIdentityRef identityApp = 
          (SecIdentityRef)CFDictionaryGetValue(identityDict, 
                   kSecImportItemIdentity); 
          //NSLog(@"%@", securityError); 
      
          assert(securityError == noErr); 
          SecKeyRef privateKeyRef; 
          SecIdentityCopyPrivateKey(identityApp, &privateKeyRef); 
      
          return privateKeyRef; 
      
      } 
      

    सोचा कि कोई त्रुटि नहीं थी (OSStatus मान 0 है), लेकिन आइटम सरणी को कोई पहचान डेटा नहीं मिला। मैं सोच रहा हूं कि गलत ओपनएसएसएल उपयोग के कारण मुझे सही पी 12 फ़ाइल प्रारूप नहीं मिला है। क्या किसी ने सफलतापूर्वक पी 12 फाइल आयात की है? मैं इस समस्या में कुछ दिनों तक फंस गया हूं, अगर आपको सुराग मिल जाए तो कृपया मुझे सलाह दें, धन्यवाद!

    हुबर्ट

  • +0

    OpenSSL उपयोग के बारे में: 1) इनपुट कुंजी निश्चित रूप से नहीं अपने इनपुट प्रमाण पत्र के रूप में ही 2) डॉक हो जाएगा कहते हैं '-nocerts' पैदा करेगा नहीं आउटपुट पर प्रमाण पत्र; क्या आपने इसके बिना कोशिश की? – MrTJ

    उत्तर

    8

    मैं इंटरनेट से कुछ सुझाव मिल गया, और निम्न आईओएस स्वीकार्य p12 कुंजी और प्रमाणन फ़ाइल पाने के लिए कदम है: पीईएम
    शैल> संकलन XMLSpec2PEM को

    1. परिवर्तित एक्सएमएल। जावा
      शैल> XMLSpec2PEM rsa.xml

      rsa.pem को आउटपुट परिणाम को बचाने (here से उधार)

    2. परिवर्तित आरएसए निजी कुंजी के लिए पीईएम
      OpenSSL> आरएसए -इन rsa.pem आउट rsaPrivate.key

    3. एक प्रमाणीकरण अनुरोध
      OpenSSL> अनुरोध -नया -कुंजी rsaPrivate.key आउट rsaCertReq उत्पन्न .crt
      (इनपुट कुछ बुनियादी प्रमाणीकरण डेटा) अनुरोध के

    4. साइन प्रमाणीकरण
      OpenSSL> X509 -req -days 3650 -इन rsaCertReq.crt -signkey rsaPrivate.key RSAC आउट ert.crt

    5. डीईआर (आईओएस स्वीकार्य प्रारूप)
      OpenSSL> X509 -outform der -इन rsaCert.crt आउट rsaCert.der

    6. PKCS12 निजी कुंजी उत्पन्न (में कनवर्ट प्रमाणीकरण फ़ाइल स्वरूप आईओएस स्वीकार्य प्रारूप)
      OpenSSL> PKCS12 निर्यात आउट rsaPrivate.pfx -inkey rsaPrivate.key -इन rsaCert.crt

    आगे कोई कदम, फ़ाइलें पीढ़ी चरण 5 और 6 में टेड अब आईओएस में इस्तेमाल किया जा सकता है!OpenSSL निर्देश के

    संदर्भ:
    http://blogs.yaclife.com/?tag=ios%E3%80%80seckeyref%E3%80%80raw%E3%80%80key%E3%80%80rsa%E3%80%803des

    http://devsec.org/info/ssl-cert.html

    +1

    हबर्ट की रिपोर्टिंग के लिए धन्यवाद। यह एक एक्सएमएल एन्कोडेड निजी कुंजी को आंतरिक प्रतिनिधित्व में बदलने के लिए एक बहुत ही चौंकाने वाला तरीका है, लेकिन यह सही होना चाहिए और मुझे यकीन नहीं है कि क्या कोई और मजबूत तरीका है (उद्देश्य सी में रूपांतरण दिनचर्या लिखने के बाहर)। ओह, आप थोड़ी देर के बाद अपने जवाब स्वीकार कर सकते हैं! –

    +0

    मुझे लगता है कि जवाब हाँ होगा। मैंने ऊपर जो किया है वह सिर्फ ओपनएसएल कमांड लाइन टूल का उपयोग करने के लिए इसे एक वैध कुंजी प्रारूप के रूप में परिवर्तित करने के लिए उपयोग करता है, इसलिए ऑपरेशंस openssl api के साथ किया जा सकता है। मैंने ऐसा इसलिए नहीं किया क्योंकि मुझे केवल एक बार ऐसा करने की ज़रूरत है। –

    +0

    मेरे मामले में, चरण 2 "पीईएम को आरएसए प्राइवेट कुंजी में कनवर्ट करें" इनपुट फ़ाइल के रूप में सटीक उसी आउटपुट फ़ाइल का उत्पादन करता है। फिर भी, सभी चरणों का पालन करने के बाद उत्पादित पी 12 फाइल बिल्कुल वही थी जो मुझे अपने आईओएस ऐप के लिए जरूरी थी और यह पोस्ट ढूंढना एक बड़ी मदद थी। –