Доступ к корневому сертификату Apple на iOS

Я нашел следующий код: https://github.com/roddi/ValidateStoreReceipt/blob/master/validatereceipt.m, который загружает корневой сертификат («Apple Root CA») в MacOS.

и я пытаюсь заставить его работать и на iOS.

Наш код написан на C++ и использует OpenSSL для проверки удаленного узла при использовании сокетов SSL.

На других платформах мы загружаем корневой сертификат и добавляем его в контекст с помощью X509_STORE_add_cert.

Затем мы используем SSL_get_peer_certificate и проверяем имя хоста. Это НЕ самозаверяющие сертификаты, поэтому мы хотим использовать корневой сертификат устройства.

Мой вопрос: как получить корневой сертификат на устройствах iOS?

РЕДАКТИРОВАТЬ:

Я пробовал следующий запрос, но все равно получаю -25300 (errSecItemNotFound).

NSDictionary* query=[NSDictionary dictionaryWithObjectsAndKeys:
                     (__bridge id)kSecClassCertificate,kSecClass,
                     kCFBooleanTrue,kSecReturnRef,
                     kSecMatchLimitAll,kSecMatchLimit,
                     kCFBooleanTrue,kSecMatchTrustedOnly,
                     nil];
SecItemCopyMatching((__bridge CFDictionaryRef)query,&ref);

person Gilad Novik    schedule 30.03.2012    source источник


Ответы (2)


Вам понадобится что-то в этом роде:

  • Найдите сертификаты, используя SecItemCopyMatching() с kSecMatchTrustedOnly, установленным на kCFBooleanTrue. Помните, что это будет множество сертификатов, а не один.
  • Затем экспортируйте их в формат DER с помощью SecCertificateCopyData().
  • Импортируйте их в OpenSSL
  • Выгода

Как вариант, можно пойти другим путем:

  • Преобразование сертификата в DER с помощью OpenSSL
  • Создайте SecCertificateRef с SecCertificateCreateWithData()
  • Создайте SecPolicyRef с SecPolicyCreateSSL()
  • Создайте SecTrustRef с SecTrustCreateWithCertificates()
  • Оценить с помощью SecTrustEvaluate()
  • Выгода

Или, конечно, вы также можете управлять SSL-соединением с помощью NSURLConnection или CFNetwork (доступно непосредственно в C++), и система сделает все за вас автоматически. По возможности я рекомендую не использовать OpenSSL на iOS, потому что это создает большую сложность. Но вышеизложенное должно помочь вам соединиться, если вам нужно.

person Rob Napier    schedule 08.04.2012
comment
Я пробовал это, но не нашел совпадений (проверьте мое редактирование). - person Gilad Novik; 09.04.2012
comment
Мне жаль; имел Mac OS X на мозгу. В iOS у вас нет доступа ни к какой цепочке ключей, кроме цепочки ключей вашего приложения. Таким образом, вы не можете получить список сертификатов с устройства. Вы можете использовать список, который я связал (HT5012), чтобы найти то, что обычно находится на устройстве, но он не дает полного сертификата. Как правило, вам все равно не нужен корень, вам просто нужен корень для ваших сертификатов, чтобы вы могли отправлять их напрямую. Но в противном случае вы можете экспортировать сертификаты с Mac и поставлять их вместе с вашим продуктом, или вы можете использовать второй подход, описанный выше. - person Rob Napier; 09.04.2012
comment
Проблема в том, что пользователь будет подключаться не к моему серверу, а к другим серверам, и я хочу проверить, есть ли у него действительный сертификат SSL (который я не могу предсказать заранее, поэтому я хочу проверить корневой сертификат). В любом случае, я думаю, что попробую второй подход и переключу свой код на использование собственных вызовов, когда это возможно, что позаботится о проверке SSL для меня. Спасибо. - person Gilad Novik; 09.04.2012

Существует несколько способов распространения сертификатов. Использование электронной почты - отправьте сертификат в виде вложения, нажав на него, начнется процесс установки. Или с помощью браузера — перейдите в Safari на страницу, на которой размещен ваш сертификат, загрузите его и установите. Вы также можете использовать профили конфигурации для упрощения развертывания.

Подробнее об этом читайте в разделе iPad для бизнеса, прокрутите вниз до раздела Distributing and Installing Certificates.

EDIT: поиск сертификата

Чтобы найти элемент связки ключей, вы можете использовать SecItemCopyMatching, обеспечивающий kSecClassCertificate и kSecAttrLabel. Оформить заказ Поиск сертификата в связке ключей в Задачи сертификатов, ключей и служб доверия для iOS

person tenorsax    schedule 06.04.2012
comment
Я знаю, как загрузить предоставленный сертификат, мой вопрос заключался в том, как загрузить СУЩЕСТВУЮЩИЙ корневой сертификат. Я не хочу связывать сертификат со своим приложением, я хочу использовать сертификат Apple. - person Gilad Novik; 07.04.2012
comment
Я неверно истолковал ваш вопрос. Посмотрите, может ли моя правка о SecItemCopyMatching помочь вам. - person tenorsax; 08.04.2012
comment
Я пробовал это, но не нашел совпадений (проверьте мое редактирование). - person Gilad Novik; 09.04.2012