Sign in Join
Wiki copytemporary

Code Signing for macOS/ru: what changed

Revision 1 to 2. Removed lines have a minus sign; added lines have a plus sign.

OldNewLine
11> **Note:** Для требований нотариального заверения Apple для расширений ядра и приложений, начиная с Mojave 10.14.5 (для расширений ядра от 7 апреля 2019 г. и для разработчиков, чье первое использование их сертификата подписи кода произошло с 7 апреля 2019 г.) и для всего программного обеспечения, начиная с Catalina 10.15 и выше, которое не распространяется через App Store, см. [[Notarization for macOS 10.14.5+/ru|Нотариальное заверение для macOS 10.14.5+]]
22
33## Предисловие
44
55**[[Code signing]]** (подписание кода) обеспечивает как подлинность, так и целостность исполняемых файлов, загруженных из глобальных сетей, таких как Интернет. Приведенное ниже обсуждение в равной степени относится как к распространению в App Store, так и к распространению вне App Store.
66
77Подписание кода требуется в [[Portal:iOS|iOS]]. В [[Portal:Mac|macOS]] и более поздних версиях он позволяет открывать программы, загруженные из Интернета, без каких-либо предупреждений (если они подписаны сертификатом, выданным Apple), и требуется при использовании определенных функций (например, API-интерфейсы, используемые отладчиками; обратите внимание, что в этом случае достаточно самозаверяющего сертификата, помеченного как «доверенный»). Эту функцию выполняет программное обеспечение Apple Gatekeeper.
88
99## Процесс развития Gatekeeper
1010
1111Gatekeeper (Привратник), впервые представленный в Mountain Lion (10.8, 2012 г.), представляет собой функцию безопасности Mac, предназначенную для защиты компьютеров Apple от вредоносного программного обеспечения. Привратник проверяет приложения по списку приложений, которые Apple одобрила для своего App Store или код которых был подписан разработчиками, имеющими сертификаты, выпущенные Apple, если приложение не предлагается через магазин приложений. Он не выполняет никаких проверок безопасности сам по себе, за исключением того, что приложение не было изменено с момента его подписания разработчиком, и не дает никаких гарантий в отношении разработчика, кроме того, что он платит Apple 99 долларов США в год (он же "Идентифицированный разработчик").
1212
1313Первоначальные параметры Gatekeeper, представленные в Mountain Lion, доступ к которым можно получить из настроек "Безопасность" "Конфиденциальность" \> "Общее", были следующими:
1414
1515- App Store
1616- App Store и признанные разработчики
1717- Anywhere (кто угодно)
1818
1919Выбрав опцию **Anywhere**, пользователь когда-то мог полностью отключить Gatekeeper. Настройка по умолчанию разрешала запуск приложений только из App Store или от разработчика, подписавшего свое приложение с помощью сертификата, выданного Apple.
2020
2121Когда в 2016 году была выпущена macOS Sierra, Apple внесла несколько важных изменений в Gatekeeper и ограничила параметры Gatekeeper следующим образом:
2222
2323- App Store
2424- App Store и признанные разработчики
2525
2626Однако вы можете восстановить отсутствующую опцию Gatekeeper **Anywhere** в настройках, открыв терминал и выполнив команду:
2727
2828`$ sudo spctl --master-disable`
2929
30-которая по-прежнему работает до macOS Catalina включительно. Лучшей, как и более безопасной, альтернативой было вместо этого обойти Gatekeeper, открыв приложение из контекстного меню по клику правой кнопки мыши, или по клику с зажатой <span class="kbd">Ctrl</span>. Это по-прежнему вызывало бы диалоговое окно предупреждения, но теперь оно бы содержало кнопку **Открыть** для успешного запуска приложения. Этот метод обхода Gatekeeper по-прежнему работает в macOS Catalina, за исключением того, что в Catalina вам нужно запустить приложение во второй раз, удерживая <span class="kbd">Ctrl</span> или щелкнув правой кнопкой мыши, чтобы успешно обойти Gatekeeper - при первом запуске приложения Gatekeeper не может быть обойден независимо от того, удерживаете ли вы <span class="kbd">Ctrl</span> или щелкаете правой кнопкой мыши или нет.
30+которая по-прежнему работает до macOS Catalina включительно. Лучшей, как и более безопасной, альтернативой было вместо этого обойти Gatekeeper, открыв приложение из контекстного меню по клику правой кнопки мыши, или по клику с зажатой `Ctrl`. Это по-прежнему вызывало бы диалоговое окно предупреждения, но теперь оно бы содержало кнопку **Открыть** для успешного запуска приложения. Этот метод обхода Gatekeeper по-прежнему работает в macOS Catalina, за исключением того, что в Catalina вам нужно запустить приложение во второй раз, удерживая `Ctrl` или щелкнув правой кнопкой мыши, чтобы успешно обойти Gatekeeper - при первом запуске приложения Gatekeeper не может быть обойден независимо от того, удерживаете ли вы `Ctrl` или щелкаете правой кнопкой мыши или нет.
3131
3232### Big Sur и более новые ОС на процессорах Apple M1 ARM64
3333
3434И тогда Apple изменила правила игры.
3535
3636Когда Big Sur запущена на процессоре Apple M1 (ARM64), **весь нативный код ARM64 должен быть подписан, иначе операционная система не позволит его выполнение**; и пользователи не могут обойти это новое требование Gatekeeper. Разработчики могут обойти его, выполнив следующую команду в окне терминала Applications \> Utilities \> Terminal:
3737
3838`spctl developer-mode enable-terminal`
3939
4040и затем перейдя в System Preferences \> Security & Privacy \> Privacy, прокрутив вниз до записи "Developer Tools" (Инструменты разработчика), выполнив аутентификацию и установив флажок рядом с Terminal.
4141
42-Исполняемые файлы Intel, запущенные под Big Sur на процессоре Apple M1 через Rosetta 2, по-прежнему могут быть запущены, даже если они не подписаны, кликом ЛКМ с зажатой <span class="kbd">Ctrl</span> или кликом ПКМ мыши для обхода Gatekeeper.
42+Исполняемые файлы Intel, запущенные под Big Sur на процессоре Apple M1 через Rosetta 2, по-прежнему могут быть запущены, даже если они не подписаны, кликом ЛКМ с зажатой `Ctrl` или кликом ПКМ мыши для обхода Gatekeeper.
4343
4444Больше подробностей см.: [[macOS Big Sur changes for developers|Big Sur изменения для разработчиков: Подписывание кода - Intel в сравнении с M1]].
4545
4646## Диалоговые окна Gatekeeper
4747
4848<File:load> security warning dmg leopard en.png\|Простое предупреждение после открытия загруженного приложения в Leopard. <File:load> security warning dmg mavericks en.png\|Настройки по умолчанию более строгие в Mavericks, где они предотвращают запуск загруженных неподписанных приложений с помощью двойного щелчка мыши. <File:load> security warning mavericks context en.png\|Если приложение запускается через контекстное меню в Mavericks, отображается простое предупреждение, аналогичное тому, что было в более ранних версиях. <File:simple> load security warning mavericks en.png\|Gatekeeper показывает упрощенное предупреждение, если приложение с подписанным кодом было загружено и запущено в первый раз. При последующих запусках программа запускается сразу. <File:codesigning.png%7CСхема> подписания кода программы, написанной с помощью Lazarus и Free Pascal
4949
5050## Обзор
5151
5252Основные шаги для подписания приложения, написанного с помощью Lazarus и/или Free Pascal:
5353
54541. Получите Developer ID (идентификатора разработчика) разработчика от Apple и установите его в цепочку ключей вашей системы.
55552. Обратите внимание на буквенно-цифровой ключ вашего Developer ID (идентификатора разработчика) (он же TeamIdentifier).
56563. Подпишите свое приложение командой *codesign*.
57574. Подпишите свой установочный пакет с помощью команды *productsign*.
5858
5959**Невозможно** использовать сертификаты от сторонних поставщиков, таких как Comodo, потому что они не пройдут Gatekeeper, для которого требуется сертификат, выданный разработчиком Apple. Также обратите внимание, что вы не можете подписывать приложения Windows с помощью сертификата разработчика Apple (на этот раз вам нужен сторонний сертификат Comodo и т.д.).
6060
6161Приложение macOS, распространяемое за пределами Mac App Store, обычно имеет 3–4 отдельных уровня подписи:
6262
6363- Само приложение будет иметь подписанный код с использованием сертификата приложения.
6464- Если у приложения есть установщик, файл пакета будет подписан сертификатом установщика.
6565- Образ диска, содержащий приложение или установщик, будет подписан сертификатом приложения.
6666- Образ диска будет [[Notarization for macOS 10.14.5+/ru|нотариально заверен]], а затем удостоверение, сгенерированное нотариальной службой, будет к нему [[Notarization for macOS 10.14.5+/ru|прикреплено]].
6767
6868## Требования Gatekeeper'а
6969
7070- Ваше приложение должно быть автономным, без неприемлемых внешних зависимостей. Единственными допустимыми внешними зависимостями являются системные библиотеки. Все остальные зависимости следует скопировать в папку пакета MyApp.app. Gatekeeper отклоняет любое приложение, имеющее несистемные внешние зависимости.
7171
7272- Все бинарные файлы внутри MyApp.app должны быть подписаны кодом.
7373
7474- Все бинарные файлы должны находиться в стандартных местах внутри папки пакета MyApp.app. См.таблицу ниже.
7575
7676| Местоположение | Описание |
7777|----|----|
7878| Contents | Верхний каталог содержимого пакета |
7979| Contents/MacOS | Основной исполняемый файл; вспомогательные приложения и инструменты |
8080| Contents/Frameworks | Фреймворки, библиотеки *.dylibs |
8181| Contents/PlugIns | Плагины, как загружаемые, так и расширения |
8282| Contents/XPCServices | Сервисы XPC |
8383| Contents/Helpers | Вспомогательные приложения и инструменты |
8484| Contents/Library/Automator | Действия автоматора |
8585| Contents/Library/Spotlight | Импортеры Spotlight (средство поиска) |
8686| Contents/Library/LoginItems | Устанавливаемые элементы входа |
8787| Contents/Library/LaunchServices | Привилегированные вспомогательные инструменты, устанавливаемые инфраструктурой ServiceManagement. |
8888
8989Стандартное местоположение для кода внутри бандла (пакета)
9090
9191Примечание: Никакие недвоичные файлы никогда не должны находиться в папках, указанных в таблице выше.
9292
9393## Использование механизма codesign для подписи вашего приложения
9494
9595**1.** Подпишите свое приложение с помощью:
9696
9797``` bash
9898codesign -f -o runtime --timestamp -s "Developer ID Application: YOUR NAME (TEAM_ID)" /path/to/bundle.app
9999```
100100
101101**2.** Отображение основной информации о результате процесса подписания:
102102
103103``` bash
104104codesign -dv -r- /path/to/bundle.app
105105```
106106
107107Если ваше приложение было успешно подписано, эта команда вернет информацию, подобную приведенной ниже:
108108
109109 Executable=/Users/apple/Desktop/your.app/Contents/MacOS/yourappname
110110 Identifier=org.yourdomain.yourappname
111111 Format=app bundle with Mach-O thin (x86_64)
112112 CodeDirectory v=20500 size=101470 flags=0x10000(runtime) hashes=3164+3 location=embedded
113113 Signature size=9063
114114 Timestamp=7 Dec 2019 at 18:36:08
115115 Info.plist entries=16
116116 TeamIdentifier=<10 alpha numeric digits>
117117 Runtime Version=10.14.0
118118 Sealed Resources version=2 rules=13 files=45
119119 designated => identifier "org.yourdomain.yourappname" and anchor apple generic and certificate 1[field.1.2.840.113635.100.6.2.6] /* exists */ and certificate leaf[field.1.2.840.113635.100.6.1.13] /* exists */ and certificate leaf[subject.OU] = <10 alpha numeric digits>
120120
121121**3.** Подтвердите свою подпись:
122122
123123``` bash
124124codesign -vv /path/to/bundle.app
125125```
126126
127127Если ваше приложение было успешно подписано, эта команда вернет строки "valid on disk"(действительно на диске) и "satisfies its Designated Requirement"(удовлетворяет назначенному требованию) соответственно после пути к вашему приложению.
128128
129129## Использование механизма productsign для подписи установщика pkg
130130
131131**1.** Подпишите файл pkg установщика с помощью:
132132
133133``` bash
134134productsign --timestamp --sign "Developer ID Installer: YOUR NAME (TEAM_ID)" /path/to/unsigned.pkg /path/to/signed.pkg
135135```
136136
137137**2.** Подтвердите свою подпись с помощью:
138138
139139``` bash
140140spctl -vv --assess --type install /path/to/your.pkg
141141```
142142
143143который должен давать информацию, подобную этой, если все закончилось успешно:
144144
145145 your.pkg: accepted
146146 source=Developer ID
147147 origin=Developer ID Installer: YOUR NAME (<10 alpha numeric digits>)
148148
149149## Использование механизма codesign для подписи образа диска
150150
151151Начиная с macOS 10.11.5, вы можете применять подпись кода к сжатым образам дисков только для чтения, которые вы используете для распространения содержимого. В этом случае вам не нужно отдельно подписывать ваше приложение.
152152
153153**1.** Подпишите образ диска с помощью:
154154
155155``` bash
156156codesign -f -o runtime --timestamp -s "Developer ID Application: YOUR NAME (TEAM_ID)" /path/to/YourImage.dmg
157157```
158158
159159**2.** Подтвердите свою подпись с помощью:
160160
161161``` bash
162162spctl -a -t open --context context:primary-signature -vv /path/to/YourImage.dmg
163163```
164164
165165который должен выдать информацию, подобную этой, если все прошло успешно:
166166
167167 YourImage.dmg: accepted
168168 source=Developer ID
169169 origin=Developer ID Application: YOUR NAME (<10 alpha numeric digits>)
170170
171171**После 3 февраля 2020 года Apple полностью вводит нотариальное заверение** для macOS 10.14.5+ (Mojave), в результате чего вышеуказанная проверка образа вашего диска теперь будет возвращать информацию, подобную этой:
172172
173173 YourImage.dmg: rejected
174174 source=Unnotarized Developer ID
175175 origin=Developer ID Application: YOUR NAME (<10 alpha numeric digits>)
176176
177177Подробнее см. [[Notarization for macOS 10.14.5+/ru|Нотаризация для macOS 10.14.5+]].
178178
179179## Обновление подписанного файла
180180
181181Всякий раз, когда вы обновляете подписанный файл, создавайте новый файл. Не копируйте новый подписанный файл поверх старого подписанного файла.
182182
183183В частности, информация о подписи кода (хэш каталога кода) висит на vnode в ядре, и изменение файла за этим кешем вызовет проблемы. Вам нужен новый vnode, а значит новый файл, то есть новый inode. Задокументировано в сессии 703 WWDC 2019 «Все о нотариальном заверении» — см. [слайд 65 (PDF)](https://devstreaming-cdn.apple.com/videos/wwdc/2019/703yqvyjv9mi5ur6/703/703_all_about_notarization.pdf).
184184
185185## Подписание ad hoc кода (в особых случаях)
186186
187187Это особенно важно для процессоров Apple ARM64 M1, которые требуют, чтобы весь нативный код был подписан корректно (если только ad hoc), иначе операционная система не будет его выполнять, вместо этого убивая его при запуске. Чтобы подписать приложение ad hoc, выполните:
188188
189189` codesign --force --deep -s - lazarus.app`
190190
191191или, чтобы подписать исполняемый файл в особых случаях, выполните:
192192
193193` codesign --force -s - lazarus`
194194
195195Одиночный тире/дефис сам по себе для удостоверения делает его специальной подписью без сертификата.
196196
197197Вы можете проверить действительность подписанного исполняемого файла ad hoc с помощью:
198198
199199` codesign -dv -r- lazarus`
200200
201201который должен вывести текст, аналогичный приведенному ниже:
202202
203203`Executable=/Users/trev/lazarus-src/lazarus`\
204204`Identifier=lazarus`\
205205`Format=Mach-O thin (arm64)`\
206206`CodeDirectory v=20400 size=336137 flags=0x2(adhoc) hashes=10498+2 location=embedded`\
207207`Signature=adhoc`\
208208`Info.plist=not bound`\
209209`TeamIdentifier=not set`\
210210`Sealed Resources=none`\
211211`# designated => cdhash H"2e6f474452344d6fa42feee3db14a05c14d595a3"`
212212
213213В тех случаях, когда вы скомпилировали исполняемый файл самостоятельно, компоновщик macOS специально подпишет исполняемый файл для вас, и в этом случае вам не нужно ничего делать. Вы можете проверить действительность с помощью приведенной выше команды, и в этом случае в строке вывода CodeDirectory будет указано, что компоновщик подписал исполняемый файл специальной подписью следующим образом:
214214
215215` CodeDirectory v=20400 size=336032 flags=0x20002(adhoc,linker-signed) hashes=10498+0 location=embedded`
216216
217217## Подписывание кода двоичного файла x86_64 на машине aarch64
218218
219219Архитектура подписи кода macOS поддерживает два разных формата хэшей:
220220
221221- sha1, исходный формат хэша, который сейчас считается устаревшим
222222- sha256, новый формат, поддержка которого была добавлена ​​в macOS 10.11
223223
224224`Codesign` должен выбрать формат подписи в зависимости от цели развертывания:
225225
226226- Если целью развертывания является ОС 10.11 или более поздняя версия, вы получаете sha256.
227227- Если ваша цель развертывания ОС более ранняя, вы получите как sha1, так и sha256.
228228
229229Проблема возникает из-за того, что при сборке для Intel и Apple Silicon цели развертывания разные. Вы можете установить цель развертывания на 10.9, но в Apple Silicon она повышена до минимальной системы Apple Silicon, 11.0. Итак, какую цель развертывания оно выбирает?
230230
231231Вобщем, полный ответ на этот вопрос сложен, но краткое изложение заключается в том, что оно выбирает цель развертывания текущей архитектуры, то есть Intel, если вы собираете на Intel, и Apple Silicon, если вы собираете на Apple Silicon.
232232
233233В результате у вас возникают проблемы, если ваша цель развертывания меньше 10.11 и вы подписываетесь на Apple Silicon. Когда вы запускаете, скажем, macOS 10.10, система ищет хэш sha1, не находит и жалуется.
234234
235235Обходной путь заключается в предоставлении аргумента `--digest-algorithm=sha1,sha256` для `codesign`, который переопределяет логику выбора хэша в `codesign` и заставляет его включать оба хэша.
236236
237237## Как установить сертификаты на второй компьютер
238238
239239Есть два способа сделать это:
240240
2412411. с помощью приложения Keychain Access (Связка ключей)
2422422. с помощью Xcode.
243243
244244### Использование приложения Keychain Access (Связка ключей)
245245
246246- На первом компьютере с сертификатами откройте приложение Keychain Access и создайте новую связку ключей. Теперь выберите существующую связку ключей для входа, а затем My Certificates (мои сертификаты). Ваши сертификаты должны отображаться справа. С левой стороны должна быть стрелка раскрытия, и ее выбор должен показать ваш закрытый ключ. Выберите каждый сертификат, скопируйте и вставьте (не перетаскивайте, иначе вы удалите его из цепочки для ключей входа) в новую цепочку для ключей.
247247
248248- Скопируйте только что созданную цепочку для ключей с первого компьютера на второй компьютер, откройте ее с помощью приложения Keychain Access и скопируйте/вставьте/перетащите сертификат в цепочку для входа на второй компьютер.
249249
250250### Использование Xcode
251251
252252- На первом компьютере с сертификатами откройте Xcode и перейдите в Preferences \> Accounts (Настройки \> Учетные записи), выберите свою учетную запись, выберите значок шестеренки в левом нижнем углу, выберите Export Apple ID (Экспорт Apple ID) и Code Signing Assets (Активы для подписи кода), а затем сохраните файл.
253253
254254- Скопируйте файл профиля разработчика, который вы сохранили на своем первом компьютере, на второй компьютер, откройте Xcode, перейдите в Preferences \> Accounts (Настройки \> Учетные записи), выберите свою учетную запись, выберите символ шестеренки в левом нижнем углу, а затем выберите Import Apple ID (Импортировать Apple ID) и Code Signing Assets (Активы для подписи кода).
255255
256256## Как проверить, какие сертификаты установлены
257257
258258После того, как вы создали или импортировали сертификаты на свой компьютер, вы можете проверить их наличие, открыв терминал Applications \> Utilities \> Terminal и выполнив следующую команду:
259259
260260`$ security find-identity -p basic -v`
261261
262262Эта команда выведет список всех доступных сертификатов на этом компьютере. Убедитесь, что вы видите наличие *Developer ID Application* и *Developer ID Installer*. Если вы являетесь участником нескольких команд, вы можете увидеть несколько сертификатов для каждой команды.
263263
264264Вы можете идентифицировать сертификаты по шестнадцатеричному номеру или описательному имени, например, "Developer ID Application: Your Name (AB123456DE)".
265265
266266Десятизначный буквенно-цифровой код в конце вашего имени — это Developer Team ID (идентификатор вашей команды разработчиков). Если вы являетесь членом нескольких команд разработчиков, у вас будет несколько сертификатов, и идентификатор команды поможет вам отличить их.
267267
268268## См.также
269269
270270- [[macOS Big Sur changes for developers|Подписание кода: Intel в сравнеии Apple Silicon]]
271271- [[Apple Developer Certificates]]
272272- [[Notarization for macOS 10.14.5+]]
273273- [[Hardened runtime for macOS]]
274274- [[Sandboxing for macOS]]
275275- [[Signing and Notarization FAQ]]
276276- [[macOS Gatekeeper Debugging Tips]]
277277
278278## Внешние ссылки
279279
280280- [Apple Developer portal](https://developer.apple.com/)
281281- [Apple: Code Signing Overview](https://developer.apple.com/support/technical/code-signing/)
282282- [Apple: Code Signing Guide](https://developer.apple.com/library/mac/documentation/Security/Conceptual/CodeSigningGuide/)
283283- [Apple: TN2206 - macOS Code Signing In Depth](https://developer.apple.com/library/archive/technotes/tn2206/_index.html)
284284- [Apple: Code signing x86_64 binaries on aarch64](https://developer.apple.com/forums/thread/673323).
285285
286286---
287287*From the Free Pascal wiki, page "Code Signing for macOS/ru", as it stood on 2022-02-28 after a change by Alextp, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's [[Licensing]] page. If you have concerns about this material, [message the admin](/wiki-contact).*

Back to history