Книга: iOS. Приемы программирования
Обсуждение
Обсуждение
Каждый талон требуется подписывать с помощью сертификата, созданного в разделе 19.1. Для подписывания талонов мы вновь будем использовать команду openssl в окне терминала. Перед тем как читать дальше, убедитесь в том, что создали каталог pass и поместили в него файлы pass.json, manifest.json и все изображения. Этот каталог не обязательно должен называться pass. Тем не менее, чтобы было удобнее читать этот раздел и оставшиеся разделы этой главы, лучше не импровизировать и назвать этот каталог с файлами именно pass.
Некоторые читатели могли запутаться в том, куда относятся некоторые ключи и для чего нужны те или иные сертификаты. Надеюсь, в этом разделе ситуация прояснится. Когда вы запрашиваете новый сертификат на портале инициализации iOS, в связке ключей на вашем компьютере создается закрытый ключ, а также файл запроса на подпись сертификата (CSR). Сертификат будет сгенерирован Apple. Когда вы скачаете файл сертификата, он будет иметь расширение. cer. Это просто сертификат! Когда вы импортируете его в связку ключей, результирующий файл будет иметь расширение. p12. В этом файле будут содержаться и сертификат, и закрытый ключ к нему.
Прежде чем мы вплотную займемся процессом подписывания, нам потребуется экспортировать созданный сертификат из связки ключей. Не забывайте, что сертификат, полученный вами на портале инициализации iOS, — это не тот самый сертификат, который экспортируется из связки ключей. Поэтому при экспорте сертификата для идентификатора типа талона обязательно выполните следующие шаги.
1. Откройте на Mac программу для доступа к связке ключей (Keychain Access).
2. В левой верхней части окна в области Keychains (Связки ключей) убедитесь, что вы выбрали связку ключей для входа в систему (Login Keychain).
3. В области Category (Категория) слева выберите My Certificates (Мои сертификаты).
4. Найдите ваш сертификат для идентификатора типа талона в правой части экрана и щелкните на нем правой кнопкой мыши.
5. Теперь выберите функцию Export (Экспортировать) (рис. 19.14) и завершите экспорт вашего файла на диск в виде файла. p12. Не сохраняйте сертификат в каталоге pass. Сертификат должен находиться вне этого каталога.
Рис. 19.14. Экспорт сертификата идентификатора типа талона из программы Keychain Access
6. После того как вы попытаетесь экспортировать свой сертификат, система запросит у вас два пароля: пароль, который требуется задать для сертификата, и пароль вашей учетной записи пользователя в OS X — это должен быть пользователь, владеющий доступом к связке ключей. Первый пароль, сопровождающий сертификат, гарантирует, что без этого пароля сертификат нельзя будет импортировать на произвольную машину. Второй пароль удостоверяет, что человек, импортирующий сертификат из связки ключей, действительно имеет на это право. Например, если вы отойдете от компьютера, оставив его незаблокированным, а ваш приятель попытается экспортировать сертификат из вашей связки ключей, для этого ему придется указать пароль вашей учетной записи. В любом случае рекомендуется гарантировать, что у разных учетных записей в одной системе разные пароли. Например, если вы с братом работаете на одном и том же Mac, то ваш пароль должен быть уникальным именно для вашей учетной записи. Если пароль у вас будет одинаковым, это поставит под сомнение всю систему безопасности вашего компьютера.
Убедитесь, что не сохраняете сертификат в каталоге pass. Нельзя рассылать сертификат вместе с талоном.
Итак, вы экспортировали сертификат. У вас должен был получиться файл, который, возможно, называется Certificates.p12. Теперь нужно разделить этот файл на сертификат как таковой и закрытый ключ. Однако если вы подписываете талон с помощью OpenSSL, то вам приходится передавать сертификат и закрытый ключ по отдельности. Чтобы получить из файла Certificates.p12 закрытый ключ и сертификат (этот файл мы только что экспортировали из программы Keychain Access), выполните следующее.
1. Откройте окно терминала, если еще не сделали этого.
2. Перейдите в каталог, в котором вы сохранили экспортированный сертификат (файл. p12).
3. Чтобы получить сертификат, введите в окне терминала следующую команду:
openssl pkcs12 — in «Certificates.p12» — clcerts — nokeys
— out «exported-certificate»
После того как вы введете эту команду, система сразу же потребует у вас присвоить экспортированному сертификату пароль. В этом примере я задаю пароль 123, но вы придумайте пароль получше.
4. Чтобы получить закрытый ключ из сертификата, экспортированного из связки ключей, выполните в окне терминала следующую команду:
openssl pkcs12 — in «NAME OF YOUR.P12 CERTIFICATE FILE»
— nocerts — out «NAME OF THE OUTPUT KEY»
Я назвал экспортированный закрытый ключ exported-key, но вы можете назвать его и иначе, если желаете:
openssl pkcs12 — in «Certificates.p12» — nocerts — out «exported-key»
От вас вновь потребуется ввести пароли для ключа. Для моего ключа я указал пароль 1234, чтобы его можно было легко запомнить. Такой же пароль я задал для сертификата. Но если вы работаете в организации, где безопасности уделяется должное внимание, такой пароль вам, разумеется, не подойдет. Выберите пароль, который кажется вам осмысленным. Для максимальной защиты необходимо гарантировать, что все пароли для экспортируемых вами сертификатов/ключей являются уникальными.
Замечательно. Теперь у нас есть файлы экспортированного сертификата и закрытого ключа. Можем перейти к подписыванию талона с их помощью. Чтобы это сделать, выполните следующие шаги.
1. Если вы еще не сделали этого, поместите все файлы, относящиеся к талону (pass.json, manifest.json и все соответствующие изображения), в каталог pass. Вы можете назвать этот каталог как хотите, но в рамках этого раздела рекомендую давать создаваемым каталогам такие же названия, какие даю я. Так нам будет проще ориентироваться, в каком каталоге мы находимся и что делаем в окне терминала.
2. Воспользуйтесь командой cd, чтобы перейти из текущего рабочего каталога в каталог pass, где находятся все интересующие нас файлы талона.
3. Выполните команду rm — f.DS_Store, чтобы убедиться, что в каталоге pass отсутствуют ненужные скрытые системные файлы OS X. Вы также должны проверить, перечислены ли все файлы из этого каталога в файле manifest.json, где наряду с самими файлами должны находиться и их SHA1-хеши. Если в этот каталог просочатся какие-то другие файлы (как перечисленные в файле описания, так и не указанные там), то талон получится недействительным. Его не удастся прочитать в приложении Passbook ни на устройстве с iOS, ни на симуляторе.
4. Выполните в окне терминала следующую команду, чтобы сгенерировать в каталоге pass файл signature:
openssl smime — binary — sign — signer «PATH TO YOUR EXPORTED CERTIFICATE»
— inkey «PATH TO YOUR EXPORTED PRIVATE KEY» — in manifest.json
— out signature — outform DER
Эта команда должна выполняться в каталоге pass, где находятся все ваши ресурсы, связанные с талоном. Экспортированный сертификат и закрытый ключ — это тот сертификат и тот ключ, которые были извлечены из сертификата, экспортированного из связки ключей. Не указывайте в этой команде сертификат в том виде, в каком он был экспортирован из связки ключей. Ранее мы уже рассмотрели, как извлекать реальный сертификат и закрытый ключ из файла. p12, экспортированного из связки ключей. Можете перечитать этот фрагмент раздела, чтобы проверить, все ли вы делаете правильно.
На последнем этапе система запросит у вас пароль к закрытому ключу. Помните его? Вы задавали этот пароль, когда извлекали закрытый ключ из сертификата, экспортированного из связки ключей. Теперь эта команда создаст файл signature в каталоге pass. Почти все готово. Остается заархивировать подготовленный каталог в виде файла с расширением. pkpass. Для этого выполните следующие шаги.
1. Откройте окно терминала и с помощью команды cd перейдите в каталог pass.
2. Чтобы запаковать ваш каталог pass в файл pass.pkpass, выполните в текущем каталоге следующую команду:
zip — r pass.pkpass. -x '.DS_Store'
В результате все файлы талона будут упакованы в архив pass.pkpass. Вновь необходимо убедиться в том, что в готовом архиве не будет файла. DS_Store.