Достъп до основния сертификат на 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), за да намерите какво обикновено има на устройството, но той не дава пълния сертификат. Обикновено така или иначе не искате никакъв root, а просто root за вашите сертификати, така че можете да ги изпратите директно. Но в противен случай можете да експортирате сертификатите от Mac и да ги изпратите с вашия продукт или можете да използвате втория подход по-горе. - person Rob Napier; 09.04.2012
comment
Проблемът е, че потребителят няма да се свърже с моя сървър, а с други сървъри и искам да проверя дали има валиден SSL сертификат (който не мога да предскажа предварително, поради което искам да проверя спрямо основния сертификат). Както и да е, мисля да опитам втория подход и да превключа кода си, за да използва естествени повиквания, когато е възможно, което ще се погрижи за SSL проверката вместо мен. Благодаря. - person Gilad Novik; 09.04.2012

Има няколко начина за разпространение на сертификати. Използване на имейл - изпратете сертификат като прикачен файл, докосването му ще започне процеса на инсталиране. Или като използвате браузър - навигирайте Safari до страницата, която хоства вашия сертификат, изтеглете го и инсталирайте. Можете също да използвате конфигурационни профили, за да рационализирате внедряването.

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

РЕДАКТИРАНЕ: търсене на сертификат

За да намерите ключодържател, можете да използвате SecItemCopyMatching предоставящ kSecClassCertificate и kSecAttrLabel. Плащане Намиране на сертификат в Keychain в Задачи за сертификати, ключове и доверителни услуги за 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