2012-09-10 13 views
5

मैं एक आईफोन ऐप बना रहा हूं जिसे प्रमाणीकृत करने के लिए .bks कीस्टोर की आवश्यकता है। मुझे आईओएस ऐप्स के लिए इस जानकारी के बारे में कुछ भी नहीं मिला।का उपयोग करना। आईफोन ऐप में बीएसएस कीस्टोर सर्टिफिकेट

मैं जानना चाहता हूं कि क्या सेब अपने ऐप्स में कीस्टोरों के उपयोग की अनुमति देता है और आईओएस पर कैसे शुरू किया जाए। प्रमाणपत्र BouncyCastle का उपयोग कर बनाए जाते हैं। मैंने एंड्रॉइड के लिए इसके बारे में जानकारी प्राप्त की लेकिन आईओएस के लिए मुझे कोई भाग्य नहीं मिला। किसी भी तरह की सहायता को आभार समझेंगे।

उत्तर

2

आप प्रमाणपत्र (रों) आप इस

keytool -exportcert -keystore <keystore> -file some.cer 

आप स्टोर प्रकार और दुकान प्रदाता, look here के बारे में Keytool बताने के लिए आवश्यकता हो सकती है जैसे कीस्टोर से जरूरत का निर्यात कर सकता है।

आप इस कोड के साथ आईओएस कीचेन में है कि .cer फ़ाइल पढ़ सकते हैं:

- (void) importCertToKeyChain: (NSData *) data 
{ 
    // Delete the old certificate, otherwise SecItemAdd complains. 
    OSStatus oss = SecItemDelete((__bridge CFDictionaryRef)([self clientCertificateQuery])); 

    // Import the certificate 
    SecCertificateRef certRef = NULL; 
    certRef = SecCertificateCreateWithData(NULL, (__bridge CFDataRef)(data)); 

    NSDictionary *att = [NSDictionary dictionaryWithObjectsAndKeys: (__bridge id)(kSecClassCertificate), kSecClass, (__bridge id) certRef, kSecValueRef, nil]; 

    oss = SecItemAdd((__bridge CFDictionaryRef)(att), NULL); 
} 

जब आप प्रमाण पत्र की जरूरत है आप इस तरह कीचेन से प्राप्त कर सकते हैं:

- (SecCertificateRef) getCertFromKeyChain 
{ 
    CFTypeRef ref = NULL; 
    SecItemCopyMatching((__bridge CFDictionaryRef)([self clientCertificateQuery]), &ref); 

    return (SecCertificateRef) ref; 
} 

clientCertificateQuery दिखता है इस तरह।

static NSString *clientCertSubject = @"TestSubjectClient"; 

-(NSMutableDictionary *) clientCertificateQuery 
{ 
    NSMutableDictionary *query = [[NSMutableDictionary alloc] init]; 
    [query setObject:(__bridge id) kSecClassCertificate forKey:(__bridge id)kSecClass]; 
    [query setObject:clientCertSubject forKey:(__bridge id<NSCopying>)(kSecMatchSubjectContains)]; 
    [query setObject:[NSNumber numberWithBool:YES] forKey:(__bridge id)kSecReturnRef]; 
id)kSecAttrKeyType]; 
    return query; 
} 

वहाँ भी एक PCKS12 दुकान (आप अभी भी उस प्रारूप में अपने बीकेएस दुकान को बदलने के लिए की आवश्यकता होगी) को पढ़ने के लिए एक समारोह है। इसे SecPKCS12Import कहा जाता है और इसके साथ आपको अपने आईओएस कीचेन में प्रमाणपत्र आयात करने की आवश्यकता नहीं होगी। मुझे इसके साथ कोई भाग्य नहीं था और फिर भी चाबी में प्रमाण की आवश्यकता थी, लेकिन यहां something about this है।

अद्यतन:

camdaochemgio के रूप में जब एक प्रमाण पत्र है कि गुप्त सूचना (निजी कुंजी) की तरह होता है एक अनुप्रयोग में सहित विधि से ऊपर उपयोग करने की अनुशंसा नहीं है टिप्पणी में बताया। क्योंकि .cer फ़ाइल सुरक्षित नहीं है और आसानी से .ipa से निकाला जा सकता है।

पीकेसीएस # पी 12 पासवर्ड सुरक्षा का समर्थन करता है, इसलिए इसका उपयोग करना बेहतर है।

आप इस तरह PKCS # P12 (from here लिया गया) को अपना कुंजी गुप्त कर सकते हैं:

keytool -importkeystore -srckeystore KEYSTORE.jks -destkeystore KEYSTORE.p12 -srcstoretype BKS -deststoretype PKCS12 -srcstorepass mysecret -deststorepass mysecret -srcalias myalias -destalias myalias -srckeypass mykeypass -destkeypass mykeypass -noprompt 

तो फिर तुम .p12 फ़ाइल इस तरह (क्रेडिट here जाना) लोड कर सकते हैं

// Load Certificate 
NSString *path = [[NSBundle mainBundle] pathForResource:@"cert" ofType:@"p12"]; 
NSData *p12data = [NSData dataWithContentsOfFile:path]; 
CFDataRef inP12data = (__bridge CFDataRef)p12data; 

// Only password based PKCS#12 blobs are supported 
CFStringRef password = CFSTR("Password"); 
const void *keys[] = { kSecImportExportPassphrase }; 
const void *values[] = { password }; 
CFDictionaryRef options = CFDictionaryCreate(NULL, keys, values, 1, NULL, NULL); 

// The import 
CFArrayRef items = CFArrayCreate(NULL, 0, 0, NULL); 
OSStatus securityError = SecPKCS12Import(inP12data, options, &items); 

if (securityError == 0) 
{ 
    // Exploring the content 
    CFDictionaryRef myIdentityAndTrust = CFArrayGetValueAtIndex(items, 0); 
    const void *tempIdentity = NULL; 
    tempIdentity = CFDictionaryGetValue(myIdentityAndTrust, kSecImportItemIdentity); 
    *identity = (SecIdentityRef)tempIdentity; 
    const void *tempTrust = NULL; 
    tempTrust = CFDictionaryGetValue(myIdentityAndTrust, kSecImportItemTrust); 
    *trust = (SecTrustRef)tempTrust; 
} 

if (options) { 
    CFRelease(options); 
} 

अंतिम लेकिन कम से कम इस विषय के बारे में कुछ लिंक नहीं:

+0

इस तरह क्योंकि प्रमाणपत्र फ़ाइल मुख्य बंडल में संग्रहीत किया जाता है, सुरक्षित नहीं है। कोई भी बंडल निकालने के बाद फ़ाइल के बिना फ़ाइल प्राप्त कर सकता है। एंड्रॉइड के रूप में कीस्टोर बेहतर है, लेकिन मुझे आईओएस में कीस्टोरों को नहीं पता है। कोई उपाय? –

+0

@camdaochemgio ठीक है, मैंने पीसीकेएस 12 स्टोर्स के साथ काम करने के तरीके को पोस्ट किया है। – sofacoder

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