Sign in Join
Wiki copytemporary

Code Signing for macOS/ru: what changed

Revision 3 to 4. 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
28-`$ sudo spctl --master-disable`
28+```
29+$ sudo spctl --master-disable
30+```
2931
3032которая по-прежнему работает до macOS Catalina включительно. Лучшей, как и более безопасной, альтернативой было вместо этого обойти Gatekeeper, открыв приложение из контекстного меню по клику правой кнопки мыши, или по клику с зажатой `Ctrl`. Это по-прежнему вызывало бы диалоговое окно предупреждения, но теперь оно бы содержало кнопку **Открыть** для успешного запуска приложения. Этот метод обхода Gatekeeper по-прежнему работает в macOS Catalina, за исключением того, что в Catalina вам нужно запустить приложение во второй раз, удерживая `Ctrl` или щелкнув правой кнопкой мыши, чтобы успешно обойти Gatekeeper - при первом запуске приложения Gatekeeper не может быть обойден независимо от того, удерживаете ли вы `Ctrl` или щелкаете правой кнопкой мыши или нет.
3133
3234### Big Sur и более новые ОС на процессорах Apple M1 ARM64
3335
3436И тогда Apple изменила правила игры.
3537
3638Когда Big Sur запущена на процессоре Apple M1 (ARM64), **весь нативный код ARM64 должен быть подписан, иначе операционная система не позволит его выполнение**; и пользователи не могут обойти это новое требование Gatekeeper. Разработчики могут обойти его, выполнив следующую команду в окне терминала Applications \> Utilities \> Terminal:
3739
38-`spctl developer-mode enable-terminal`
40+```
41+spctl developer-mode enable-terminal
42+```
3943
4044и затем перейдя в System Preferences \> Security & Privacy \> Privacy, прокрутив вниз до записи "Developer Tools" (Инструменты разработчика), выполнив аутентификацию и установив флажок рядом с Terminal.
4145
4246Исполняемые файлы Intel, запущенные под Big Sur на процессоре Apple M1 через Rosetta 2, по-прежнему могут быть запущены, даже если они не подписаны, кликом ЛКМ с зажатой `Ctrl` или кликом ПКМ мыши для обхода Gatekeeper.
4347
4448Больше подробностей см.: [[macOS Big Sur changes for developers|Big Sur изменения для разработчиков: Подписывание кода - Intel в сравнении с M1]].
4549
4650## Диалоговые окна Gatekeeper
4751
4852![](/wiki-images/2/26/Load_security_warning_dmg_leopard_en.png)
4953
5054Простое предупреждение после открытия загруженного приложения в Leopard.
5155
5256![](/wiki-images/3/31/Load_security_warning_dmg_mavericks_en.png)
5357
5458Настройки по умолчанию более строгие в Mavericks, где они предотвращают запуск загруженных неподписанных приложений с помощью двойного щелчка мыши.
5559
5660![](/wiki-images/2/20/Load_security_warning_mavericks_context_en.png)
5761
5862Если приложение запускается через контекстное меню в Mavericks, отображается простое предупреждение, аналогичное тому, что было в более ранних версиях.
5963
6064![](/wiki-images/c/c3/Simple_load_security_warning_mavericks_en.png)
6165
6266Gatekeeper показывает упрощенное предупреждение, если приложение с подписанным кодом было загружено и запущено в первый раз. При последующих запусках программа запускается сразу.
6367
6468![](/wiki-images/1/15/Codesigning.png)
6569
6670Схема подписания кода программы, написанной с помощью Lazarus и Free Pascal
6771
6872## Обзор
6973
7074Основные шаги для подписания приложения, написанного с помощью Lazarus и/или Free Pascal:
7175
72761. Получите Developer ID (идентификатора разработчика) разработчика от Apple и установите его в цепочку ключей вашей системы.
73772. Обратите внимание на буквенно-цифровой ключ вашего Developer ID (идентификатора разработчика) (он же TeamIdentifier).
74783. Подпишите свое приложение командой *codesign*.
75794. Подпишите свой установочный пакет с помощью команды *productsign*.
7680
7781**Невозможно** использовать сертификаты от сторонних поставщиков, таких как Comodo, потому что они не пройдут Gatekeeper, для которого требуется сертификат, выданный разработчиком Apple. Также обратите внимание, что вы не можете подписывать приложения Windows с помощью сертификата разработчика Apple (на этот раз вам нужен сторонний сертификат Comodo и т.д.).
7882
7983Приложение macOS, распространяемое за пределами Mac App Store, обычно имеет 3–4 отдельных уровня подписи:
8084
8185- Само приложение будет иметь подписанный код с использованием сертификата приложения.
8286- Если у приложения есть установщик, файл пакета будет подписан сертификатом установщика.
8387- Образ диска, содержащий приложение или установщик, будет подписан сертификатом приложения.
8488- Образ диска будет [[Notarization for macOS 10.14.5+/ru|нотариально заверен]], а затем удостоверение, сгенерированное нотариальной службой, будет к нему [[Notarization for macOS 10.14.5+/ru|прикреплено]].
8589
8690## Требования Gatekeeper'а
8791
8892- Ваше приложение должно быть автономным, без неприемлемых внешних зависимостей. Единственными допустимыми внешними зависимостями являются системные библиотеки. Все остальные зависимости следует скопировать в папку пакета MyApp.app. Gatekeeper отклоняет любое приложение, имеющее несистемные внешние зависимости.
8993
9094- Все бинарные файлы внутри MyApp.app должны быть подписаны кодом.
9195
9296- Все бинарные файлы должны находиться в стандартных местах внутри папки пакета MyApp.app. См.таблицу ниже.
9397
9498| Местоположение | Описание |
9599|----|----|
96100| Contents | Верхний каталог содержимого пакета |
97101| Contents/MacOS | Основной исполняемый файл; вспомогательные приложения и инструменты |
98102| Contents/Frameworks | Фреймворки, библиотеки *.dylibs |
99103| Contents/PlugIns | Плагины, как загружаемые, так и расширения |
100104| Contents/XPCServices | Сервисы XPC |
101105| Contents/Helpers | Вспомогательные приложения и инструменты |
102106| Contents/Library/Automator | Действия автоматора |
103107| Contents/Library/Spotlight | Импортеры Spotlight (средство поиска) |
104108| Contents/Library/LoginItems | Устанавливаемые элементы входа |
105109| Contents/Library/LaunchServices | Привилегированные вспомогательные инструменты, устанавливаемые инфраструктурой ServiceManagement. |
106110
107111Стандартное местоположение для кода внутри бандла (пакета)
108112
109113Примечание: Никакие недвоичные файлы никогда не должны находиться в папках, указанных в таблице выше.
110114
111115## Использование механизма codesign для подписи вашего приложения
112116
113117**1.** Подпишите свое приложение с помощью:
114118
115119``` bash
116120codesign -f -o runtime --timestamp -s "Developer ID Application: YOUR NAME (TEAM_ID)" /path/to/bundle.app
117121```
118122
119123**2.** Отображение основной информации о результате процесса подписания:
120124
121125``` bash
122126codesign -dv -r- /path/to/bundle.app
123127```
124128
125129Если ваше приложение было успешно подписано, эта команда вернет информацию, подобную приведенной ниже:
126130
127131 Executable=/Users/apple/Desktop/your.app/Contents/MacOS/yourappname
128132 Identifier=org.yourdomain.yourappname
129133 Format=app bundle with Mach-O thin (x86_64)
130134 CodeDirectory v=20500 size=101470 flags=0x10000(runtime) hashes=3164+3 location=embedded
131135 Signature size=9063
132136 Timestamp=7 Dec 2019 at 18:36:08
133137 Info.plist entries=16
134138 TeamIdentifier=<10 alpha numeric digits>
135139 Runtime Version=10.14.0
136140 Sealed Resources version=2 rules=13 files=45
137141 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>
138142
139143**3.** Подтвердите свою подпись:
140144
141145``` bash
142146codesign -vv /path/to/bundle.app
143147```
144148
145149Если ваше приложение было успешно подписано, эта команда вернет строки "valid on disk"(действительно на диске) и "satisfies its Designated Requirement"(удовлетворяет назначенному требованию) соответственно после пути к вашему приложению.
146150
147151## Использование механизма productsign для подписи установщика pkg
148152
149153**1.** Подпишите файл pkg установщика с помощью:
150154
151155``` bash
152156productsign --timestamp --sign "Developer ID Installer: YOUR NAME (TEAM_ID)" /path/to/unsigned.pkg /path/to/signed.pkg
153157```
154158
155159**2.** Подтвердите свою подпись с помощью:
156160
157161``` bash
158162spctl -vv --assess --type install /path/to/your.pkg
159163```
160164
161165который должен давать информацию, подобную этой, если все закончилось успешно:
162166
163167 your.pkg: accepted
164168 source=Developer ID
165169 origin=Developer ID Installer: YOUR NAME (<10 alpha numeric digits>)
166170
167171## Использование механизма codesign для подписи образа диска
168172
169173Начиная с macOS 10.11.5, вы можете применять подпись кода к сжатым образам дисков только для чтения, которые вы используете для распространения содержимого. В этом случае вам не нужно отдельно подписывать ваше приложение.
170174
171175**1.** Подпишите образ диска с помощью:
172176
173177``` bash
174178codesign -f -o runtime --timestamp -s "Developer ID Application: YOUR NAME (TEAM_ID)" /path/to/YourImage.dmg
175179```
176180
177181**2.** Подтвердите свою подпись с помощью:
178182
179183``` bash
180184spctl -a -t open --context context:primary-signature -vv /path/to/YourImage.dmg
181185```
182186
183187который должен выдать информацию, подобную этой, если все прошло успешно:
184188
185189 YourImage.dmg: accepted
186190 source=Developer ID
187191 origin=Developer ID Application: YOUR NAME (<10 alpha numeric digits>)
188192
189193**После 3 февраля 2020 года Apple полностью вводит нотариальное заверение** для macOS 10.14.5+ (Mojave), в результате чего вышеуказанная проверка образа вашего диска теперь будет возвращать информацию, подобную этой:
190194
191195 YourImage.dmg: rejected
192196 source=Unnotarized Developer ID
193197 origin=Developer ID Application: YOUR NAME (<10 alpha numeric digits>)
194198
195199Подробнее см. [[Notarization for macOS 10.14.5+/ru|Нотаризация для macOS 10.14.5+]].
196200
197201## Обновление подписанного файла
198202
199203Всякий раз, когда вы обновляете подписанный файл, создавайте новый файл. Не копируйте новый подписанный файл поверх старого подписанного файла.
200204
201205В частности, информация о подписи кода (хэш каталога кода) висит на vnode в ядре, и изменение файла за этим кешем вызовет проблемы. Вам нужен новый vnode, а значит новый файл, то есть новый inode. Задокументировано в сессии 703 WWDC 2019 «Все о нотариальном заверении» — см. [слайд 65 (PDF)](https://devstreaming-cdn.apple.com/videos/wwdc/2019/703yqvyjv9mi5ur6/703/703_all_about_notarization.pdf).
202206
203207## Подписание ad hoc кода (в особых случаях)
204208
205209Это особенно важно для процессоров Apple ARM64 M1, которые требуют, чтобы весь нативный код был подписан корректно (если только ad hoc), иначе операционная система не будет его выполнять, вместо этого убивая его при запуске. Чтобы подписать приложение ad hoc, выполните:
206210
207-` codesign --force --deep -s - lazarus.app`
211+```
212+ codesign --force --deep -s - lazarus.app
213+```
208214
209215или, чтобы подписать исполняемый файл в особых случаях, выполните:
210216
211-` codesign --force -s - lazarus`
217+```
218+ codesign --force -s - lazarus
219+```
212220
213221Одиночный тире/дефис сам по себе для удостоверения делает его специальной подписью без сертификата.
214222
215223Вы можете проверить действительность подписанного исполняемого файла ad hoc с помощью:
216224
217-` codesign -dv -r- lazarus`
225+```
226+ codesign -dv -r- lazarus
227+```
218228
219229который должен вывести текст, аналогичный приведенному ниже:
220230
221-`Executable=/Users/trev/lazarus-src/lazarus`\
222-`Identifier=lazarus`\
223-`Format=Mach-O thin (arm64)`\
224-`CodeDirectory v=20400 size=336137 flags=0x2(adhoc) hashes=10498+2 location=embedded`\
225-`Signature=adhoc`\
226-`Info.plist=not bound`\
227-`TeamIdentifier=not set`\
228-`Sealed Resources=none`\
229-`# designated => cdhash H"2e6f474452344d6fa42feee3db14a05c14d595a3"`
231+```
232+Executable=/Users/trev/lazarus-src/lazarus
233+Identifier=lazarus
234+Format=Mach-O thin (arm64)
235+CodeDirectory v=20400 size=336137 flags=0x2(adhoc) hashes=10498+2 location=embedded
236+Signature=adhoc
237+Info.plist=not bound
238+TeamIdentifier=not set
239+Sealed Resources=none
240+# designated => cdhash H"2e6f474452344d6fa42feee3db14a05c14d595a3"
241+```
230242
231243В тех случаях, когда вы скомпилировали исполняемый файл самостоятельно, компоновщик macOS специально подпишет исполняемый файл для вас, и в этом случае вам не нужно ничего делать. Вы можете проверить действительность с помощью приведенной выше команды, и в этом случае в строке вывода CodeDirectory будет указано, что компоновщик подписал исполняемый файл специальной подписью следующим образом:
232244
233-` CodeDirectory v=20400 size=336032 flags=0x20002(adhoc,linker-signed) hashes=10498+0 location=embedded`
245+```
246+ CodeDirectory v=20400 size=336032 flags=0x20002(adhoc,linker-signed) hashes=10498+0 location=embedded
247+```
234248
235249## Подписывание кода двоичного файла x86_64 на машине aarch64
236250
237251Архитектура подписи кода macOS поддерживает два разных формата хэшей:
238252
239253- sha1, исходный формат хэша, который сейчас считается устаревшим
240254- sha256, новый формат, поддержка которого была добавлена ​​в macOS 10.11
241255
242256`Codesign` должен выбрать формат подписи в зависимости от цели развертывания:
243257
244258- Если целью развертывания является ОС 10.11 или более поздняя версия, вы получаете sha256.
245259- Если ваша цель развертывания ОС более ранняя, вы получите как sha1, так и sha256.
246260
247261Проблема возникает из-за того, что при сборке для Intel и Apple Silicon цели развертывания разные. Вы можете установить цель развертывания на 10.9, но в Apple Silicon она повышена до минимальной системы Apple Silicon, 11.0. Итак, какую цель развертывания оно выбирает?
248262
249263Вобщем, полный ответ на этот вопрос сложен, но краткое изложение заключается в том, что оно выбирает цель развертывания текущей архитектуры, то есть Intel, если вы собираете на Intel, и Apple Silicon, если вы собираете на Apple Silicon.
250264
251265В результате у вас возникают проблемы, если ваша цель развертывания меньше 10.11 и вы подписываетесь на Apple Silicon. Когда вы запускаете, скажем, macOS 10.10, система ищет хэш sha1, не находит и жалуется.
252266
253267Обходной путь заключается в предоставлении аргумента `--digest-algorithm=sha1,sha256` для `codesign`, который переопределяет логику выбора хэша в `codesign` и заставляет его включать оба хэша.
254268
255269## Как установить сертификаты на второй компьютер
256270
257271Есть два способа сделать это:
258272
2592731. с помощью приложения Keychain Access (Связка ключей)
2602742. с помощью Xcode.
261275
262276### Использование приложения Keychain Access (Связка ключей)
263277
264278- На первом компьютере с сертификатами откройте приложение Keychain Access и создайте новую связку ключей. Теперь выберите существующую связку ключей для входа, а затем My Certificates (мои сертификаты). Ваши сертификаты должны отображаться справа. С левой стороны должна быть стрелка раскрытия, и ее выбор должен показать ваш закрытый ключ. Выберите каждый сертификат, скопируйте и вставьте (не перетаскивайте, иначе вы удалите его из цепочки для ключей входа) в новую цепочку для ключей.
265279
266280- Скопируйте только что созданную цепочку для ключей с первого компьютера на второй компьютер, откройте ее с помощью приложения Keychain Access и скопируйте/вставьте/перетащите сертификат в цепочку для входа на второй компьютер.
267281
268282### Использование Xcode
269283
270284- На первом компьютере с сертификатами откройте Xcode и перейдите в Preferences \> Accounts (Настройки \> Учетные записи), выберите свою учетную запись, выберите значок шестеренки в левом нижнем углу, выберите Export Apple ID (Экспорт Apple ID) и Code Signing Assets (Активы для подписи кода), а затем сохраните файл.
271285
272286- Скопируйте файл профиля разработчика, который вы сохранили на своем первом компьютере, на второй компьютер, откройте Xcode, перейдите в Preferences \> Accounts (Настройки \> Учетные записи), выберите свою учетную запись, выберите символ шестеренки в левом нижнем углу, а затем выберите Import Apple ID (Импортировать Apple ID) и Code Signing Assets (Активы для подписи кода).
273287
274288## Как проверить, какие сертификаты установлены
275289
276290После того, как вы создали или импортировали сертификаты на свой компьютер, вы можете проверить их наличие, открыв терминал Applications \> Utilities \> Terminal и выполнив следующую команду:
277291
278-`$ security find-identity -p basic -v`
292+```
293+$ security find-identity -p basic -v
294+```
279295
280296Эта команда выведет список всех доступных сертификатов на этом компьютере. Убедитесь, что вы видите наличие *Developer ID Application* и *Developer ID Installer*. Если вы являетесь участником нескольких команд, вы можете увидеть несколько сертификатов для каждой команды.
281297
282298Вы можете идентифицировать сертификаты по шестнадцатеричному номеру или описательному имени, например, "Developer ID Application: Your Name (AB123456DE)".
283299
284300Десятизначный буквенно-цифровой код в конце вашего имени — это Developer Team ID (идентификатор вашей команды разработчиков). Если вы являетесь членом нескольких команд разработчиков, у вас будет несколько сертификатов, и идентификатор команды поможет вам отличить их.
285301
286302## См.также
287303
288304- [[macOS Big Sur changes for developers|Подписание кода: Intel в сравнеии Apple Silicon]]
289305- [[Apple Developer Certificates]]
290306- [[Notarization for macOS 10.14.5+]]
291307- [[Hardened runtime for macOS]]
292308- [[Sandboxing for macOS]]
293309- [[Signing and Notarization FAQ]]
294310- [[macOS Gatekeeper Debugging Tips]]
295311
296312## Внешние ссылки
297313
298314- [Apple Developer portal](https://developer.apple.com/)
299315- [Apple: Code Signing Overview](https://developer.apple.com/support/technical/code-signing/)
300316- [Apple: Code Signing Guide](https://developer.apple.com/library/mac/documentation/Security/Conceptual/CodeSigningGuide/)
301317- [Apple: TN2206 - macOS Code Signing In Depth](https://developer.apple.com/library/archive/technotes/tn2206/_index.html)
302318- [Apple: Code signing x86_64 binaries on aarch64](https://developer.apple.com/forums/thread/673323).
303319
304320---
305321*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