iOS-управление доверенными корнями в SSL-соединении


Добавив в словарь kCFStreamPropertySSLSettings обычные kCFStreamSSLValidatesCertificatechain, kCFStreamSSLAllowsAnyRoot и т. д.-Я могу заставить работать аутентификацию сервера и клиента.

Однако я не вижу, как я могу сделать это более мелкозернистым; т. е.

  1. обнаружьте сертификат сервера / CA, который никогда не видели , и увеличьте принятие до пользователя.
  2. проверка сертификата сервера, к которому я подключен, по узкому списку доверия (например, сертификат, о котором узнали во время предыдущее подключение).

Т. е. то, что я ищу-это 1) что-то вроде SSLSetTrustedRoots() на MacOSX и 2) что-то вроде ошибки/домен обратные вызовы в kCFStreamErrorDomainSSL (например errSSLPeerCertUnknown) - ни одного, который, похоже, определенными/доступный на iPad и iPhone 4.2.1.

Или я что-то упустил ? Или мне нужно сделать что-то явное на обратном вызове ? Примеры оценены (пример AdvancedURLConnections не совсем применим - у меня есть raw (IRC) разъем).

Спасибо,

Dw.

1 3

1 ответ:

Установите kcfstreamslvalidatescertificatechain в kBooleanFalse и вручную проверьте сертификат с помощью API.

В частности, используйте

SecTrustCreateWithCertificates

С сертификатами, которые вы получаете от

CFReadStreamCopyProperty(readStream, kCFStreamPropertySSLPeerCertificates);

Тогда вы можете использовать

SecTrustSetAnchorCertificates

И, наконец, вызовите

SecTrustEvaluate