Сертификат SSL для запуска HTTPS-сервера на iOS - PullRequest
6 голосов
/ 26 марта 2012

Я пытаюсь создать HTTPS-сервер в приложении для iOS , чтобы действовать в качестве прокси-сервера между моим веб-приложением и внешним сервером.

Мне удалось создать HTTP-сервер, прослушивая сокет, либо благодаря CFSocketRef, либо с помощью библиотеки GCDAsyncSocket. Мне также удалось создать приложение Mac, работающее на сервере HTTPS, с использованием библиотеки GCDAsyncSocket и благодаря моему методу «secureSocket:», ниже которого защищено соединение:

- (void)socket:(GCDAsyncSocket *)sock didAcceptNewSocket:(GCDAsyncSocket *)newSocket
{
    // (...)
    // secure the connection
    [self secureSocket:newSocket];
    // (...)
}

- (void)secureSocket:(GCDAsyncSocket *)sock
{
    // The root self-signed certificate I have created
    NSString *certificatePath = [[NSBundle mainBundle] pathForResource:@"certificate" ofType:@"cer"];
    NSData *certData = [[NSData alloc] initWithContentsOfFile:certificatePath];
    CFDataRef certDataRef = (CFDataRef)certData;
    SecCertificateRef cert = SecCertificateCreateWithData(NULL, certDataRef);
    [certData release];

    // the "identity" certificate
    SecIdentityRef identityRef;
    SecIdentityCreateWithCertificate(NULL, cert, &identityRef);

    // the certificates array, containing the identity then the root certificate
    NSArray *certs = [[NSArray alloc] initWithObjects:(id)identityRef, (id)cert, nil];

    // the SSL configuration
    NSMutableDictionary *settings = [NSMutableDictionary dictionaryWithCapacity:3];
    [settings setObject:[NSNull null] forKey:(NSString *)kCFStreamSSLPeerName];
    [settings setObject:[NSNumber numberWithBool:YES] forKey:(NSString *)kCFStreamSSLAllowsAnyRoot];
    [settings setObject:[NSNumber numberWithBool:YES] forKey:(NSString *)kCFStreamSSLAllowsExpiredRoots];
    [settings setObject:[NSNumber numberWithBool:YES] forKey:(NSString *)kCFStreamSSLAllowsExpiredCertificates];
    [settings setObject:[NSNumber numberWithBool:NO] forKey:(NSString *)kCFStreamSSLValidatesCertificateChain];
    [settings setObject:(NSString *)kCFStreamSocketSecurityLevelNegotiatedSSL forKey:(NSString*)kCFStreamSSLLevel];
    [settings setObject:certs forKey:(NSString *)kCFStreamSSLCertificates];
    [settings setObject:[NSNumber numberWithBool:YES] forKey:(NSString *)kCFStreamSSLIsServer];

    [sock startTLS:settings];
    [certs release];
}

Используемый мной сертификат представляет собой самозаверяющий SSL-сертификат сервера, который я создал с помощью Keychain Access. Итак, я понимаю, что должен предоставить системе набор конфигурации с массивом, содержащим удостоверение и сертификат. И он отлично работает в моем приложении Mac.

Проблема в том, чтобы включить SSL на HTTP-сервере моего приложения для iOS. Метод "SecIdentityCreateWithCertificate ()", который создает идентичность, не существует на iOS, и я не знаю, как создать идентичность другим способом.

Как создать SecIdentityRef на iOS (чтобы включить сторону сервера SSL)? Я что-то пропустил , например, для хранения открытого / закрытого ключа в моем приложении, или что-то еще? Большое вам спасибо.

Ответы [ 2 ]

4 голосов
/ 02 мая 2012

Я выложу отдельный ответ, так как комментарии не подходят для обмена кодом.
Вот что я использую для импорта моей PKCS12:

CFArrayRef keyref = NULL;
OSStatus sanityChesk = SecPKCS12Import((__bridge CFDataRef)p12Data, 
                                       (__bridge CFDictionaryRef)[NSDictionary 
                                                                  dictionaryWithObject:password 
                                                                  forKey:(__bridge id)kSecImportExportPassphrase], 
                                       &keyref);

if (sanityChesk != noErr) {
    NSLog(@"Error while importing pkcs12 [%d]", sanityChesk);
    return nil;
}

NSArray *keystore = (__bridge_transfer NSArray *)keyref;

Полное содержимое p12 будет в хранилище ключей массив.

0 голосов
/ 27 марта 2012

Похоже, вам нужно импортировать удостоверение, используя файл PKCS # 12.См. Листинг 2-2 в https://developer.apple.com/library/ios/#documentation/Security/Conceptual/CertKeyTrustProgGuide/iPhone_Tasks/iPhone_Tasks.html#//apple_ref/doc/uid/TP40001358-CH208-SW13.

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