iOS: SocketRocket — как реализовать SSL-рукопожатие

только что перешел на веб-сокеты в сочетании с Protobufs. Работает как шарм на IOS, но я не уверен, как реализовать SSL-рукопожатие (например, с NSURLConnection) через SocketRocket Lib. Есть ли у кого-то опыт с этим или это просто еще не поддерживается.

Соединение TSL уже работает, и закрепление SSL также будет работать, но как реализовать правильное рукопожатие SSL, правильно проверив цепочку SSL с помощью веб-сокетов через SocketRocket?!

BR


person Chris K.    schedule 21.10.2014    source источник
comment
возможный дубликат закрепления сертификата SocketRocket и iOS   -  person arik    schedule 25.02.2015


Ответы (1)


РЕДАКТИРОВАТЬ: исправление ошибки в моем предыдущем ответе.

CFStream, который Socket Rocket использует в фоновом режиме, будет автоматически обрабатывать рукопожатие, предполагая, что сертификат был добавлен в цепочку ключей. Если вам нужно добавить сертификат, см. ответ на этот вопрос: iOS: Предварительно установите SSL-сертификат в цепочке для ключей — программно

Однако, если Pinning — это то, что вы ищете, это легко сделать с помощью Socket Rocket. Используйте инициализатор initWithURLRequest, и все остальное будет обработано автоматически. Для закрепленных сертификатов SocketRocket не проверяет цепочку сертификатов, что является желаемым поведением, потому что при закреплении вы конкретно говорите, что доверяете этому сертификату или сертификату, подписанному только этим сертификатом. то есть он не полагается на проверку цепочки.

    NSURL *url = [NSURL URLWithString: ServerSocketURLString];
    NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:url];

    NSString *cerPath = [[NSBundle mainBundle] pathForResource:@"certificatefilename" ofType:@"cer"];
    NSData *certData = [[NSData alloc] initWithContentsOfFile:cerPath];
    CFDataRef certDataRef = (__bridge CFDataRef)certData;
    SecCertificateRef certRef = SecCertificateCreateWithData(NULL, certDataRef);
    id certificate = (__bridge id)certRef;

    [request setSR_SSLPinnedCertificates:@[certificate]];

    self.clientWebSocket = [[SRWebSocket alloc] initWithURLRequest:request];

    self.clientWebSocket.delegate = self;
person Praneeth Wanigasekera    schedule 23.10.2014