Примите ненадежный сертификат сервера SSL с сокетом CFStream на iOS - PullRequest
5 голосов
/ 08 марта 2012

Мне нужно открыть сокет-соединение CFStream с сервером с недоверенным корнем CA.У меня есть сертификат сервера, и я могу создать структуру SecCertificateRef из него.Проблема в том, как настроить свойства потока.

Я думаю, мне следует установить для свойства kCFStreamPropertySSLSettings значение CFDictionary, которое, в свою очередь, содержит ключ kCFStreamSSLCertificates.Этот ключ должен содержать «CFArray of SecCertificateRefs за исключением первого элемента в массиве, который является SecIdentityRef» в соответствии с документацией.Теперь я могу создать SecCertificateRef из сертификата сервера, который я отправлю с приложением, но как получить SecIdentityRef?Я предполагаю, что это должен быть идентификатор клиента, но я абсолютно не хочу аутентификацию на стороне клиента на данный момент.И я не могу найти способ подачи CFStream только с сертификатом сервера.

Обратите внимание, я не хочу добавлять ненадежный сертификат в цепочку для ключей и не отключать kCFStreamSSLValidatesCertificateChain в настройках.Мне нужно принять аутентификацию сервера, только если она основана на данных моего сертификата сервера, загруженных с диска, и только на этом CFStream.

Ответы [ 2 ]

3 голосов
/ 21 августа 2013

В основном вам необходимо:

  1. отключить оценку доверия по умолчанию, используя kCFStreamSSLValidatesCertificateChain
  2. получить объект доверия (kCFStreamPropertySSLPeerTrust) после подключения к потоку (но перед отправкой любогоданные, т. е. для событий kCFStreamEventCanAcceptBytes или kCFStreamEventHasBytesAvailable)
  3. установить самозаверяющий корневой сертификат в качестве доверенного якоря для этого объекта доверия
  4. при желании вы можете добавить собственные политики SSL вобъект доверия (например, имя хоста не совпадает с сертификатом CN), но если вы делаете это, важно, чтобы вы сделали это до установки доверенного якоря, или вы можете получить kSecTrustResultRecoverableTrustFailure результат
  5. оценить объект доверия (SecTrustEvaluate) и результат проверки равен либо kSecTrustResultProceed, либо kSecTrustResultUnspecified
3 голосов
/ 16 марта 2012

У меня нет прямого ответа на ваш вопрос, но, возможно, несколько рекомендаций:

  1. Зачем вам нужно использовать API CFStream, а не более интуитивно понятный NSURLConnection ?
    Из того, что я мог найти в документации, он выглядит так, как будто не все, что доступно для Mac OS X, относительно API CFStream, доступно для iOS. Так что подумайте и посмотрите, сможете ли вы переключиться на NSURLConnection: -)

  2. Для NSURLConnection вы можете использовать методы NSURLConnectionDelegate , чтобы получить запрос SSL и самостоятельно проверить сертификат. Вы можете проверить проект wsdl2objc , где я реализовал следующие функции:

  3. Теперь о ваших вопросах: -)
    Я не вижу, как вы можете установить собственный (ненадежный) CA в kCFStreamPropertySSLSettings . Я не уверен, что это можно сделать с помощью kCFStreamSSLCertificates , поскольку он предназначен для установки сертификатов на стороне клиента (таким образом, требуется наличие SecIdentityRef для индекса 0, который в основном предоставляет закрытый ключ).

  4. Когда вы говорите, что не хотите добавлять сертификат в цепочку для ключей, вы имеете в виду вручную или программно? Полагаю, вам не нравится, что пользователям вашего приложения приходится делать это вручную, но вы можете использовать API безопасности для программного импорта сертификата. В этом случае ваш сертификат будет импортирован в изолированную цепочку для ключей, которая доступна только для вашего приложения. (опять же, не уверен, что это сработает, но стоит попробовать)

В своих приложениях я использую NSURLConnectionDelegate для ручной проверки недоверенных сертификатов.

С уважением,
Pece

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