Как получить сертификат сервера ssl в iOS? - PullRequest
4 голосов
/ 24 февраля 2011

Я хотел бы иметь возможность получить сертификат ssl (+ цепочка, если возможно), чтобы иметь возможность отображать различающееся имя и определять, является ли он сертификатом EV. (обнаружение сертификатов EV с помощью политик сертификатов ( wikipedia )

Из того, что я видел, вам предоставляют некоторые детали сертификата, только если сертификат самоподписан.

Возможно ли использовать нижние уровни, такие как CFNetwork, для получения сертификата (ов)?

1 Ответ

9 голосов
/ 25 февраля 2011

через macnetworkprog.lists.apple.com список рассылки http://web.archiveorange.com/archive/v/x0fiWEI9emJFc36DY0UP и упомянул несколько мест на форумах разработчиков

Хорошо, политики безопасности TLS по умолчанию должно быть достаточно, но если Вы хотите принять участие в этом процессе, вы можете сделать это (на iPhone OS 3.0 и более поздних версий, а также Mac OS X 10.6), реализуя -connection:canAuthenticateAgainstProtectionSpace: и -connection:didReceiveAuthenticationChallenge: делегат колбэков, ищет NSURLAuthenticationMethodServerTrust аутентификацию способ.

Для этого:

  1. Реализация обратного вызова делегата -connection:canAuthenticateAgainstProtectionSpace:.

  2. В вашей реализации, если метод аутентификации защитное пространство NSURLAuthenticationMethodServerTrust, у вас есть два варианта:

    2a. Возврат NO и запуск алгоритма TLS по умолчанию.

    2b. Верните YES, и в этом случае будет вызван ваш обратный вызов -connection:didReceiveAuthenticationChallenge:.

Если вы хотите посмотреть сертификаты, прежде чем сделать это решение, вы можете позвонить -serverTrust на объект защиты пространства для получить объект доверия, а затем использовать SecTrust API , чтобы получить цепочка сертификатов.

  1. Если вы выберете путь 2b, будет вызван ваш -connection:didReceiveAuthenticationChallenge: обратный вызов делегата. У вас есть два варианта:

    3a. Запретите соединение, позвонив -cancelAuthenticationChallenge: на отправителя вызова.

    3b. Разрешите соединение, позвонив -useCredential:forAuthenticationChallenge: на отправителя запроса. Чтобы получить учетные данные, позвоните -[NSURLCredential initWithTrust:]. На самом деле не имеет значения, какой объект доверия вы передаете здесь; подойдет тот из защитного пространства.

Вам не нужно делать это синхронно. Вы можете просто защелкнуть вызов и возврат из вашего обратного вызова делегата, а затем решить вызов в какой-то момент в будущем.

...