Кодировки CodeSign между Developer и Enterprise Distribution
Моя компания использует одну машину для сборки (Mac Mini) в качестве CI node для создания нашего приложения iOS. В настоящее время мы создаем конфигурацию Ad-Hoc и App Store на мини. Недавно мы зарегистрировались в Enterprise Program и хотим начать создание конфигурации Enterprise. Однако процесс сборки теперь терпит неудачу, потому что теперь у нас есть два сертификата под названием "iPhone Distribution: Widget Corporation". Один из них - это сертификат распространения для AdHoc/AppStore, а один для Enterprise (Apple называет его внутренним).
Я пробовал модифицировать мини-брелки, так что один сертификат находится в цепочке логина входа и один находится в новой цепочке ключей, называемой "enterprise", но это просто сдвинуло ошибку с начала сборки:
CodeSign error: Certificate identity 'iPhone Distribution: Widget Corporation' appears more than once in the keychain.
до конца сборки:
iPhone Distribution: Widget Corporation: ambiguous (matches "iPhone Distribution: Widget Corporation" in /Users/hudson.admin/Library/Keychains/login.keychain and "iPhone Distribution: Widget Corporation" in /Users/hudson.admin/Library/Keychains/enterprise.keychain)
Мой вопрос в том, есть ли способ правильно изолировать эти два сертификата, чтобы я мог создавать версии Ad-Hoc, App Store и In-House приложения на одном компьютере. Единственное возможное решение, которое я еще должен попробовать, - это фактически объединить сертификаты вместе с источником и использовать security
для добавления и удаления сертификатов по мере необходимости; очевидно, что решение не очень красиво и создает риски для безопасности.
Любые идеи?
Ответы
Ответ 1
После обсуждения с технической поддержкой Apple Developer они посоветовали создать отдельные брелки для размещения разных сертификатов, а затем передать аргумент --keychain filename
на шаг codesign
, чтобы указать соответствующий файл. Этот аргумент можно передать в Xcode или xcodebuild с помощью параметра OTHER_CODE_SIGN_FLAGS
. например:
xcodebuild -target "<targetname>" -configuration "<configname>" \
PROVISIONING_PROFILE=A3A47A82-E91F-4E95-8559-601C6C857053 \
OTHER_CODE_SIGN_FLAGS="--keychain=/Users/username/Library/Keychains/enterprise.keychain" \
build
Кроме того, после создания новой связки ключей, по умолчанию, по умолчанию происходит переключение после 5 минут - вы можете изменить это, если у вас есть сборки, которые занимают некоторое время.
Ответ 2
Другим способом, который помог мне, было дать идентификатор подписи как хэш SHA1 для кодового обозначения.
Шаги:
- Найти хэш SHA1 в доступе к цепочке ключей требуемого сертификата
- Сравните хэш SHA1 с возвратом:
security find-identity -v -p codesigning
- Используйте правильный SHA1 с шага 2 для кода:
codesign -s "SHA1_FROM_STEP2" ...
Ответ 3
После разговора с командой xcode на WWDC они предложили гораздо более простое решение - я мог бы запросить переименование моего корпоративного сертификата, чтобы не было столкновения.
Для этого обратитесь в Службу разработчика, нажав ссылку "Управление своей учетной записью" на странице контактов , затем выберите "Портал обеспечения iOS" в качестве темы - они сделал это для меня в течение дня, когда я спрашивал.
Это намного проще, чем любой другой способ - теперь у меня есть оба набора сертификатов в моей цепочке ключей, и я могу с радостью построить для дистрибутива appstore или enterprise, не делая ничего, кроме выбора правильного объекта для кодов с помощью.
Ответ 4
У меня было много проблем с этим. Вероятно, лучшим решением является просто попросить Apple, чтобы ваш сертификат был переименован, но если вы не хотите иметь дело с этим, я использовал другое решение. У меня есть папка, в которой я экспортировал как обычные, так и корпоративные сертификаты. Затем вы можете удалить сертификат, который вы не используете, и импортировать другой. Может быть, это больше хлопот, но обычно я только распространяю приложения на предприятии, так что это не так много проблем.
Кстати, что я делаю, чтобы удалить сертификат, выберите фильтр сертификатов, который затем отобразит связанный закрытый ключ, а затем я удалю как сертификат, так и ключ. Если я удалю только сертификат, Xcode продолжает его создавать снова.
Ответ 5
Чтобы уточнить ответ homer_simpson: можно напрямую вычислить SHA1 вашего файла .p12 (без использования вызовов security
), а затем подать результат на codesign
или xcrun
. Вот выдержка из моей автообъекта script:
# get SHA1 of .p12 file and pass it to PackageApplication to prevent ambiguity in cert selection
# sample output of openssl: SHA1 Fingerprint=14:B0:58:D1:F9:1D:A5:74:0A:AA:BE:B9:F2:7A:7E:AD:58:82:A2:25
# fingerprint (everything after =) is extracted with cut, and : are removed with sed
# ${IDENTITY} is a variable that contains path to your .p12 file. passphrase is empty in this case.
P12_SHA=$(openssl pkcs12 -in "${IDENTITY}" -nodes -passin pass: | openssl x509 -noout -fingerprint -sha1 | cut -d = -f 2 | sed -e 's/://g')
/usr/bin/xcrun -sdk iphoneos PackageApplication -s "${P12_SHA}" ...