Как импортировать сертификат SSL в связку ключей моего приложения - PullRequest
1 голос
/ 18 октября 2011

Я хочу импортировать сертификат SSL в связку ключей моего приложения.Я получил пример проекта от Apple, и я проверил его.Я уверен, что технически это можно сделать.Но мой вопрос заключается в том, какой подход я должен использовать при обращении к клиенту с просьбой установить сертификат.Я подумал о следующих параметрах:

-> Запрос пользователю установить учетные данные при запуске приложения.

-> Ведение страницы настроек для управления учетными данными.

Поскольку мое приложение полностью зависит от веб-служб, я не могу продолжить работу без учетных данных.Пожалуйста, оставьте свои предложения.

1 Ответ

0 голосов
/ 27 октября 2011

Попросите у поставщика сертификатов ссылку для загрузки сертификата. Просто скачайте и сохраните сертификат в своей папке ресурсов.

Нижеследующий набор фрагментов кода сделает всю работу за вас. Пожалуйста, оставляйте комментарии, если вы не понимаете ниже.

 SecIdentityRef identity = NULL;
    SecTrustRef trust = NULL;

    NSData *PKCS12Data = [NSData dataWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"test_iphone_services" ofType:@"p12"]];

//Calling the method
[Child extractIdentity:&identity andTrust:&trust fromPKCS12Data:PKCS12Data]

    + (BOOL)extractIdentity:(SecIdentityRef *)outIdentity andTrust:(SecTrustRef*)outTrust fromPKCS12Data:(NSData *)inPKCS12Data
    {
        OSStatus securityError = errSecSuccess;
//testtest is the passsword for the certificate.
        NSDictionary *optionsDictionary = [NSDictionary dictionaryWithObject:@"testtest" forKey:(id)kSecImportExportPassphrase];

        CFArrayRef items = CFArrayCreate(NULL, 0, 0, NULL);
        securityError = SecPKCS12Import((CFDataRef)inPKCS12Data,(CFDictionaryRef)optionsDictionary,&items);

        if (securityError == 0) { 
            CFDictionaryRef myIdentityAndTrust = CFArrayGetValueAtIndex (items, 0);
            const void *tempIdentity = NULL;
            tempIdentity = CFDictionaryGetValue (myIdentityAndTrust, kSecImportItemIdentity);
            *outIdentity = (SecIdentityRef)tempIdentity;
            const void *tempTrust = NULL;
            tempTrust = CFDictionaryGetValue (myIdentityAndTrust, kSecImportItemTrust);
            *outTrust = (SecTrustRef)tempTrust;

        } else {
            NSLog(@"Failed with error code %d",(int)securityError);
            return NO;
        }

        return YES;
    }

    #pragma mark - NSURLConnection Delegate Methods
    - (BOOL)connection:(NSURLConnection *)connection canAuthenticateAgainstProtectionSpace:(NSURLProtectionSpace *)protectionSpace {
        return [protectionSpace.authenticationMethod isEqualToString:NSURLAuthenticationMethodClientCertificate];
    }

    - (void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge {
        NSLog(@"trust %@", trust);
        NSURLCredential *credential;
        NSURLCredentialPersistence  persistence;
        persistence = NSURLCredentialPersistencePermanent;
        credential = [NSURLCredential credentialWithIdentity:identity certificates:nil persistence:persistence];

        NSLog(@"credential %@", credential);
     [challenge.sender useCredential:credential forAuthenticationChallenge:challenge];

    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...