2016-08-03 26 views
0

Ich brauche zwei Funktionen eine, die das Zertifikat p12 in iOS-Schlüsselbund und die andere Funktion speichert das gespeicherte p12-Zertifikat.Beispiel-Funktion zum Speichern und Abrufen eines P12-Zertifikats in Schlüsselbund - Objective C

-(BOOL)addItem:(NSData*)item forKey:(NSString*)key { 
NSMutableDictionary *dict = [self newItemDictionaryForKey:key]; 
[dict setObject:item forKey:(id)kSecValueData]; 
OSStatus ossstatus = SecItemAdd((CFDictionaryRef)dict, NULL); 
if(errSecSuccess != ossstatus) { 
    NSLog(@"Unable to add item for key %@ %ld request dict:%@",key,ossstatus,dict); 
} 
return (errSecSuccess == ossstatus); 

}

Zu der obigen Funktion i die NSData sende, dass ich von p12-Datei.

+0

Als ich versuchte, NSData aus dem p12-Zertifikat zu erhalten und es in dem Schlüsselbund steckt es nicht zu akzeptieren ist –

+0

" Als ich versuchte, NSData aus dem p12-Zertifikat zu holen und es in den Schlüsselbund zu legen, akzeptiert es es nicht "gibt nicht viel Hinweis darauf, was du tatsächlich versucht hast, wie werden die Leute dir helfen, dein Problem herauszufinden? Zeigen Sie Ihren Code, beschreiben Sie den Fehler. Hilf den Menschen, dir zu helfen. – CRD

Antwort

0

Sie haben dies in zwei Aufgaben aufgeteilt:

  1. Converting-Zertifikat von p12 Daten SecIdentityRef. Mit diesem kann ich helfen
  2. Speichern Sie privaten Schlüssel und Zertifikatskette in Schlüsselbund - I'm struggling with this too, aber ich bin Paar Schritte voraus mit Ihnen zu vergleichen.

eine Konvertierung ausführen zu können, hier ist ein Code, ich verwende:

- (NSError *)setClientIdentityCertificateFromPKCS12Data: (NSData *)PKCS12Data withPassword: (NSString *)password 
{ 
    OSStatus securityError = errSecSuccess; 

    const void *keys[] = { kSecImportExportPassphrase }; 
    const void *values[] = { (__bridge CFStringRef)password }; 
    CFDictionaryRef optionsDictionary = NULL; 

    optionsDictionary = CFDictionaryCreate(
              NULL, keys, 
              values, (password.length!=0 ? 1 : 0), 
              NULL, NULL); 
    CFArrayRef items = NULL; 

    securityError = SecPKCS12Import((__bridge CFDataRef)PKCS12Data, 
            optionsDictionary, 
            &items); 

    if (securityError == 0) { 
     CFDictionaryRef identityDic = (CFDictionaryRef)CFArrayGetValueAtIndex(items, 0); 

     SecIdentityRef secIdentity = (SecIdentityRef)CFDictionaryGetValue(identityDic, kSecImportItemIdentity); 
     CFArrayRef identityCertChain = (CFArrayRef)CFDictionaryGetValue(identityDic, kSecImportItemCertChain); 

     securityError = [self setClientIdentity: secIdentity withCertificateChain: identityCertChain]; 
    } 

    if (optionsDictionary) { 
     CFRelease(optionsDictionary); 
    } 

    if (items) { 
     CFRelease(items); 
    } 

    NSError *error = nil; 
    if (securityError != errSecSuccess) 
    { 
     NSDictionary *info = nil; 
#if !TARGET_OS_IPHONE 
     NSString *errorDescription = nil; 
     errorDescription = (__bridge_transfer NSString *)SecCopyErrorMessageString(securityError, NULL); 
     if (errorDescription) 
     { 
      info = @{ NSLocalizedDescriptionKey:errorDescription }; 
     } 
#endif 
     error = [NSError errorWithDomain: NSOSStatusErrorDomain 
            code: securityError 
           userInfo: info]; 
    } 

    return error; 
}