iOS - управление доверенными корнями по SSL-соединению - PullRequest
3 голосов
/ 11 декабря 2010

Добавляя в словарь kCFStreamPropertySSLSettings обычный kCFStreamSSLValidatesCertificateChain, kCFStreamSSLAllowsAnyRoot и т. Д., Я могу заставить работать проверку подлинности сервера и клиента.

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

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

т.е. то, что я ищу, это 1) что-то вроде SSLSetTrustedRoots () в MacOSX и 2) что-то вроде обратных вызовов error / domain в kCFStreamErrorDomainSSL (например, errSSLPeerCertUnknown) - ни один, который не представляется определенным / доступным на ipad / iphone 4.2.1.

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

Спасибо

Dw.

1 Ответ

1 голос
/ 23 января 2011

Установите для kCFStreamSSLValidatesCertificateChain значение kBooleanFalse и вручную проверьте сертификат с помощью API.

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

SecTrustCreateWithCertificates

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

CFReadStreamCopyProperty(readStream, kCFStreamPropertySSLPeerCertificates);

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

SecTrustSetAnchorCertificates

и, наконец, позвонить

SecTrustEvaluate
...