Difference between revisions of "Notarization for macOS 10.14.5+/ru"

From Lazarus wiki
Jump to navigationJump to search
 
(25 intermediate revisions by the same user not shown)
Line 9: Line 9:
 
Когда пользователь впервые устанавливает или запускает программное обеспечение, наличие удостоверения (онлайн или прикрепленного к исполняемому файлу) сообщает Gatekeeper, что Apple нотариально заверила программное обеспечение. Затем Gatekeeper помещает описательную информацию в диалоговое окно первоначального запуска, чтобы помочь пользователю сделать осознанный выбор, запускать ли приложение.
 
Когда пользователь впервые устанавливает или запускает программное обеспечение, наличие удостоверения (онлайн или прикрепленного к исполняемому файлу) сообщает Gatekeeper, что Apple нотариально заверила программное обеспечение. Затем Gatekeeper помещает описательную информацию в диалоговое окно первоначального запуска, чтобы помочь пользователю сделать осознанный выбор, запускать ли приложение.
  
{{Note| Даже если приложение не было нотариально заверено, его все равно можно запустить, щелкнув приложение, удерживая клавишу Control, или щелкнув правой кнопкой мыши для вызова контекстного меню, выбрав «Открыть» - см. диалоговое окно «Обход» Gatekeeper в галерее [[Notarization_for_macOS_10.14.5%2B/ru#.D0.94.D0.B8.D0.B0.D0.BB.D0.BE.D0.B3.D0.BE.D0.B2.D1.8B.D0.B5_.D0.BE.D0.BA.D0.BD.D0.B0_Gatekeeper|ниже]].}}
+
{{Note| Даже если приложение не было нотариально заверено, его все равно можно запустить, щелкнув приложение, удерживая клавишу Control, или щелкнув правой кнопкой мыши для вызова контекстного меню, выбрав «Открыть» - см. диалоговое "обходное" окно Gatekeeper в галерее [[Notarization_for_macOS_10.14.5%2B/ru#.D0.94.D0.B8.D0.B0.D0.BB.D0.BE.D0.B3.D0.BE.D0.B2.D1.8B.D0.B5_.D0.BE.D0.BA.D0.BD.D0.B0_Gatekeeper|ниже]].}}
  
 
Подписание кода приложения без нотариального заверения - теперь совершенно бессмысленное упражнение, ''если только'' вы не распространяете свое приложение только через App Store.
 
Подписание кода приложения без нотариального заверения - теперь совершенно бессмысленное упражнение, ''если только'' вы не распространяете свое приложение только через App Store.
Line 16: Line 16:
  
 
<gallery>
 
<gallery>
File:macos-mojave-app-downloaded-from-internet-alert-dark.jpg|Gatekeeper Dialog before Catalina where an app that is not notarized is first opened (Mojave macOS 10.14 dialog)
+
File:macos-mojave-app-downloaded-from-internet-alert-dark.jpg|Диалоговое окно Gatekeeper до Catalina, в котором сначала открывается нотариально не заверенное приложение (диалоговое окно Mojave macOS 10.14 )
File:Screenshot_2020-01-02_at_22.42.01.png|Gatekeeper dialog where an app which is signed and notarized is first opened (Catalina macOS 10.15.1 dialog)
+
File:Screenshot_2020-01-02_at_22.42.01.png|Диалоговое окно Gatekeeper, в котором сначала открывается подписанное и нотариально заверенное приложение (диалоговое окно Catalina macOS 10.15.1)
File:gatekeep_no.png|Gatekeeper dialog where an app is not signed nor notarized is first opened (Catalina macOS 10.15.1 dialog)
+
File:gatekeep_no.png|Сначала открывается диалоговое окно Gatekeeper, в котором приложение не подписано и не заверено нотариально.  (диалоговое окно Catalina macOS 10.15.1)
File:macos-catalina-alert-unsigned-override.jpg|The Gatekeeper "bypass" dialog, accessed by control-clicking on the app (Catalina macOS 10.15.3 dialog)
+
File:macos-catalina-alert-unsigned-override.jpg|Диалоговое "обходное" окно Gatekeeper, доступ к которому можно получить, щелкнув приложение, удерживая клавишу Control. (диалоговое окно Catalina macOS 10.15.3)
 
</gallery>
 
</gallery>
  
== Notarization requirements ==
+
== Требования к нотариальному заверению ==
  
Notarization requires the Xcode command line tools from Xcode 10 or later. Building a new app for notarization requires macOS 10.13.6 or later. Stapling an app requires macOS 10.12 or later.
+
Для нотариального заверения требуются инструменты командной строки Xcode от Xcode 10 или новее. Для создания нового приложения для нотариального заверения требуется macOS 10.13.6 или новее. Для прикрепления приложения требуется macOS 10.12 или новее.
  
Apple's notary service requires you to:
+
Нотариальная служба Apple требует от вас:
  
* Enable code-signing for all of the executables you distribute.
+
* Включения подписывания кода для всех распространяемых вами исполняемых файлов.
* Enable the [[Hardened runtime for macOS|Hardened Runtime]] capability for your application and command line targets.
+
* Включения возможности заверения через [[Hardened runtime for macOS | Hardened Runtime]] для вашего приложения и целей командной строки.
* Use a “Developer ID” application, kernel extension, or installer certificate for your code-signing signature.  
+
* Использования приложения «Developer ID», расширения ядра или сертификата установщика для подписи кода.
* Include a secure timestamp with your code-signing signature (include the --timestamp option when running the codesign tool).
+
* Включения безопасной метки времени в свою подпись для подписи кода (включения параметра --timestamp при запуске инструмента кодовой подписи).
* Don’t include the com.apple.security.get-task-allow entitlement with the value set to any variation of true. If your software hosts third-party plug-ins and needs this entitlement to debug the plug-in in the context of a host executable, see [https://developer.apple.com/documentation/xcode/notarizing_macos_software_before_distribution/resolving_common_notarization_issues#3087731 Avoid the Get-Task-Allow Entitlement].
+
* Не включать право com.apple.security.get-task-allow со значением, равным любому варианту истинного. Если в вашем программном обеспечении размещаются сторонние плагины и требуется это право для отладки плагина в контексте исполняемого файла хоста, см. [https://developer.apple.com/documentation/xcode/notarizing_macos_software_before_distribution/resolving_common_notarization_issues#3087731 Avoid the Get-Task-Allow Entitlement].
* Link against the macOS 10.9 or later SDK.
+
* Ссылки на SDK для macOS 10.9 или новее.
  
On 3 September 2019 Apple announced that until January 2020 developers could get new versions of applications notarized even though they were not [[Hardened runtime for macOS|hardened]] or fully compliant with the normal requirements. '''That deadline was later extended to 3 February 2020. The above notarization requirements are now in full effect.'''
+
3 сентября 2019 года Apple объявила, что до января 2020 года разработчики могут нотариально заверить новые версии приложений, даже если они не были заверены через [[Hardened runtime for macOS|hardened]] или полностью соответствуют обычным требованиям. '''Позднее этот срок был продлен до 3 февраля 2020 года. Вышеуказанные требования к нотариальному удостоверению теперь действуют в полной мере.'''
  
=== Apple Statement 23 December 2019 ===
+
=== Заявление Apple от 23 декабря 2019 г. ===
  
In June, we announced that all Mac software distributed outside the Mac App Store must be notarized by Apple in order to run by default on macOS Catalina. In September, we temporarily adjusted the [[#Notarization requirements|notarization prerequisites]] to make this transition easier and to protect users on macOS Catalina who continue to use older versions of software. Starting February 3, 2020, all submitted software must meet the original notarization prerequisites.
+
В июне мы объявили, что все программное обеспечение Mac, распространяемое за пределами Mac App Store, должно быть нотариально заверено Apple, чтобы оно могло работать по умолчанию на macOS Catalina. В сентябре мы временно скорректировали [[#Notarization requirements| предварительные условия нотариального заверения]], чтобы упростить этот переход и защитить пользователей macOS Catalina, которые продолжают использовать более старые версии программного обеспечения. Начиная с 3 февраля 2020 года, все представленное программное обеспечение должно соответствовать предварительным требованиям для нотариального заверения.
  
If you haven’t yet done so, upload your software to the notary service and review the developer log for warnings. These warnings will become errors starting February 3 and must be fixed in order to have your software notarized. Software notarized before February 3 will continue to run by default on macOS Catalina.
+
Если вы еще не сделали этого, загрузите программное обеспечение в нотариальную службу и просмотрите журнал разработчика на наличие предупреждений. Эти предупреждения станут ошибками с 3 февраля и должны быть исправлены, чтобы ваше программное обеспечение было нотариально заверенным. Программное обеспечение, нотариально заверенное до 3 февраля, по умолчанию будет продолжать работать на macOS Catalina.
  
As a reminder, all installer packages must be signed since they may contain executable code. Disk images do not need to be signed, although signing them can help your users verify their contents.
+
Напоминаем, что все пакеты установщика должны быть подписаны, поскольку они могут содержать исполняемый код. Образы дисков не нужно подписывать, хотя их подписание может помочь вашим пользователям проверить их содержимое.
  
== Notarizing an application ==
+
== Нотариальное заверение заявки ==
  
These instructions assume you have completed the other preparatory steps: [[Code Signing for macOS|code signed]] the application, implemented the [[Hardened runtime for macOS|hardened runtime capability]], [[Code Signing for macOS|code signed]] the installer pkg (if you have one) etc.
+
В этих инструкциях предполагается, что вы выполнили другие подготовительные шаги: [[Code Signing for macOS| подписание кода]] приложения, реализованное в [[Hardened runtime for macOS| усиленной среде выполнения]], [[Code Signing for macOS| подписание кода]] установщика pkg (если он у вас есть) и т.д.
  
You can't upload the .app bundle directly to the notary service, you need to create a compressed archive containing the application or you can put applications, kernel extensions, and other software in a container, like a disk image, and notarize the container. The notary service accepts disk images (UDIF format), signed flat installer packages, and ZIP archives. It processes nested containers as well, like packages inside a disk image.
+
Вы не можете выгрузить пакет .app непосредственно в нотариальную службу, вам необходимо создать сжатый архив, содержащий приложение, или вы можете поместить приложения, расширения ядра и другое программное обеспечение в контейнер, например образ диска, и нотариально заверить контейнер. Нотариальная служба принимает образы дисков (формат UDIF), подписанный установщиком плоских пакетов, и ZIP-архивы. Он также обрабатывает вложенные контейнеры, например пакеты внутри образа диска.
  
  
=== Step 1 - Create disk image ===
+
=== Шаг 1 - Создание образа диска ===
  
Create a disk image by opening a Terminal and running the following command:
+
Создайте образ диска, открыв Терминал и выполнив следующую команду:
  
 
<syntaxhighlight lang="bash">
 
<syntaxhighlight lang="bash">
Line 60: Line 60:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
 +
=== Шаг 2 - Код для подписи образа диска ===
  
=== Step 2 - Code sign the disk image ===
+
Код подписывает образ диска, открыв Терминал и выполнив следующую команду:
 
 
Code sign the disk image by opening a Terminal and running the following command:
 
  
 
<syntaxhighlight lang="bash">
 
<syntaxhighlight lang="bash">
Line 69: Line 68:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
 +
=== Шаг 3. Создание пароля для конкретного приложения ===
 +
Чтобы сгенерировать пароль для конкретного приложения, обратитесь к этой [https://support.apple.com/en-us/HT204397 статье службы поддержки Apple].
 +
{{Note| это пароль, который будет специфическим для приложения нотариального заверения (xcrun altool), а не для нотариально заверенного приложения. Поэтому вам нужно сделать это только один раз, но убедитесь, что вы скопировали сгенерированный пароль и сохранили его где-нибудь.}}
 +
<br/>
 +
{{Tip|Сохраните пароль в связке ключей с помощью: <br/><syntaxhighlight lang="bash" inline>xcrun altool -u "<your email>" -p "<app-specific pwd>" --store-password-in-keychain-item "<name for pwd>"</syntaxhighlight> <br/> <br/> А затем вы можете использовать <syntaxhighlight lang="bash" inline>"@keychain:<name for pwd>"</syntaxhighlight> вместо <syntaxhighlight lang="bash" inline>"<app-specific pwd>"</syntaxhighlight> в следующих командах.}}
  
=== Step 3 - Generate an app-specific password ===
+
=== Шаг 4 - Загрузка образа диска в нотариальную службу ===
  
To generate an app-specific password, refer to this [https://support.apple.com/en-us/HT204397 Apple Support article]. ''Note:'' this is a password that will be specific to the notarization application (xcrun altool) and not to the application being notarized. You therefore only need to do this once, but make sure you copy the generated password and save it somewhere.
+
{{Note|Когда вы нотариально заверяете образ диска контейнера, altool также нотариально заверяет приложение внутри, поэтому вы можете пропустить этап нотариального заверения самого приложения.}}
  
{{Tip|Save the password to your keychain with: <br/> <br/><syntaxhighlight lang="bash" inline>xcrun altool -u "<your email>" -p "<app-specific pwd>" --store-password-in-keychain-item "<name for pwd>"</syntaxhighlight> <br/> <br/> and then you can use <syntaxhighlight lang="bash" inline>"@keychain:<name for pwd>"</syntaxhighlight> instead of <syntaxhighlight lang="bash" inline>"<app-specific pwd>"</syntaxhighlight> in the following commands.}}
 
  
=== Step 4 - Upload the disk image to the notary service ===
+
Загрузите файл образа диска в нотариальную службу Apple, открыв Терминал и выполнив следующую команду:
 
 
{{Note|When you notarize the container disk image, altool also notarizes the application inside, so you can skip the step of notarizing the application itself.}}
 
 
 
 
 
Upload the disk image file to the Apple notary service by opening a Terminal and running the following command:
 
  
 
<syntaxhighlight lang="bash">
 
<syntaxhighlight lang="bash">
Line 87: Line 85:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
The ''primary-bundle-id'' helps you keep track of automated correspondence from the notarization service. The value you give doesn’t need to match the bundle identifier of the submitted app or have any particular value. It only needs to make sense to you. The notarization service includes the value whenever it emails you regarding the given <code>altool</code> submission.
+
''primary-bundle-id'' помогает отслеживать автоматическую корреспонденцию от службы нотариального заверения. Указанное вами значение не обязательно должно совпадать с идентификатором пакета отправленного приложения или иметь какое-либо конкретное значение. Это должно иметь смысл только для вас. Служба нотариального заверения включает значение всякий раз, когда она отправляет вам электронное письмо относительно данного <code>altool</code> представления.
  
If the upload is successful you should receive output similar to the following:
+
Если загрузка прошла успешно, вы должны получить следующий результат:
  
 
<pre>
 
<pre>
Line 96: Line 94:
 
</pre>
 
</pre>
  
 +
=== Шаг 5 - Проверка процесса нотариального заверения ===
  
=== Step 5 - Check the notarization process ===
+
Процесс нотариального заверения обычно занимает менее часа, поэтому вы можете время от времени проверять его ход, открывая Терминал и выполняя следующую команду:
 
 
The notarization process generally takes less than an hour, so you may want to check its progress from time to time by opening a Terminal and running the following command:
 
  
 
<syntaxhighlight lang="bash">
 
<syntaxhighlight lang="bash">
Line 105: Line 102:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
When the notarization process completes successfully the above command will return information similar to the following:
+
Когда процесс нотариального заверения завершится успешно, вышеуказанная команда вернет информацию, подобную следующей:
  
 
<pre>
 
<pre>
Line 117: Line 114:
 
</pre>
 
</pre>
  
You should also receive an email from Apple similar to the following for a successful notarization:
+
Вы также должны получить электронное письмо от Apple, подобное приведенному ниже, в случае успешного нотариального заверения:
  
 
<pre>
 
<pre>
 
Dear <First_Name>,
 
Dear <First_Name>,
  
Your Mac software has been notarized. You can now export this software and distribute it directly to users.
+
Your Mac software has been notarized. You can now export this software and distribute it directly to users.(rus: Программное обеспечение вашего Mac было нотариально заверено. Теперь вы можете экспортировать это программное обеспечение и распространять его непосредственно среди пользователей.)
  
 
Bundle Identifier: com.example.MyApp.001
 
Bundle Identifier: com.example.MyApp.001
 
Request Identifier: 3af4e56f-162b-75bc-827f-7233f92bf20c
 
Request Identifier: 3af4e56f-162b-75bc-827f-7233f92bf20c
  
For details on exporting a notarized app, visit Xcode Help or the notarization guide.
+
For details on exporting a notarized app, visit Xcode Help or the notarization guide.(rus: Для получения дополнительных сведений об экспорте нотариально заверенного приложения посетите справку Xcode или руководство по нотариальному заверению.)
  
 
Best Regards,
 
Best Regards,
Line 133: Line 130:
 
</pre>
 
</pre>
  
 +
=== Шаг 6 - Прикрепление удостоверения к образу диска ===
  
=== Step 6 - Staple the ticket to the disk image ===
+
В процессе нотариального заверения создается удостоверение, которое сообщает Gatekeeper, что ваше приложение нотариально заверено. После успешного завершения нотариального заверения в следующий раз, когда любой пользователь попытается запустить ваше приложение в macOS 10.14 или более поздней версии, Gatekeeper найдет удостоверение в Интернете. Сюда входят пользователи, которые загрузили ваше приложение до нотариального заверения.
 
 
The notarization process produces a ticket that tells Gatekeeper that your application is notarized. After notarization completes successfully, the next time any user attempts to run your application on macOS 10.14 or later, Gatekeeper will find the ticket online. This includes users who downloaded your application before notarization.
 
  
After step 5 receives the "Package Approved" status message, you should also attach the ticket to the disk image file using the stapler tool, so that future distributions include the ticket. This ensures that Gatekeeper can find the ticket even when a network connection is not available.  
+
После того, как на шаге 5 будет получено сообщение о статусе «Пакет одобрен», вы также должны прикрепить удостоверение к файлу образа диска с помощью инструмента прикрепления, чтобы в будущие дистрибутивы включили билет. Это гарантирует, что Gatekeeper сможет найти удостоверение, даже если сетевое соединение недоступно.
  
To staple the ticket to the disk image file, open a Terminal and run the following command:
+
Чтобы прикрепить удостоверение к файлу образа диска, откройте Терминал и выполните следующую команду:
  
 
<syntaxhighlight lang="bash">
 
<syntaxhighlight lang="bash">
Line 146: Line 142:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
If the command completes successfully, the output should be similar to:
+
Если команда завершится успешно, вывод должен быть похож на:
  
 
<pre>
 
<pre>
Line 154: Line 150:
 
</pre>
 
</pre>
  
 +
=== Шаг 7 - Подтверждение нотариального заверения образа диска ===
  
=== Step 7 - Verify notarization of the disk image ===
+
Чтобы подтвердить нотариальное заверение образа диска, откройте Терминал и выполните следующую команду:
 
 
To verify the notarization of the disk image, open a Terminal and run the following command:
 
  
 
<syntaxhighlight lang="bash">
 
<syntaxhighlight lang="bash">
Line 163: Line 158:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
A successful verification of the notarization process should produce output similar to the following:
+
Успешная проверка процесса нотариального заверения должна привести к примерно следующему результату:
  
 
<pre>
 
<pre>
Line 171: Line 166:
 
</pre>
 
</pre>
  
 +
=== Шаг 8 - Подтвердить нотариальное заверение приложения ===
  
=== Step 8 - Verify notarization of the application ===
+
Чтобы подтвердить нотариальное заверение приложения, установите приложение, откройте Терминал и выполните следующую команду:
 
 
To verify the notarization of the application, install the application, open a Terminal and run the following command:
 
  
 
<syntaxhighlight lang="bash">
 
<syntaxhighlight lang="bash">
Line 180: Line 174:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
A successful verification of the notarization process should produce output similar to the following:
+
Успешное подтверждение процесса нотариального заверения должна привести к примерно следующему результату:
  
 
<pre>
 
<pre>
Line 188: Line 182:
 
</pre>
 
</pre>
  
'''Important:''' test the application by putting it in the Applications directory. It's treated differently by the Gatekeeper when in the "installed" location.
+
'''Важно:''' протестируйте приложение, поместив его в каталог Applications. Оно по-разному обрабатывается Gatekeeper'ом, когда находится в "установленном" месте.
  
Alternatively, the Apple-recommended way to verify the notarization of an application is to open a Terminal and run the following command:
+
В качестве альтернативы, рекомендуемый Apple способ проверить нотариальное заверение приложения - открыть Терминал и выполнить следующую команду:
  
 
<pre>
 
<pre>
Line 196: Line 190:
 
</pre>
 
</pre>
  
A successful verification of the notarization process should produce output similar to the following:
+
Успешная верификация процесса нотариального заверения должна привести к примерно следующему результату:
  
 
<pre>
 
<pre>
Line 203: Line 197:
 
</pre>
 
</pre>
  
== Notarizing a command line tool ==
+
== Нотариальное заверение инструмента командной строки ==
  
Command line tools can be code signed, but they cannot be easily notarized because they do not have an [[Application Bundle]] and a standalone <tt>Info.plist</tt> [[macOS property list files|property list file]]. You can relatively easily insert an <tt>Info.plist</tt> file in your command line tool executable.
+
Инструменты командной строки могут быть подписаны кодом, но их нелегко нотариально заверить, потому что у них нет [[Application Bundle]] и отдельного <tt>Info.plist</tt> [[macOS property list files|property list file]]. Вы можете относительно легко вставить файл <tt>Info.plist</tt> в исполняемый файл инструмента командной строки.
  
=== Inserting an Info.plist in a command line executable ===
+
=== Вставка Info.plist в исполняемый файл командной строки ===
  
Here is a template that you can customise for your command line utility. I extracted it from a command line utility executable written in C named "simplereach" which I built with Xcode 11.3.1 on Mojave after enabling the "Create Info.plist Section in Binary" under the "Packaging" options (I have omitted the unnecessary Xcode-related build info from it).
+
Вот шаблон, который вы можете настроить для своей утилиты командной строки. Я извлек его из исполняемого файла утилиты командной строки, написанного на C и названного "simplereach", который я создал с помощью Xcode 11.3.1 в Mojave после включения "Create Info.plist Section in Binary"(Создать раздел Info.plist в двоичном формате) в параметрах "Packaging"(Упаковка) (я пропустил ненужные Xcode-related build info).
  
 
<syntaxhighlight lang=xml>
 
<syntaxhighlight lang=xml>
Line 254: Line 248:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
You will need to modify a few key strings in the above file. Substitute your own:
+
Вам нужно будет изменить несколько ключевых строк в приведенном выше файле. Замените свой:
  
* '''BuildMachineOSBuild''' string can be obtained from a Terminal with the command <tt>sw_vers</tt>. The "18G8022" strong is for Mojave 10.14.6.
+
* '''BuildMachineOSBuild''' строку можно получить из Терминала с помощью команды <tt>sw_vers</tt>. '18G8022' предназначена строго для Mojave 10.14.6.
* '''CFBundleDevelopmentRegion''' string if it is not "English".
+
* '''CFBundleDevelopmentRegion''' строка, если она не "английская".
* '''CFBundleExecutable''' string with your utility name.
+
* '''CFBundleExecutable''' строка с названием вашей утилиты.
* '''CFBundleIdentifier''' string (conventionally your domain name in reverse followed by utility name; feel free use anything unique).
+
* '''CFBundleIdentifier''' строка (обычно ваше доменное имя в обратном порядке, за которым следует имя утилиты; не стесняйтесь использовать что-нибудь уникальное).
* '''CFBundleName''' string (use the same value as for CFBundleExecutable).
+
* '''CFBundleName''' строка (используйте то же значение, что и для CFBundleExecutable).
* '''CFBundleShortVersionString''' string with your version number.
+
* '''CFBundleShortVersionString''' строка с номером вашей версии.
* '''LSMinimumSystemVersion''' string with the minimum macOS version on which your utility will run.
+
* '''LSMinimumSystemVersion''' строка с минимальной версией macOS, на которой будет работать ваша утилита.
  
You can then insert the <tt>Info.plist</tt> file into your application by telling the linker to add it as a __TEXT section named __info_plist:
+
Затем вы можете вставить файл <tt>Info.plist</tt> в свое приложение, указав компоновщику добавить его как раздел __TEXT с именем __info_plist:
  
 
  fpc -k"-sectcreate __TEXT __info_plist Info.plist" my_utility.pas
 
  fpc -k"-sectcreate __TEXT __info_plist Info.plist" my_utility.pas
  
To check whether it has been successfully inserted you can run the following command in a Terminal:
+
Чтобы проверить, успешно ли он вставлен, вы можете запустить следующую команду в Терминале:
  
 
  otool -X -v -s __TEXT __info_plist my_utility
 
  otool -X -v -s __TEXT __info_plist my_utility
  
=== Signing a command line executable ===  
+
=== Подпись исполняемого файла командной строки ===  
  
Now that the <tt>Info.plist</tt> file has been inserted in the executable, you are ready to code sign it by executing the following commands in a Terminal:
+
Теперь, когда файл <tt>Info.plist</tt> был вставлен в исполняемый файл, вы готовы подписать его кодом, выполнив следующие команды в Терминале:
  
 
  cd /path/to/my_utility
 
  cd /path/to/my_utility
Line 281: Line 275:
 
  codesign -f --strict --timestamp --options=runtime -s "Developer ID Application: YOUR NAME (TEAM_ID)" bin/my_utility
 
  codesign -f --strict --timestamp --options=runtime -s "Developer ID Application: YOUR NAME (TEAM_ID)" bin/my_utility
  
It is ''critical'' that you create the <tt>bin</tt> directory and move your utility to it before signing. Failure to do so will result in a <tt>_CodeSignature directory</tt> being created which is not appropriate for a command line utility and the notarisation process will fail.
+
''Критично'', чтобы вы создали каталог <tt>bin</tt> и переместили в него свою утилиту перед подписанием. В противном случае создастся каталог <tt>_CodeSignature</tt>, который не подойдет для утилиты командной строки, и процесс нотариального заверения не состоится.
  
To verify this was successful you can run the following command in a Terminal:
+
Чтобы убедиться, что ваши усилия увенчались успехом, вы можете запустить следующую команду в Терминале:
  
 
  codesign -vv bin/my_utility
 
  codesign -vv bin/my_utility
  
If code signing was successful, the output should be something similar to:  
+
Если подписание кода прошло успешно, результат должен быть примерно таким:  
  
 
  my_utility: valid on disk
 
  my_utility: valid on disk
  my_utility: satisfies its Designated Requirement  
+
  my_utility: satisfies its Designated Requirement
  
=== Submitting a command line executable for notarization ===
+
=== Отправка исполняемого файла командной строки на нотариальное заверение ===
  
As you cannot notarize a bare executable, you need to incorporate it into a container (.dmg - Disk Image, .pkg - Installer Package, or a ZIP archive file). A ZIP archive is the simplest so in a Terminal execute the following command:
+
Поскольку вы не можете нотариально заверить пустой исполняемый файл, вам необходимо включить его в контейнер (.dmg - образ диска, .pkg - пакет установщика или файл архива ZIP). ZIP-архив является самым простым, поэтому в Терминале выполните следующую команду:
  
 
  zip my_utility.zip bin/my_utility
 
  zip my_utility.zip bin/my_utility
  
You are now ready to upload your command line utility to Apple's servers for notarization. In a terminal execute the following command:
+
Теперь вы готовы загрузить свою утилиту командной строки на серверы Apple для нотариального заверения. В терминале выполните следующую команду:
  
 
  xcrun altool --notarize-app --primary-bundle-id "<your identifier>" -u "<your email>" -p "<app-specific pwd>" -t osx -f my_utility.zip
 
  xcrun altool --notarize-app --primary-bundle-id "<your identifier>" -u "<your email>" -p "<app-specific pwd>" -t osx -f my_utility.zip
  
If you do not already have an app specific password, see [[#Step_3_-_Generate_an_app-specific_password|above]] for how to generate one.
+
Если у вас еще нет пароля для приложения, см. [[Notarization_for_macOS_10.14.5%2B/ru#.D0.A8.D0.B0.D0.B3_3._.D0.A1.D0.BE.D0.B7.D0.B4.D0.B0.D0.BD.D0.B8.D0.B5_.D0.BF.D0.B0.D1.80.D0.BE.D0.BB.D1.8F_.D0.B4.D0.BB.D1.8F_.D0.BA.D0.BE.D0.BD.D0.BA.D1.80.D0.B5.D1.82.D0.BD.D0.BE.D0.B3.D0.BE_.D0.BF.D1.80.D0.B8.D0.BB.D0.BE.D0.B6.D0.B5.D0.BD.D0.B8.D1.8F | выше]], чтобы узнать, как его сгенерировать.
  
The ''primary-bundle-id'' helps you keep track of automated correspondence from the notarization service. The value you give doesn’t need to match the bundle identifier of the submitted app or have any particular value. It only needs to make sense to you. The notarization service includes the value whenever it emails you regarding the given altool submission.
+
''Primary-bundle-id'' помогает отслеживать автоматическую корреспонденцию от службы нотариального заверения. Указанное вами значение не обязательно должно совпадать с идентификатором пакета отправленного приложения или иметь какое-либо конкретное значение. Это должно иметь смысл только для вас. Услуга нотариального заверения включает значение всякий раз, когда она отправляет вам электронное письмо относительно данной альтернативной заявки.
  
If the upload is successful you should receive output similar to the following:
+
Если загрузка прошла успешно, вы должны получить следующий результат:
  
 
  No errors uploading 'my_utility'.
 
  No errors uploading 'my_utility'.
 
  RequestUUID = 3af4e56f-162b-75bc-827f-7233f92bf20c
 
  RequestUUID = 3af4e56f-162b-75bc-827f-7233f92bf20c
  
=== Checking the notarization progress ===
+
=== Проверка процесса нотариального заверения ===
  
The notarization process generally takes from 10 to 15 minutes, so you may want to check its progress from time to time by running the following command from a Terminal:
+
Процесс нотариального заверения обычно занимает от 10 до 15 минут, поэтому вы можете время от времени проверять его ход, выполняя следующую команду из Терминала:
  
 
  xcrun altool --notarization-history 0 -u "<your email>" -p "<app-specific pwd>"
 
  xcrun altool --notarization-history 0 -u "<your email>" -p "<app-specific pwd>"
  
When the notarization process completes successfully the above command will return information similar to the following:
+
Когда процесс нотариального заверения завершится успешно, вышеуказанная команда вернет информацию, подобную следующей:
 
+
<pre>
 
  Notarization History - page 0
 
  Notarization History - page 0
  
Line 326: Line 320:
  
 
  Next page value: 1575786243000
 
  Next page value: 1575786243000
 +
</pre>
  
You should also receive an email from Apple similar to the following for a successful notarization:
+
Вы также должны получить электронное письмо от Apple, подобное приведенному ниже, в случае успешного нотариального заверения:
  
 +
<pre>
 
  Dear <First Name>,
 
  Dear <First Name>,
  
  Your Mac software has been notarized. You can now export this software and distribute it directly to users.
+
  Your Mac software has been notarized. You can now export this software and distribute it directly to users.(rus: Программное обеспечение вашего Mac было нотариально заверено. Теперь вы можете экспортировать это программное обеспечение и распространять его непосредственно среди пользователей.)
  
 
  Bundle Identifier:  
 
  Bundle Identifier:  
 
  Request Identifier: 70dbe301-d3a7-4931-9ec3-61c5cc80573c
 
  Request Identifier: 70dbe301-d3a7-4931-9ec3-61c5cc80573c
  
  For details on exporting a notarized app, visit Xcode Help or the notarization guide.  
+
  For details on exporting a notarized app, visit Xcode Help or the notarization guide.(rus: Для получения дополнительных сведений об экспорте нотариально заверенного приложения посетите справку Xcode или руководство по нотариальному заверению.)
 +
 
 
  Best Regards,
 
  Best Regards,
 
  Apple Developer Relations
 
  Apple Developer Relations
 +
</pre>
  
In case of a notarization failure, consult [[#Troublehsooting|Troubleshooting]] below for help.
+
В случае неудачного нотариального заверения обратитесь за помощью к разделу [[Notarization_for_macOS_10.14.5%2B/ru#.D0.A3.D1.81.D1.82.D1.80.D0.B0.D0.BD.D0.B5.D0.BD.D0.B8.D0.B5_.D0.BD.D0.B5.D0.BF.D0.BE.D0.BB.D0.B0.D0.B4.D0.BE.D0.BA |Устранение неполадок]] ниже.
  
=== Verifying notarization of a command line executable ===
+
=== Нотариальное заверение исполняемого файла командной строки ===
  
To verify the notarization of a command line tool, open a Terminal and run the following command:
+
Чтобы проверить нотариальное заверение инструмента командной строки, откройте Терминал и выполните следующую команду:
  
 
  spctl -a -t open --context context:primary-signature -vv my_utility  
 
  spctl -a -t open --context context:primary-signature -vv my_utility  
  
A successful verification of a properly notarized command line executable should produce output similar to the following:
+
Успешная проверка правильно нотариально заверенного исполняемого файла командной строки должна привести к выводу, подобному следующему:
  
 
  my_utility: accepted
 
  my_utility: accepted
Line 354: Line 352:
 
  origin=Developer ID Application: Your Name (Z9HBGNDZZ9)
 
  origin=Developer ID Application: Your Name (Z9HBGNDZZ9)
  
== Troubleshooting ==
+
== Устранение неполадок ==
  
=== Notarization upload process ===
+
=== Процесс загрузки нотариального заверения ===
  
If the notarisation upload process does not go well, you should be able to find a compressed log file in your temporary directory which may shed some light on what happened. You can view it by opening a Terminal and running the following commands (substitute the name of your log file which includes your application bundle-id):
+
Если процесс загрузки нотариального заверения не проходит должным образом, вы сможете найти сжатый файл журнала во временном каталоге, который может пролить свет на то, что произошло. Вы можете просмотреть его, открыв Терминал и выполнив следующие команды (замените имя вашего файла журнала, который включает идентификатор пакета вашего приложения):
  
 
<syntaxhighlight lang="bash">
 
<syntaxhighlight lang="bash">
Line 365: Line 363:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
which, for a successful notarization upload, should look similar to:
+
который для успешной загрузки нотариального заверения должен выглядеть примерно так:
  
 
   [2019-12-31 19:46:46 AEDT] <main>  INFO: Starting upload for packageName: org.sentry.myapp-20191231004646-273.itmsp
 
   [2019-12-31 19:46:46 AEDT] <main>  INFO: Starting upload for packageName: org.sentry.myapp-20191231004646-273.itmsp
Line 383: Line 381:
 
   [2019-12-31 19:46:49 AEDT] <main>  INFO: 456.36 KB/s in 3 seconds
 
   [2019-12-31 19:46:49 AEDT] <main>  INFO: 456.36 KB/s in 3 seconds
  
=== Notarization process failures ===
+
=== Сбои в процессе нотариального заверения ===
  
If the when you check you find that the notarization process has failed. For example:
+
Если при проверке вы обнаружите, что процесс нотариального заверения не удался. Например:
  
 
<pre>
 
<pre>
Line 393: Line 391:
 
</pre>
 
</pre>
  
You can retrieve the URL for the notarization log file with the command:
+
Вы можете получить URL-адрес файла журнала нотариального заверения с помощью команды:
  
 
<syntaxhighlight lang=bash>
 
<syntaxhighlight lang=bash>
Line 399: Line 397:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
which should yield information similar to the following:
+
который должен дать информацию, подобную следующей:
  
 
<pre>
 
<pre>
Line 413: Line 411:
 
</pre>
 
</pre>
  
You can then cut and paste the LogFileURL into your web browser and retrieve the notarization process log file which will look something like this:
+
Затем вы можете вырезать и вставить LogFileURL в свой веб-браузер и получить файл журнала процесса нотариального заверения, который будет выглядеть примерно так:
  
<pre>
+
<syntaxhighlight lang=json>
 
{
 
{
 
   "logFormatVersion": 1,
 
   "logFormatVersion": 1,
Line 437: Line 435:
 
   ]
 
   ]
 
}
 
}
</pre>
+
</syntaxhighlight>
  
In the above failure case, it was because the executable had not been [[Hardened runtime for macOS|hardened]].
+
В приведенном выше случае сбоя это произошло из-за того, что исполняемый файл не был [[Hardened runtime for macOS | с подписанной защитой]].
  
It is also worthwhile mentioning that it is ''always'' worth retrieving the notarization log file to check for warnings which are not yet errors so that you can fix them before they do become errors which prevent successful notarization.
+
Также стоит упомянуть, что ''всегда'' стоит извлекать файл журнала нотариального заверения для проверки предупреждений, которые еще не являются ошибками, чтобы вы могли исправить их до того, как они станут ошибками, препятствующими успешному нотариальному заверению.
  
Here is an example of a notarization process log from a successful notarization:
+
Вот пример протокола процесса нотариального заверения после успешного нотариального заверения:
  
<pre>
+
<syntaxhighlight lang=json>
 
{
 
{
 
   "logFormatVersion": 1,
 
   "logFormatVersion": 1,
Line 494: Line 492:
 
   "issues": null
 
   "issues": null
 
}
 
}
</pre>
+
</syntaxhighlight>
  
=== Notarization check failures ===
+
=== Сбои при проверке нотариального заверения ===
  
If the notarization process succeeds, but when you check whether your application is properly notarized and it does not pass the notarization check successfully, you can use the <code>Console.app</code> to inspect the log files for information about the rejection (after trying to launch the blocked application). Be aware you should open the <code>Console.app</code> ''before'' trying to open your blocked application, otherwise not all messages may be logged. You should choose your device in the left sidebar of the <code>Console.app</code> and check for the process '''XprotectService''' in the logs.
+
Если процесс нотариального заверения прошел успешно, но вы получили сбой при проверке успешности нотариального заверения, вы можете использовать <code>Console.app</code> для проверки файлов журнала на предмет информации об отклонении (после попытки запустить заблокированное приложение). Имейте в виду, что вы должны открыть <code>Console.app</code> ''перед'' попыткой открыть ваше <code>Console.app</code>, иначе не все сообщения могут быть зарегистрированы. Вы должны выбрать свое устройство на левой боковой панели <code>Console.app</code> и проверить в журналах процесс '''XprotectService'''.
  
== See also ==
+
== См.также ==
  
 
* [[Apple Developer Certificates]]
 
* [[Apple Developer Certificates]]
Line 507: Line 505:
 
* [[Signing and Notarization FAQ]]
 
* [[Signing and Notarization FAQ]]
  
== External links ==
+
== Внешние ссылки ==
  
 
* [https://developer.apple.com/documentation/security/notarizing_your_app_before_distribution Apple: Notarizing your app before distribution]
 
* [https://developer.apple.com/documentation/security/notarizing_your_app_before_distribution Apple: Notarizing your app before distribution]

Latest revision as of 20:37, 1 January 2022

English (en) русский (ru)

macOSlogo.png

Эта статья относится только к macOS.

См. также: Multiplatform Programming Guide


Обзор

Начиная с macOS 10.14.5 (Mojave), программное обеспечение, подписанное новым сертификатом разработчика Apple, и все новые или обновленные расширения ядра должны быть нотариально заверены для запуска. Начиная с macOS 10.15 (Catalina), все программное обеспечение, созданное после 1 июня 2019 года, и код, подписанный сертификатом разработчика Apple, необходимо нотариально заверить. Нотариальное заверение не требуется для программного обеспечения, распространяемого через Apple App Store, поскольку процесс отправки в App Store уже включает эквивалентные проверки безопасности.

Нотариальное заверение разработано Apple, чтобы дать пользователям больше уверенности в том, что программное обеспечение, подписанное разработчиками Apple, было проверено Apple на наличие вредоносных компонентов. Нотариальное заверение - это не проверка приложения. Нотариальная служба Apple - это автоматизированная система, которая сканирует программное обеспечение на наличие вредоносного содержимого, проверяет наличие проблем с подписью кода и возвращает результаты. Если проблем нет, нотариальная служба генерирует удостоверение для установки программного обеспечения; нотариальная служба также публикует это удостоверение в Интернете, где его может найти Gatekeeper (прим.перев.: букв. привратник).

Когда пользователь впервые устанавливает или запускает программное обеспечение, наличие удостоверения (онлайн или прикрепленного к исполняемому файлу) сообщает Gatekeeper, что Apple нотариально заверила программное обеспечение. Затем Gatekeeper помещает описательную информацию в диалоговое окно первоначального запуска, чтобы помочь пользователю сделать осознанный выбор, запускать ли приложение.

Light bulb  Примечание: Даже если приложение не было нотариально заверено, его все равно можно запустить, щелкнув приложение, удерживая клавишу Control, или щелкнув правой кнопкой мыши для вызова контекстного меню, выбрав «Открыть» - см. диалоговое "обходное" окно Gatekeeper в галерее ниже.

Подписание кода приложения без нотариального заверения - теперь совершенно бессмысленное упражнение, если только вы не распространяете свое приложение только через App Store.

Диалоговые окна Gatekeeper

Требования к нотариальному заверению

Для нотариального заверения требуются инструменты командной строки Xcode от Xcode 10 или новее. Для создания нового приложения для нотариального заверения требуется macOS 10.13.6 или новее. Для прикрепления приложения требуется macOS 10.12 или новее.

Нотариальная служба Apple требует от вас:

  • Включения подписывания кода для всех распространяемых вами исполняемых файлов.
  • Включения возможности заверения через Hardened Runtime для вашего приложения и целей командной строки.
  • Использования приложения «Developer ID», расширения ядра или сертификата установщика для подписи кода.
  • Включения безопасной метки времени в свою подпись для подписи кода (включения параметра --timestamp при запуске инструмента кодовой подписи).
  • Не включать право com.apple.security.get-task-allow со значением, равным любому варианту истинного. Если в вашем программном обеспечении размещаются сторонние плагины и требуется это право для отладки плагина в контексте исполняемого файла хоста, см. Avoid the Get-Task-Allow Entitlement.
  • Ссылки на SDK для macOS 10.9 или новее.

3 сентября 2019 года Apple объявила, что до января 2020 года разработчики могут нотариально заверить новые версии приложений, даже если они не были заверены через hardened или полностью соответствуют обычным требованиям. Позднее этот срок был продлен до 3 февраля 2020 года. Вышеуказанные требования к нотариальному удостоверению теперь действуют в полной мере.

Заявление Apple от 23 декабря 2019 г.

В июне мы объявили, что все программное обеспечение Mac, распространяемое за пределами Mac App Store, должно быть нотариально заверено Apple, чтобы оно могло работать по умолчанию на macOS Catalina. В сентябре мы временно скорректировали предварительные условия нотариального заверения, чтобы упростить этот переход и защитить пользователей macOS Catalina, которые продолжают использовать более старые версии программного обеспечения. Начиная с 3 февраля 2020 года, все представленное программное обеспечение должно соответствовать предварительным требованиям для нотариального заверения.

Если вы еще не сделали этого, загрузите программное обеспечение в нотариальную службу и просмотрите журнал разработчика на наличие предупреждений. Эти предупреждения станут ошибками с 3 февраля и должны быть исправлены, чтобы ваше программное обеспечение было нотариально заверенным. Программное обеспечение, нотариально заверенное до 3 февраля, по умолчанию будет продолжать работать на macOS Catalina.

Напоминаем, что все пакеты установщика должны быть подписаны, поскольку они могут содержать исполняемый код. Образы дисков не нужно подписывать, хотя их подписание может помочь вашим пользователям проверить их содержимое.

Нотариальное заверение заявки

В этих инструкциях предполагается, что вы выполнили другие подготовительные шаги: подписание кода приложения, реализованное в усиленной среде выполнения, подписание кода установщика pkg (если он у вас есть) и т.д.

Вы не можете выгрузить пакет .app непосредственно в нотариальную службу, вам необходимо создать сжатый архив, содержащий приложение, или вы можете поместить приложения, расширения ядра и другое программное обеспечение в контейнер, например образ диска, и нотариально заверить контейнер. Нотариальная служба принимает образы дисков (формат UDIF), подписанный установщиком плоских пакетов, и ZIP-архивы. Он также обрабатывает вложенные контейнеры, например пакеты внутри образа диска.


Шаг 1 - Создание образа диска

Создайте образ диска, открыв Терминал и выполнив следующую команду:

hdiutil create -volname MyApp -srcfolder /path/to/folder -ov -format UDBZ MyApp.dmg

Шаг 2 - Код для подписи образа диска

Код подписывает образ диска, открыв Терминал и выполнив следующую команду:

codesign -s "Developer ID Application: Your Name (Team ID)" --timestamp MyApp.dmg

Шаг 3. Создание пароля для конкретного приложения

Чтобы сгенерировать пароль для конкретного приложения, обратитесь к этой статье службы поддержки Apple.

Light bulb  Примечание: это пароль, который будет специфическим для приложения нотариального заверения (xcrun altool), а не для нотариально заверенного приложения. Поэтому вам нужно сделать это только один раз, но убедитесь, что вы скопировали сгенерированный пароль и сохранили его где-нибудь.


Note-icon.png

Подсказка: Сохраните пароль в связке ключей с помощью:
xcrun altool -u "<your email>" -p "<app-specific pwd>" --store-password-in-keychain-item "<name for pwd>"

А затем вы можете использовать "@keychain:<name for pwd>" вместо "<app-specific pwd>" в следующих командах.

Шаг 4 - Загрузка образа диска в нотариальную службу

Light bulb  Примечание: Когда вы нотариально заверяете образ диска контейнера, altool также нотариально заверяет приложение внутри, поэтому вы можете пропустить этап нотариального заверения самого приложения.


Загрузите файл образа диска в нотариальную службу Apple, открыв Терминал и выполнив следующую команду:

xcrun altool --notarize-app --primary-bundle-id "<your identifier>" -u "<your email>" -p "<app-specific pwd>" -t osx -f /path/to/MyApp.dmg

primary-bundle-id помогает отслеживать автоматическую корреспонденцию от службы нотариального заверения. Указанное вами значение не обязательно должно совпадать с идентификатором пакета отправленного приложения или иметь какое-либо конкретное значение. Это должно иметь смысл только для вас. Служба нотариального заверения включает значение всякий раз, когда она отправляет вам электронное письмо относительно данного altool представления.

Если загрузка прошла успешно, вы должны получить следующий результат:

No errors uploading 'MyApp.dmg'.
RequestUUID = 3af4e56f-162b-75bc-827f-7233f92bf20c

Шаг 5 - Проверка процесса нотариального заверения

Процесс нотариального заверения обычно занимает менее часа, поэтому вы можете время от времени проверять его ход, открывая Терминал и выполняя следующую команду:

xcrun altool --notarization-history 0 -u "<your email>" -p "<app-specific pwd>"

Когда процесс нотариального заверения завершится успешно, вышеуказанная команда вернет информацию, подобную следующей:

Notarization History - page 0

Date                      RequestUUID                          Status  Status Code Status Message   
------------------------- ------------------------------------ ------- ----------- ---------------- 
2019-12-08 06:24:03 +0000 3af4e56f-162b-75bc-827f-7233f92bf20c success 0           Package Approved 

Next page value: 1575786243000

Вы также должны получить электронное письмо от Apple, подобное приведенному ниже, в случае успешного нотариального заверения:

Dear <First_Name>,

Your Mac software has been notarized. You can now export this software and distribute it directly to users.(rus: Программное обеспечение вашего Mac было нотариально заверено. Теперь вы можете экспортировать это программное обеспечение и распространять его непосредственно среди пользователей.)

Bundle Identifier: com.example.MyApp.001
Request Identifier: 3af4e56f-162b-75bc-827f-7233f92bf20c

For details on exporting a notarized app, visit Xcode Help or the notarization guide.(rus: Для получения дополнительных сведений об экспорте нотариально заверенного приложения посетите справку Xcode или руководство по нотариальному заверению.)

Best Regards,
Apple Developer Relations

Шаг 6 - Прикрепление удостоверения к образу диска

В процессе нотариального заверения создается удостоверение, которое сообщает Gatekeeper, что ваше приложение нотариально заверено. После успешного завершения нотариального заверения в следующий раз, когда любой пользователь попытается запустить ваше приложение в macOS 10.14 или более поздней версии, Gatekeeper найдет удостоверение в Интернете. Сюда входят пользователи, которые загрузили ваше приложение до нотариального заверения.

После того, как на шаге 5 будет получено сообщение о статусе «Пакет одобрен», вы также должны прикрепить удостоверение к файлу образа диска с помощью инструмента прикрепления, чтобы в будущие дистрибутивы включили билет. Это гарантирует, что Gatekeeper сможет найти удостоверение, даже если сетевое соединение недоступно.

Чтобы прикрепить удостоверение к файлу образа диска, откройте Терминал и выполните следующую команду:

xcrun stapler staple /path/to/MyApp.dmg

Если команда завершится успешно, вывод должен быть похож на:

Processing: /Path/to/MyApp.dmg
Processing: /Path/to/MyApp.dmg
The staple and validate action worked!

Шаг 7 - Подтверждение нотариального заверения образа диска

Чтобы подтвердить нотариальное заверение образа диска, откройте Терминал и выполните следующую команду:

spctl -a -vv -t install MyApp.dmg

Успешная проверка процесса нотариального заверения должна привести к примерно следующему результату:

MyApp.dmg: accepted
source=Notarized Developer ID
origin=Developer ID Application: <Developer Name> (<TEAM_ID>)

Шаг 8 - Подтвердить нотариальное заверение приложения

Чтобы подтвердить нотариальное заверение приложения, установите приложение, откройте Терминал и выполните следующую команду:

spctl -a -vv /Applications/MyApp.app

Успешное подтверждение процесса нотариального заверения должна привести к примерно следующему результату:

/Applications/MyApp.app: accepted
source=Notarized Developer ID
origin=Developer ID Application: <Developer Name> (<TEAM_ID>)

Важно: протестируйте приложение, поместив его в каталог Applications. Оно по-разному обрабатывается Gatekeeper'ом, когда находится в "установленном" месте.

В качестве альтернативы, рекомендуемый Apple способ проверить нотариальное заверение приложения - открыть Терминал и выполнить следующую команду:

xcrun stapler validate MyApp.app

Успешная верификация процесса нотариального заверения должна привести к примерно следующему результату:

Processing: MyApp.app
The validate action worked!

Нотариальное заверение инструмента командной строки

Инструменты командной строки могут быть подписаны кодом, но их нелегко нотариально заверить, потому что у них нет Application Bundle и отдельного Info.plist property list file. Вы можете относительно легко вставить файл Info.plist в исполняемый файл инструмента командной строки.

Вставка Info.plist в исполняемый файл командной строки

Вот шаблон, который вы можете настроить для своей утилиты командной строки. Я извлек его из исполняемого файла утилиты командной строки, написанного на C и названного "simplereach", который я создал с помощью Xcode 11.3.1 в Mojave после включения "Create Info.plist Section in Binary"(Создать раздел Info.plist в двоичном формате) в параметрах "Packaging"(Упаковка) (я пропустил ненужные Xcode-related build info).

<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>BuildMachineOSBuild</key>
	<string>18G8022</string>
	<key>CFBundleDevelopmentRegion</key>
	<string>English</string>
	<key>CFBundleDocumentTypes</key>
	<array>
		<dict>
			<key>CFBundleTypeOSTypes</key>
			<array>
				<string>fold</string>
				<string>disk</string>
				<string>****</string>
			</array>
		</dict>
	</array>
	<key>CFBundleExecutable</key>
	<string>simplereach</string>
	<key>CFBundleIdentifier</key>
	<string>com.mycompany.simplereach</string>
	<key>CFBundleInfoDictionaryVersion</key>
	<string>6.0</string>
	<key>CFBundleName</key>
	<string>simplereach</string>
	<key>CFBundlePackageType</key>
	<string>APPL</string>
	<key>CFBundleShortVersionString</key>
	<string>1.0</string>
	<key>CFBundleSupportedPlatforms</key>
	<array>
		<string>MacOSX</string>
	</array>
	<key>CFBundleVersion</key>
	<string>1</string>
	<key>LSMinimumSystemVersion</key>
	<string>10.14</string>
</dict>
</plist>

Вам нужно будет изменить несколько ключевых строк в приведенном выше файле. Замените свой:

  • BuildMachineOSBuild строку можно получить из Терминала с помощью команды sw_vers. '18G8022' предназначена строго для Mojave 10.14.6.
  • CFBundleDevelopmentRegion строка, если она не "английская".
  • CFBundleExecutable строка с названием вашей утилиты.
  • CFBundleIdentifier строка (обычно ваше доменное имя в обратном порядке, за которым следует имя утилиты; не стесняйтесь использовать что-нибудь уникальное).
  • CFBundleName строка (используйте то же значение, что и для CFBundleExecutable).
  • CFBundleShortVersionString строка с номером вашей версии.
  • LSMinimumSystemVersion строка с минимальной версией macOS, на которой будет работать ваша утилита.

Затем вы можете вставить файл Info.plist в свое приложение, указав компоновщику добавить его как раздел __TEXT с именем __info_plist:

fpc -k"-sectcreate __TEXT __info_plist Info.plist" my_utility.pas

Чтобы проверить, успешно ли он вставлен, вы можете запустить следующую команду в Терминале:

otool -X -v -s __TEXT __info_plist my_utility

Подпись исполняемого файла командной строки

Теперь, когда файл Info.plist был вставлен в исполняемый файл, вы готовы подписать его кодом, выполнив следующие команды в Терминале:

cd /path/to/my_utility
mkdir bin
mv my_utility bin/
codesign -f --strict --timestamp --options=runtime -s "Developer ID Application: YOUR NAME (TEAM_ID)" bin/my_utility

Критично, чтобы вы создали каталог bin и переместили в него свою утилиту перед подписанием. В противном случае создастся каталог _CodeSignature, который не подойдет для утилиты командной строки, и процесс нотариального заверения не состоится.

Чтобы убедиться, что ваши усилия увенчались успехом, вы можете запустить следующую команду в Терминале:

codesign -vv bin/my_utility

Если подписание кода прошло успешно, результат должен быть примерно таким:

my_utility: valid on disk
my_utility: satisfies its Designated Requirement

Отправка исполняемого файла командной строки на нотариальное заверение

Поскольку вы не можете нотариально заверить пустой исполняемый файл, вам необходимо включить его в контейнер (.dmg - образ диска, .pkg - пакет установщика или файл архива ZIP). ZIP-архив является самым простым, поэтому в Терминале выполните следующую команду:

zip my_utility.zip bin/my_utility

Теперь вы готовы загрузить свою утилиту командной строки на серверы Apple для нотариального заверения. В терминале выполните следующую команду:

xcrun altool --notarize-app --primary-bundle-id "<your identifier>" -u "<your email>" -p "<app-specific pwd>" -t osx -f my_utility.zip

Если у вас еще нет пароля для приложения, см. выше, чтобы узнать, как его сгенерировать.

Primary-bundle-id помогает отслеживать автоматическую корреспонденцию от службы нотариального заверения. Указанное вами значение не обязательно должно совпадать с идентификатором пакета отправленного приложения или иметь какое-либо конкретное значение. Это должно иметь смысл только для вас. Услуга нотариального заверения включает значение всякий раз, когда она отправляет вам электронное письмо относительно данной альтернативной заявки.

Если загрузка прошла успешно, вы должны получить следующий результат:

No errors uploading 'my_utility'.
RequestUUID = 3af4e56f-162b-75bc-827f-7233f92bf20c

Проверка процесса нотариального заверения

Процесс нотариального заверения обычно занимает от 10 до 15 минут, поэтому вы можете время от времени проверять его ход, выполняя следующую команду из Терминала:

xcrun altool --notarization-history 0 -u "<your email>" -p "<app-specific pwd>"

Когда процесс нотариального заверения завершится успешно, вышеуказанная команда вернет информацию, подобную следующей:

 Notarization History - page 0

 Date                      RequestUUID                          Status  Status Code Status Message   
 ------------------------- ------------------------------------ ------- ----------- ---------------- 
 2021-04-22 10:55:03 +0000 3af4e56f-162b-76bc-826f-7263f92bf20c success 0           Package Approved 

 Next page value: 1575786243000

Вы также должны получить электронное письмо от Apple, подобное приведенному ниже, в случае успешного нотариального заверения:

 Dear <First Name>,

 Your Mac software has been notarized. You can now export this software and distribute it directly to users.(rus: Программное обеспечение вашего Mac было нотариально заверено. Теперь вы можете экспортировать это программное обеспечение и распространять его непосредственно среди пользователей.)

 Bundle Identifier: 
 Request Identifier: 70dbe301-d3a7-4931-9ec3-61c5cc80573c

 For details on exporting a notarized app, visit Xcode Help or the notarization guide.(rus: Для получения дополнительных сведений об экспорте нотариально заверенного приложения посетите справку Xcode или руководство по нотариальному заверению.) 

 Best Regards,
 Apple Developer Relations

В случае неудачного нотариального заверения обратитесь за помощью к разделу Устранение неполадок ниже.

Нотариальное заверение исполняемого файла командной строки

Чтобы проверить нотариальное заверение инструмента командной строки, откройте Терминал и выполните следующую команду:

spctl -a -t open --context context:primary-signature -vv my_utility 

Успешная проверка правильно нотариально заверенного исполняемого файла командной строки должна привести к выводу, подобному следующему:

my_utility: accepted
source=Notarized Developer ID
origin=Developer ID Application: Your Name (Z9HBGNDZZ9)

Устранение неполадок

Процесс загрузки нотариального заверения

Если процесс загрузки нотариального заверения не проходит должным образом, вы сможете найти сжатый файл журнала во временном каталоге, который может пролить свет на то, что произошло. Вы можете просмотреть его, открыв Терминал и выполнив следующие команды (замените имя вашего файла журнала, который включает идентификатор пакета вашего приложения):

  cd ${TMPDIR}
  gzcat c51ca05f-cf49-405f-be57-26873faab5f6_3073718126753816760org.sentry.myapp-20191231004646-273.itmsp6022059143057318377.log

который для успешной загрузки нотариального заверения должен выглядеть примерно так:

 [2019-12-31 19:46:46 AEDT] <main>  INFO: Starting upload for packageName: org.sentry.myapp-20191231004646-273.itmsp
 [2019-12-31 19:46:46 AEDT] <main>  INFO: Thread Pool Configuration: {processors=12, perCoreThreadMultiplier=1.65, coreThreads=6, maxThreads=14, minConnections=6, maxConnections=13, rateLimit=100000000000 KBs}
 [2019-12-31 19:46:46 AEDT] <main>  INFO: Reservation CPUSource113/v4/93/41/ce/9341ce96-e7bc-2577-eaac-4528c888a70d/metadata.xml created for file: (metadata.xml), part count:(1), file size: (538)
 [2019-12-31 19:46:46 AEDT] <main>  INFO: Reservation CPUSource113/v4/93/41/ce/9341ce96-e7bc-2577-eaac-4528c888a70d/MyApp_31122019.dmg created for file: (MyApp_31122019.dmg), part count:(1), file size: (1400933)
 [2019-12-31 19:46:46 AEDT] <RLT-002>  INFO: Starting upload for reservation: (CPUSource113/v4/93/41/ce/9341ce96-e7bc-2577-eaac-4528c888a70d/metadata.xml) file: (metadata.xml/1) size: 538
 [2019-12-31 19:46:46 AEDT] <RLT-003>  INFO: Starting upload for reservation: (CPUSource113/v4/93/41/ce/9341ce96-e7bc-2577-eaac-4528c888a70d/myapp_31122019.dmg) file: (MyApp_31122019.dmg/1) size: 1400933
 [2019-12-31 19:46:47 AEDT] <RLT-002>  INFO: Finished part upload for: (metadata.xml/1) 2.91 KB/s in 0 seconds
 [2019-12-31 19:46:47 AEDT] <RLT-002>  INFO: Finished upload for reservation: (CPUSource113/v4/93/41/ce/9341ce96-e7bc-2577-eaac-4528c888a70d/metadata.xml) file: (metadata.xml)
 [2019-12-31 19:46:47 AEDT] <pool-8-thread-1>  INFO: Reservation committed: (CPUSource113/v4/93/41/ce/9341ce96-e7bc-2577-eaac-4528c888a70d/metadata.xml) file: (metadata.xml)
 [2019-12-31 19:46:49 AEDT] <RLT-003>  INFO: Finished part upload for: (MyApp_31122019.dmg/1) 781.33 KB/s in 1 second
 [2019-12-31 19:46:49 AEDT] <RLT-003>  INFO: Finished upload for reservation: (CPUSource113/v4/93/41/ce/9341ce96-e7bc-2577-eaac-4528c888a70d/MyApp_31122019.dmg) file: (MyApp_31122019.dmg)
 [2019-12-31 19:46:49 AEDT] <main>  INFO: Waiting on reservation commit(s) to finish.
 [2019-12-31 19:46:49 AEDT] <pool-8-thread-1>  INFO: Reservation committed: (CPUSource113/v4/93/41/ce/9341ce96-e7bc-2577-eaac-4528c888a70d/MyApp_31122019.dmg) file: (MyApp_31122019.dmg)
 [2019-12-31 19:46:49 AEDT] <pool-8-thread-1>  INFO: All reservation commit(s) finished.
 [2019-12-31 19:46:49 AEDT] <main>  INFO: 456.36 KB/s in 3 seconds

Сбои в процессе нотариального заверения

Если при проверке вы обнаружите, что процесс нотариального заверения не удался. Например:

Date                      RequestUUID                          Status  Status Code Status Message   
------------------------- ------------------------------------ ------- ----------- ---------------- 
2020-02-29 13:54:08 +0000 fa2e5d79-cba0-469d-bb27-859a8f081821 invalid 2           Package Invalid  

Вы можете получить URL-адрес файла журнала нотариального заверения с помощью команды:

xcrun altool --notarization-info <RequestUUID> -u "<your email>" -p "<app-specific pwd>"

который должен дать информацию, подобную следующей:

No errors getting notarization info.

          Date: 2020-02-29 13:54:08 +0000
          Hash: 1b08ea5cdf97eb6fed9b959a549d4b325eb5e90f16538139a29a83f75609d87b
    LogFileURL: https://osxapps-ssl.itunes.apple.com/itunes-assets/[...]
   RequestUUID: fa2e5d79-cba0-469d-bb27-859a8f081821
        Status: invalid
   Status Code: 2
Status Message: Package Invalid

Затем вы можете вырезать и вставить LogFileURL в свой веб-браузер и получить файл журнала процесса нотариального заверения, который будет выглядеть примерно так:

{
  "logFormatVersion": 1,
  "jobId": "fa2e5d79-cba0-469d-bb27-859a8f081821",
  "status": "Invalid",
  "statusSummary": "Archive contains critical validation errors",
  "statusCode": 4000,
  "archiveFilename": "test.dmg",
  "uploadDate": "2020-02-29T13:54:08Z",
  "sha256": "1b08ea5cdf97eb6fed9b959a549d4b325eb5e90f16538139a29a83f75609d87b",
  "ticketContents": null,
  "issues": [
    {
      "severity": "error",
      "code": null,
      "path": "test.dmg/MyApp.app/Contents/MacOS/MyApp",
      "message": "The executable does not have the hardened runtime enabled.",
      "docUrl": null,
      "architecture": "x86_64"
    }
  ]
}

В приведенном выше случае сбоя это произошло из-за того, что исполняемый файл не был с подписанной защитой.

Также стоит упомянуть, что всегда стоит извлекать файл журнала нотариального заверения для проверки предупреждений, которые еще не являются ошибками, чтобы вы могли исправить их до того, как они станут ошибками, препятствующими успешному нотариальному заверению.

Вот пример протокола процесса нотариального заверения после успешного нотариального заверения:

{
  "logFormatVersion": 1,
  "jobId": "fa2e5d79-cba0-469d-bb27-859a8f081822",
  "status": "Accepted",
  "statusSummary": "Ready for distribution",
  "statusCode": 0,
  "archiveFilename": "test.dmg",
  "uploadDate": "2020-03-01T01:50:55Z",
  "sha256": "1945554c24da3bb1d587b7c9f968dcbb925b726f2f663b816301928c06593dd9",
  "ticketContents": [
    {
      "path": "test.dmg",
      "digestAlgorithm": "SHA-256",
      "cdhash": "1d4d033edbecc2baf7ff8ce0fa16691be990595f"
    },
    {
      "path": "test.dmg/MyApp.app",
      "digestAlgorithm": "SHA-256",
      "cdhash": "7f9d54e76f25807e2b425a09684aa8cb54dcd17f",
      "arch": "x86_64"
    },
    {
      "path": "test.dmg/MyApp.app/Contents/MacOS/MyApp",
      "digestAlgorithm": "SHA-256",
      "cdhash": "7f9d54e762c7907e2b425a09684aa8cb54dcd17f",
      "arch": "x86_64"
    },
    {
      "path": "test.dmg/MyApp.app/Contents/Resources/MyApp.help",
      "digestAlgorithm": "SHA-256",
      "cdhash": "b544a32a216578e7805ca93b968377cdd92f7ec6",
      "arch": "i386"
    },
    {
      "path": "test.dmg/MyApp.app/Contents/Resources/MyApp.help",
      "digestAlgorithm": "SHA-256",
      "cdhash": "b544a32a216578e7805ca93b968377cdd92f7ec6",
      "arch": "x86_64"
    },
    {
      "path": "test.dmg/MyApp.app/Contents/Resources/MyApp.help",
      "digestAlgorithm": "SHA-256",
      "cdhash": "b544a32a216578e7805ca93b968377cdd92f7ec6",
      "arch": "x86_64h"
    }
  ],
  "issues": null
}

Сбои при проверке нотариального заверения

Если процесс нотариального заверения прошел успешно, но вы получили сбой при проверке успешности нотариального заверения, вы можете использовать Console.app для проверки файлов журнала на предмет информации об отклонении (после попытки запустить заблокированное приложение). Имейте в виду, что вы должны открыть Console.app перед попыткой открыть ваше Console.app, иначе не все сообщения могут быть зарегистрированы. Вы должны выбрать свое устройство на левой боковой панели Console.app и проверить в журналах процесс XprotectService.

См.также

Внешние ссылки