Я пытаюсь создать 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)? Я что-то пропустил , например, для хранения открытого / закрытого ключа в моем приложении, или что-то еще? Большое вам спасибо.