Sign in Join
Wiki copytemporary

Notarization for macOS 10.14.5+: what changed

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

OldNewLine
11## Overview
22
33Beginning with macOS 10.14.5 (Mojave), software signed with a new Apple developer certificate and all new or updated kernel extensions must be notarized to run. Beginning in macOS 10.15 (Catalina), all software built after June 1, 2019, and code signed with an Apple developer certificate must be notarized. *Notarization is not required for software distributed through the Apple App Store* because the App Store submission process already includes equivalent security checks.
44
55In November 2023, Apple amended the Notarizing process and rules, and changed the utility program to notarytool. These changes are now shown below.
66
77Notarization is designed by Apple to give users more confidence that Apple developer-signed software has been checked by Apple for malicious components. Notarization is not an App Review. The Apple notary service is an automated system that scans software for malicious content, checks for code-signing issues, and returns the results. If there are no issues, the notary service generates a ticket to staple to the software; the notary service also publishes that ticket online where Gatekeeper can find it.
88
99When the user first installs or runs software, the presence of a ticket (either online or attached to the executable) tells Gatekeeper that Apple notarized the software. Gatekeeper then places descriptive information in the initial launch dialog to help the user make an informed choice about whether to launch the app.
1010
1111> **Note:** **Even if an application has not been notarized, it can still be run by control-clicking on the app, or right clicking for the context menu, and choosing *Open* - see the Gatekeeper "bypass" dialog in the gallery [[Notarization for macOS 10.14.5+|below]].**
1212
1313Code signing an application without also notarizing it is now a totally pointless exercise *unless* you are only distributing your application via the App Store.
1414
1515## Gatekeeper dialogs
1616
17-<File:macos-mojave-app-downloaded-from-internet-alert-dark.jpg%7CGatekeeper> Dialog before Catalina where an app that is not notarized is first opened (Mojave macOS 10.14 dialog) <File:Screenshot_2020-01-02_at_22.42.01.png%7CGatekeeper> dialog where an app which is signed and notarized is first opened (Catalina macOS 10.15.1 dialog) <File:gatekeep_no.png%7CGatekeeper> dialog where an app is not signed nor notarized is first opened (Catalina macOS 10.15.1 dialog) <File:macos-catalina-alert-unsigned-override.jpg%7CThe> Gatekeeper "bypass" dialog, accessed by control-clicking on the app (Catalina macOS 10.15.3 dialog)
17+![](/wiki-images/2/29/Macos-mojave-app-downloaded-from-internet-alert-dark.jpg)
18+
19+Gatekeeper Dialog before Catalina where an app that is not notarized is first opened (Mojave macOS 10.14 dialog)
20+
21+![](/wiki-images/c/c6/Screenshot_2020-01-02_at_22.42.01.png)
22+
23+Gatekeeper dialog where an app which is signed and notarized is first opened (Catalina macOS 10.15.1 dialog)
24+
25+![](/wiki-images/4/4a/Gatekeep_no.png)
26+
27+Gatekeeper dialog where an app is not signed nor notarized is first opened (Catalina macOS 10.15.1 dialog)
28+
29+![](/wiki-images/2/21/Macos-catalina-alert-unsigned-override.jpg)
30+
31+The Gatekeeper "bypass" dialog, accessed by control-clicking on the app (Catalina macOS 10.15.3 dialog)
1832
1933## Notarization requirements
2034
2135Notarization 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.
2236
2337Apple's notary service requires you to:
2438
2539- Enable code-signing for all of the executables you distribute.
2640- Enable the [[Hardened runtime for macOS|Hardened Runtime]] capability for your application and command line targets.
2741- Use a “Developer ID” application, kernel extension, or installer certificate for your code-signing signature.
2842- Include a secure timestamp with your code-signing signature (include the --timestamp option when running the codesign tool).
2943- 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 [Avoid the Get-Task-Allow Entitlement](https://developer.apple.com/documentation/xcode/notarizing_macos_software_before_distribution/resolving_common_notarization_issues#3087731).
3044- Link against the macOS 10.9 or later SDK.
3145
3246On 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.**
3347
3448### Apple Statement 23 December 2019
3549
3650In 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 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.
3751
3852If 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.
3953
4054As 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.
4155
4256## Notarizing an application
4357
4458These 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.
4559
4660You 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.
4761
4862### Step 1 - Create disk image
4963
5064Create a disk image by opening a Terminal and running the following command:
5165
5266``` bash
5367hdiutil create -volname MyApp -srcfolder /path/to/MyApp.app -ov -format UDBZ MyApp.dmg
5468```
5569
5670### Step 2 - Code sign the disk image
5771
5872Disk images must be signed with your Developer ID Application Certificate and include a secure timestamp.
5973
6074Code sign the disk image by opening a Terminal and running the following command:
6175
6276``` bash
6377codesign -s "Developer ID Application: Your Name (Team ID)" --timestamp MyApp.dmg
6478```
6579
6680Note: See [[Code Signing for macOS]] for more details relevant to code signing especially if doing this on aarch64 for an x86_64 binary.
6781
6882### Step 3 - Generate an app-specific password
6983
7084To generate an app-specific password, refer to this [Apple Support article](https://support.apple.com/en-us/HT204397). *Note:* this is a password that will be specific to the notarization application (xcrun notarytool) 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.
7185
7286> **Tip:** Save the password to your keychain with:\
7387> \
7488> `xcrun notarytool store-credentials "notarytool-password" --apple-id "<AppleID>" --team-id <DeveloperTeamID> --password <secret_2FA_password>`\
7589> \
7690> and then you can use `"@keychain:<name for pwd>"` in the following commands.
7791
7892### Step 4 - Upload the disk image to the notary service
7993
8094> **Note:** When you notarize the container disk image, notarytool also notarizes the application inside, so you can skip the step of notarizing the application itself.
8195
8296Upload the disk image file to the Apple notary service by opening a Terminal and running the following command:
8397
8498``` bash
8599xcrun notarytool submit --apple-id "me@mysoftware.com" --password <app-specifc-password> --team-id <your 10 character team ID> /Path/to/MyApp.dmg
86100```
87101
88102The response includes an *id* (session-ID) that we use later to keep track of this submission with the notarization service. It will be used again to check on the status.
89103
90104If the upload is successful you should receive output similar to the following:
91105
92106 Conducting pre-submission checks for MyApp.dmg and initiating connection to the Apple notary service...
93107 Submission ID received
94108 id: 43e04940-1601-4959-a40c-79b83172d22b
95109 Upload progress: 100,00% (3,97 MB of 3,97 MB)
96110 Successfully uploaded file
97111 id: 43e04940-1601-4959-a40c-79b83172d22b
98112 path: /Path/to/MyApp.dmg
99113
100114### Step 5 - Check the notarization process
101115
102116The notarization process generally takes less than an hour, and usually just few minutes. They no longer issue emails, so you will need to check its progress from time to time by opening a Terminal and running the following command:
103117
104118``` bash
105119xcrun notarytool info --apple-id "me@mysoftware.com" --password <app-specifc-password> --team-id <your 10 character team ID> session-ID
106120```
107121
108122When the notarization process completes successfully the above command will return information similar to the following:
109123
110124 Looking up : 43e04940-1601-4959-a40c-79b83172d22b
111125 Successfully received submission info
112126 createdDate: 2024-05-06T10:16:46.448Z
113127 id: 43e04940-1601-4959-a40c-79b83172d22b
114128 name: MyApp.dmg
115129 status: Accepted
116130
117131The possible status results are: In process, Accepted or Failure.
118132
119133Accepted means success in this context. If the status is failure, then further details can be obtained with the "log" command:
120134
121135``` bash
122136xcrun notarytool log --apple-id "me@mysoftware.com" --password <app-specifc-password> --team-id <your 10 character team ID> session-ID
123137```
124138
125139### Step 6 - Staple the ticket to the disk image
126140
127141The 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.
128142
129143After 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.
130144
131145To staple the ticket to the disk image file, open a Terminal and run the following command:
132146
133147``` bash
134148xcrun stapler staple /path/to/MyApp.dmg
135149```
136150
137151If the command completes successfully, the output should be similar to:
138152
139153 Processing: /Path/to/MyApp.dmg
140154 Processing: /Path/to/MyApp.dmg
141155 The staple and validate action worked!
142156
143157Note: While you can staple an installer package and disk image directly, if notarization used a zip file, the application bundle needs to be unzipped and then it can be stapled and rezipped.
144158
145159### Step 7 - Verify notarization of the disk image
146160
147161To verify the notarization of the disk image, open a Terminal and run the following command:
148162
149163``` bash
150164spctl -a -vv -t install MyApp.dmg
151165```
152166
153167A successful verification of the notarization process should produce output similar to the following:
154168
155169 MyApp.dmg: accepted
156170 source=Notarized Developer ID
157171 origin=Developer ID Application: <Developer Name> (<TEAM_ID>)
158172
159173### Step 8 - Verify notarization of the application
160174
161175To verify the notarization of the application, install the application, open a Terminal and run the following command:
162176
163177``` bash
164178spctl -a -vv /Applications/MyApp.app
165179```
166180
167181A successful verification of the notarization process should produce output similar to the following:
168182
169183 /Applications/MyApp.app: accepted
170184 source=Notarized Developer ID
171185 origin=Developer ID Application: <Developer Name> (<TEAM_ID>)
172186
173187**Important:** test the application by putting it in the Applications directory. It's treated differently by the Gatekeeper when in the "installed" location.
174188
175189Alternatively, the Apple-recommended way to verify the notarization of an application is to open a Terminal and run the following command:
176190
177191 xcrun stapler validate MyApp.app
178192
179193A successful verification of the notarization process should produce output similar to the following:
180194
181195 Processing: MyApp.app
182196 The validate action worked!
183197
184198## Notarizing a command line tool
185199
186200Command line tools can be code signed, but they cannot be easily notarized because they do not have an [[Application Bundle]] and a standalone `Info.plist` [[macOS property list files|property list file]]. You can relatively easily insert an `Info.plist` file in your command line tool executable.
187201
188202### Inserting an Info.plist in a command line executable
189203
190204Here 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).
191205
192206``` xml
193207<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
194208<plist version="1.0">
195209<dict>
196210 <key>BuildMachineOSBuild</key>
197211 <string>18G8022</string>
198212 <key>CFBundleDevelopmentRegion</key>
199213 <string>English</string>
200214 <key>CFBundleDocumentTypes</key>
201215 <array>
202216 <dict>
203217 <key>CFBundleTypeOSTypes</key>
204218 <array>
205219 <string>fold</string>
206220 <string>disk</string>
207221 <string>****</string>
208222 </array>
209223 </dict>
210224 </array>
211225 <key>CFBundleExecutable</key>
212226 <string>simplereach</string>
213227 <key>CFBundleIdentifier</key>
214228 <string>com.mycompany.simplereach</string>
215229 <key>CFBundleInfoDictionaryVersion</key>
216230 <string>6.0</string>
217231 <key>CFBundleName</key>
218232 <string>simplereach</string>
219233 <key>CFBundlePackageType</key>
220234 <string>APPL</string>
221235 <key>CFBundleShortVersionString</key>
222236 <string>1.0</string>
223237 <key>CFBundleSupportedPlatforms</key>
224238 <array>
225239 <string>MacOSX</string>
226240 </array>
227241 <key>CFBundleVersion</key>
228242 <string>1</string>
229243 <key>LSMinimumSystemVersion</key>
230244 <string>10.14</string>
231245</dict>
232246</plist>
233247```
234248
235249You will need to modify a few key strings in the above file. Substitute your own:
236250
237251- **BuildMachineOSBuild** string can be obtained from a Terminal with the command `sw_vers`. The "18G8022" strong is for Mojave 10.14.6.
238252- **CFBundleDevelopmentRegion** string if it is not "English".
239253- **CFBundleExecutable** string with your utility name.
240254- **CFBundleIdentifier** string (conventionally your domain name in reverse followed by utility name; feel free use anything unique).
241255- **CFBundleName** string (use the same value as for CFBundleExecutable).
242256- **CFBundleShortVersionString** string with your version number.
243257- **LSMinimumSystemVersion** string with the minimum macOS version on which your utility will run.
244258
245259You can then insert the `Info.plist` file into your application by telling the linker to add it as a __TEXT section named __info_plist:
246260
247261`fpc -k"-sectcreate __TEXT __info_plist Info.plist" my_utility.pas`
248262
249263To check whether it has been successfully inserted you can run the following command in a Terminal:
250264
251265`otool -X -v -s __TEXT __info_plist my_utility`
252266
253267### Signing a command line executable
254268
255269Now that the `Info.plist` file has been inserted in the executable, you are ready to code sign it by executing the following commands in a Terminal:
256270
257271`cd /path/to/my_utility`\
258272`mkdir bin`\
259273`mv my_utility bin/`\
260274`codesign -f --strict --timestamp --options=runtime -s "Developer ID Application: YOUR NAME (TEAM_ID)" bin/my_utility`
261275
262276It is *critical* that you create the `bin` directory and move your utility to it before signing. Failure to do so will result in a `_CodeSignature directory` being created which is not appropriate for a command line utility and the notarisation process will fail.
263277
264278To verify this was successful you can run the following command in a Terminal:
265279
266280`codesign -vv bin/my_utility`
267281
268282If code signing was successful, the output should be something similar to:
269283
270284`my_utility: valid on disk`\
271285`my_utility: satisfies its Designated Requirement `
272286
273287### Submitting a command line executable for notarization
274288
275289As 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:
276290
277291`zip my_utility.zip bin/my_utility`
278292
279293You are now ready to upload your command line utility to Apple's servers for notarization. In a terminal execute the following command:
280294
281295`xcrun notarytool submit --apple-id "me@mysoftware.com" --password <app-specifc-password>  --team-id <your 10 character team ID> my_utility.zip`
282296
283297If you do not already have an app specific password, see above for how to generate one.
284298
285299The response includes an *id* (session-ID) that we use later to keep track of this submission with the notarization service. It will be used again to check on the status.
286300
287301If the upload is successful you should receive output similar to the following:
288302
289303 Conducting pre-submission checks for my_utility.zip and initiating connection to the Apple notary service...
290304 Submission ID received
291305 id: 43e04940-1601-4959-a40c-79b83172d22b
292306 Upload progress: 100,00% (3,97 MB of 3,97 MB)
293307 Successfully uploaded file
294308 id: 43e04940-1601-4959-a40c-79b83172d22b
295309 path: /Path/to/my_utility.zip
296310
297311### Checking the notarization progress
298312
299313The notarization process generally takes less than an hour, and usually just few minutes. They no longer issue emails, so you will need to check its progress from time to time by opening a Terminal and running the following command:
300314
301315``` bash
302316xcrun notarytool info --apple-id "me@mysoftware.com" --password <app-specifc-password> --team-id <your 10 character team ID> session-ID
303317```
304318
305319When the notarization process completes successfully the above command will return information similar to the following:
306320
307321 Looking up : 43e04940-1601-4959-a40c-79b83172d22b
308322 Successfully received submission info
309323 createdDate: 2024-05-06T10:16:46.448Z
310324 id: 43e04940-1601-4959-a40c-79b83172d22b
311325 name: MyApp.dmg
312326 status: Accepted
313327
314328The possible status results are: In process, Accepted or Failure. Accepted means success in this context. If the status is failure, then further details can be obtained with the "log" command:
315329
316330``` bash
317331xcrun notarytool log --apple-id "me@mysoftware.com" --password <app-specifc-password> --team-id <your 10 character team ID> session-ID
318332```
319333
320334In case of a notarization failure, consult Troubleshooting below for help.
321335
322336### Verifying notarization of a command line executable
323337
324338To verify the notarization of a command line tool, open a Terminal and run the following command:
325339
326340`spctl -a -t open --context context:primary-signature -vv my_utility `
327341
328342A successful verification of a properly notarized command line executable should produce output similar to the following:
329343
330344`my_utility: accepted`\
331345`source=Notarized Developer ID`\
332346`origin=Developer ID Application: Your Name (Z9HBGNDZZ9)`
333347
334348## Troubleshooting
335349
336350### Notarization upload process
337351
338352If 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):
339353
340354``` bash
341355 cd ${TMPDIR}
342356 gzcat c51ca05f-cf49-405f-be57-26873faab5f6_3073718126753816760org.sentry.myapp-20191231004646-273.itmsp6022059143057318377.log
343357```
344358
345359which, for a successful notarization upload, should look similar to:
346360
347361` [2019-12-31 19:46:46 AEDT] <main>  INFO: Starting upload for packageName: org.sentry.myapp-20191231004646-273.itmsp`\
348362` [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}`\
349363` [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)`\
350364` [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)`\
351365` [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`\
352366` [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`\
353367` [2019-12-31 19:46:47 AEDT] <RLT-002>  INFO: Finished part upload for: (metadata.xml/1) 2.91 KB/s in 0 seconds`\
354368` [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)`\
355369` [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)`\
356370` [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`\
357371` [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)`\
358372` [2019-12-31 19:46:49 AEDT] <main>  INFO: Waiting on reservation commit(s) to finish.`\
359373` [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)`\
360374` [2019-12-31 19:46:49 AEDT] <pool-8-thread-1>  INFO: All reservation commit(s) finished.`\
361375` [2019-12-31 19:46:49 AEDT] <main>  INFO: 456.36 KB/s in 3 seconds`
362376
363377### Notarization process failures
364378
365379If the when you check you find that the notarization process has failed. For example:
366380
367381 Date RequestUUID Status Status Code Status Message
368382 ------------------------- ------------------------------------ ------- ----------- ----------------
369383 2020-02-29 13:54:08 +0000 fa2e5d79-cba0-469d-bb27-859a8f081821 invalid 2 Package Invalid
370384
371385You can retrieve the URL for the notarization log file with the command:
372386
373387``` bash
374388xcrun notarytool log --apple-id "me@mysoftware.com" --password <app-specifc-password> --team-id <your 10 character team ID> session-ID
375389```
376390
377391which should yield information similar to the following:
378392
379393 No errors getting notarization info.
380394
381395 Date: 2020-02-29 13:54:08 +0000
382396 Hash: 1b08ea5cdf97eb6fed9b959a549d4b325eb5e90f16538139a29a83f75609d87b
383397 LogFileURL: https://osxapps-ssl.itunes.apple.com/itunes-assets/[...]
384398 RequestUUID: fa2e5d79-cba0-469d-bb27-859a8f081821
385399 Status: invalid
386400 Status Code: 2
387401 Status Message: Package Invalid
388402
389403You can then cut and paste the LogFileURL into your web browser and retrieve the notarization process log file which will look something like this:
390404
391405 {
392406 "logFormatVersion": 1,
393407 "jobId": "fa2e5d79-cba0-469d-bb27-859a8f081821",
394408 "status": "Invalid",
395409 "statusSummary": "Archive contains critical validation errors",
396410 "statusCode": 4000,
397411 "archiveFilename": "test.dmg",
398412 "uploadDate": "2020-02-29T13:54:08Z",
399413 "sha256": "1b08ea5cdf97eb6fed9b959a549d4b325eb5e90f16538139a29a83f75609d87b",
400414 "ticketContents": null,
401415 "issues": [
402416 {
403417 "severity": "error",
404418 "code": null,
405419 "path": "test.dmg/MyApp.app/Contents/MacOS/MyApp",
406420 "message": "The executable does not have the hardened runtime enabled.",
407421 "docUrl": null,
408422 "architecture": "x86_64"
409423 }
410424 ]
411425 }
412426
413427In the above failure case, it was because the executable had not been [[Hardened runtime for macOS|hardened]].
414428
415429It 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.
416430
417431Here is an example of a notarization process log from a successful notarization:
418432
419433 {
420434 "logFormatVersion": 1,
421435 "jobId": "fa2e5d79-cba0-469d-bb27-859a8f081822",
422436 "status": "Accepted",
423437 "statusSummary": "Ready for distribution",
424438 "statusCode": 0,
425439 "archiveFilename": "test.dmg",
426440 "uploadDate": "2020-03-01T01:50:55Z",
427441 "sha256": "1945554c24da3bb1d587b7c9f968dcbb925b726f2f663b816301928c06593dd9",
428442 "ticketContents": [
429443 {
430444 "path": "test.dmg",
431445 "digestAlgorithm": "SHA-256",
432446 "cdhash": "1d4d033edbecc2baf7ff8ce0fa16691be990595f"
433447 },
434448 {
435449 "path": "test.dmg/MyApp.app",
436450 "digestAlgorithm": "SHA-256",
437451 "cdhash": "7f9d54e76f25807e2b425a09684aa8cb54dcd17f",
438452 "arch": "x86_64"
439453 },
440454 {
441455 "path": "test.dmg/MyApp.app/Contents/MacOS/MyApp",
442456 "digestAlgorithm": "SHA-256",
443457 "cdhash": "7f9d54e762c7907e2b425a09684aa8cb54dcd17f",
444458 "arch": "x86_64"
445459 },
446460 {
447461 "path": "test.dmg/MyApp.app/Contents/Resources/MyApp.help",
448462 "digestAlgorithm": "SHA-256",
449463 "cdhash": "b544a32a216578e7805ca93b968377cdd92f7ec6",
450464 "arch": "i386"
451465 },
452466 {
453467 "path": "test.dmg/MyApp.app/Contents/Resources/MyApp.help",
454468 "digestAlgorithm": "SHA-256",
455469 "cdhash": "b544a32a216578e7805ca93b968377cdd92f7ec6",
456470 "arch": "x86_64"
457471 },
458472 {
459473 "path": "test.dmg/MyApp.app/Contents/Resources/MyApp.help",
460474 "digestAlgorithm": "SHA-256",
461475 "cdhash": "b544a32a216578e7805ca93b968377cdd92f7ec6",
462476 "arch": "x86_64h"
463477 }
464478 ],
465479 "issues": null
466480 }
467481
468482### Notarization check failures
469483
470484If 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 `Console.app` to inspect the log files for information about the rejection (after trying to launch the blocked application). Be aware you should open the `Console.app` *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 `Console.app` and check for the process **XprotectService** in the logs.
471485
472486## See also
473487
474488- [[Apple Developer Certificates]]
475489- [[Code Signing for macOS]]
476490- [[Hardened runtime for macOS]]
477491- [[Signing and Notarization FAQ]]
478492
479493## External links
480494
481495- [Apple: Notarizing your app before distribution](https://developer.apple.com/documentation/security/notarizing_your_app_before_distribution)
482496- [Apple: Notarizing macOS Software Before Distribution](https://developer.apple.com/documentation/xcode/notarizing_macos_software_before_distribution)
483497- [Apple: Customizing the Notarization Workflow](https://developer.apple.com/documentation/xcode/notarizing_macos_software_before_distribution/customizing_the_notarization_workflow)
484498- [Apple: Common notarization issues](https://developer.apple.com/documentation/xcode/notarizing_macos_software_before_distribution/resolving_common_notarization_issues)
485499- [Apple: Using app-specific passwords](https://support.apple.com/en-us/HT204397)
486500- [Notarize FPC](https://github.com/neurolabusc/NotarizeFPC) A script to notarize a command line utility and package it in an installer .pkg file.
487501
488502---
489503*From the Free Pascal wiki, page "Notarization for macOS 10.14.5+", as it stood on 2024-05-06 after a change by Rossh lz, 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