Кодировки 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}" ...