2012-06-13 16 views
7

क्या मैं टर्मिनल पर एक मैक के माध्यम से निम्न आदेश रन दोहराने है क्या करने की कोशिश कर रहा हूँ, लेकिन iPhone पर/कोको में:दोहराने OpenSSL SMIME आदेश

openssl smime -binary -sign -signer cert.pem -inkey key.pem -in file.txt -out encrypted -outform DER 

जहां "एन्क्रिप्टेड" एन्क्रिप्टेड फ़ाइल है जो कमांड से परिणाम देती है।

हालांकि यह 2 अलग-अलग कुंजी (सार्वजनिक और निजी कुंजी) निर्दिष्ट करता है, लेकिन इन्हें एक .p12 फ़ाइल के रूप में रखना संभव है।

this कोकोआ स्निपेट .p12 प्रमाणपत्र का उपयोग कर फ़ाइल को एन्क्रिप्ट करने के बाद, मुझे यकीन है कि यह सही तरीका है या नहीं।

किसी आईफोन (ऊपर टर्मिनल कमांड के अनुसार) पर स्माइम कमांड को दोहराने के लिए सबसे अच्छा तरीका क्या है, या यह उपलब्ध Security.framework/CommonCrypto विधियों के माध्यम से भी संभव नहीं है?

+0

उत्तर को नहीं पता लेकिन आपके पासकिट एप्लिकेशन पर शुभकामनाएँ! –

उत्तर

3

जहां तक ​​मुझे पता है - आप एक क्रीक हैं - ऐपस्टोर में पैडल लॉक हो गया है।

  • आईओएस CMSEncoderAddSigners का अभाव है, CMSEncoderUpdateContent, CMSEncoderCopyEncodedContent जो आप इस के लिए की जरूरत है।
  • ओपनएसएल या चिलकट का उपयोग करना आदर्श नहीं है - क्योंकि आईओएस की कीचेन एपीआई आपको एक बार आयात की जाने वाली निजी कुंजी तक पहुंच नहीं देती है।

मैंने इसे अतीत में ओपनस्ल और चिलकट दोनों के साथ हल किया है।

प्रत्येक मामले में हालांकि मैं निजी कुंजी की एक प्रति कैश करता हूं - जैसे ही यह चाबी में जाता है - मैं वापस प्राप्त कर सकता हूं एक सेककीरफ (आपको सेब के साथ एक अतिरिक्त अनुबंध/अनुमति में प्रवेश करने की आवश्यकता है इसे वापस पाने में सक्षम है और अभी भी ऐपस्टोर में है। लिंक करने के लिए विधियों/ढांचे को देखने के लिए किसी भी वीपीएन (उदाहरण के लिए जूनियर वन) ऐप्स को रिवर्स इंजीनियर करें।

openssl के लिए - बस openssl के ऐप्स में smime.c कोड ले लो और संशोधित करें। Chilkat बातों के लिए बहुत आसान कर रहे हैं:

CkoCert * mine = [identity ckoCert]; 

    assert([mime AddEncryptCert: mine] == YES); 

    for(id cc in backupCerts) { 
     assert([mime AddEncryptCert:cc] == YES); 
    } 

    for(id key in [headers allKeys]) { 
     [mime SetHeaderField:[NSString stringWithFormat:@"%s%@", X_HDR_PREFIX, key] 
         value:[headers objectForKey:key] 
     ]; 
    }; 

    [mime SetBodyFromBinary:data];   
    assert([mime EncryptN] == YES); 

    return [mime GetMimeBytes]; 

और 'रखने के अपने स्वयं के कैश' जहां पहचान क्षेत्र है धोखा:

-(id)initWithPKCS12:(NSData*)pkcs12der password:(NSString *)password { 
    if (password == nil) 
     password = [APPSETTINGS wellKnownPkcsPassword]; 

    NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys: 
          password, kSecImportExportPassphrase, 
          nil]; 

    CFArrayRef items; 
    OSStatus status = SecPKCS12Import((__bridge CFDataRef)pkcs12der, 
     (__bridge CFDictionaryRef)options, &items); 

    if (status != noErr) { 
     NSLog(@"PKCS12 importAsDer failed: Error %ld",(long)status); 
     ... 
    } 

    if (!items || CFArrayGetCount(items) < 1) { 
     NSLog(@"PKCS12 importAsDer failed - nothing returned (%ld bytes DER)", 
       (long)[pkcs12der length]); 
     ... 
    } 

    CFDictionaryRef dict0 = (CFDictionaryRef) CFArrayGetValueAtIndex(items, 0); 
    if (!dict0) 
     return nil; 

    SecIdentityRef iRef = (SecIdentityRef) CFDictionaryGetValue(dict0, 
      kSecImportItemIdentity); 
    CFArrayRef cRef = (CFArrayRef) CFDictionaryGetValue(dict0, kSecImportItemCertChain); 

    self = [self initWithIdentityRef:iRef withChainArrayRef:cRef]; 
    CFRelease(items); 

#if TARGET_OS_IPHONE 
    // We lack SecPrivate* on iOS. So we cheat a bit - rather than 
    // use the keychain we limt ourselves to our own *.p12's and 
    // keep a copy of the private key in memory. 
    // 
# ifdef WITH_OPENSSL 

    const unsigned char * ptr = [pkcs12der bytes]; 
    PKCS12 * p12 = d2i_PKCS12(NULL, &ptr, len); 
    char buff[1024]; 

    if (!p12) { 
     NSLog(@"Could not decode PKCS#12: %s", ERR_error_string(ERR_get_error(), buff)); 
     ... 
    }; 

    const char * pass = [password cStringUsingEncoding:NSASCIIStringEncoding]; 

    if (PKCS12_parse(p12, pass, &pkey, &x509, NULL) != 1) { 
     NSLog(@"Could not parse PKCS#12: %s", ERR_error_string(ERR_get_error(), buff)); 
     ... 
    }; 
    .... 
# else 
    ckoCert = [[CkoCert alloc] init]; 

    if (!([ckoCert LoadPfxData:pkcs12der password:[APPSETTINGS wellKnownPkcsPassword]])) { 
     NSLog(@"PKCS12 loadPfxData failed: %@", [ckoCert LastErrorText]); 
     ... 
    } 

    ckoPrivateKey = [ckoCert ExportPrivateKey]; 
# endif // chilkat or openssl 
#endif // iOS 

    return self; 
} 

चेतावनी: ऊपर मैं छीन लिया है सबसे MNGT/त्रुटि प्रबंधन में और/या इसे आवेषण द्वारा प्रतिस्थापित किया गया है अन्यथा यह थोड़ा बहुत तेज़ हो गया है।

धन्यवाद,

डीडब्ल्यू।

संबंधित मुद्दे