The upcoming macOS 10.15 Catalina will require more apps and tools to be notarized. Apple has some loosened the requirements at last minute, but these changed limitations are only temporary, to give developers more time to adapt.
Notarizing Mac Application bundles has its pitfalls, but is overall fairly well documented. However, I have been working on some command line tools written in Swift 5 and figured out how to get those properly signed and notarized.
UML Tool, ERD editor, Org. Chart editor, Floor Plan tool, ITIL, Business Concept Diagram; Can be upgraded to paid editions for more diagram types and features; Cross-platform: Windows, Mac, Linux. Compatible with all web browsers; Easy to use: Create and connect shapes with drag and drop. Connectors are sticked to shapes and never separate apart. UML Lab comes in multiple editions, and some of them can also integrate with version control systems. Make sure to navigate to the UML Lab website to see the complete list of features available for each edition. Efficiently manage object-based software projects by using UML tools and reverse engineering.
Howard Oakley has written up his experiences and that post was extremely helpful. But there were a few omissions and some steps that aren't really necessary, so I decided to make my own write-up.
And yes, there is a script at the end…
Note: these instructions are for macOS 10.14.6 Mojave, Xcode 10.3 and Swift 5.0. It is very likely that the details will change over time.
Update 2019-09-24: Tested with Xcode 11 and it still works (the screen layout has changed for some of the options)
What do you need?
- Apple Developer Account (Personal or Enterprise, the free account does not provide the right certificates)
- Xcode 10.3 or 11
- Developer ID Certificates (Application and Install)
- Application Specific Password for your Developer account
- a Command Line Tool Project that you want to sign and notarize
That's a longish list. If you are already building command line tools in Xcode, you should have most of these covered already. We will walk through the list step-by-step:
Apple Developer Program Account
You need either the paid membership in the Apple Developer Program or be invited to an Apple Developer Enterprise Program team with access to the proper certificates.
You cannot get the required certificates with a free Apple Developer account, unless you are member of a team that provides access.
Xcode
You can download Xcode from the Mac App Store or the developer download page. When you launch Xcode for the first time, it will prompt for some extra installations. Those are necessary for everything to in the article to work.
Developer ID Certificates
There are multiple certificates you can get from the Developer Program. By default you get a ‘Mac Developer' certificate, which you can use for building and testing your own app locally.
To distribute binaries (apps and command line tools) outside of the App Store, you need a ‘Developer ID Application' certificate. To sign installer packages for distribution outside of the Mac App Store, you need a ‘Developer ID Installer' certificate.
We will need both types of Developer ID certificates, the first to sign the command line tool and the second to sign and notarize the installer package.
If you have not created these yet, you can do so in Xcode or in the Developer Portal. If you already have the certificates but on a different Mac, you need to export them and re-import them on the new Mac. Creating new certificates might invalidate the existing certificates! So beware.
Once you have created or imported the certificates on your work machine, you can verify their presence in the Terminal with:
This command will list all available certificates on this Mac. Check that you can see the ‘Developer ID Application' and ‘Developer ID Installer' certificates. If you are a member of multiple teams, you may see multiple certificates for each team.
You can later identify the certificates (or ‘identities') by the long hex number or by the descriptive name, e.g. 'Developer ID Installer: Armin Briegel (ABCD123456)'
The ten character code at the end of the name is your Developer Team ID. Make a note of it. If you are a member of multiple developer teams, you can have multiple Developer ID certificates and the team ID will help you distinguish them.
Application Specific Password for your Developer Account
Apple requires Developer Accounts to be protected with two-factor authentication. To allow automated workflows which require authentication, you can create application specific passwords.
Create a new application specific password in Apple ID portal for your developer account.
- Apple Support: Using app-specific passwords
You will only be shown the password when you create it. Immediately create a ‘New Password Item' in your Keychain with the following fields:
- Keychain Item Name:
Developer-altool
- Account Name: your developer account email
- Password: the application-specific password you just created
This will create a developer specific password item that we can access safely from the tools.
If you want, you can also store the app specific password in a different password manager, but the Xcode tools have a special option to use Keychain.
A Command Line Tool Project
You may already have a project to create a command line in Xcode. If you don't have one, or just want a new one to experiment, you can just create a new project in Xcode and choose the ‘Command Line Tool' template from ‘macOS' section in the picker. The template creates a simple 'Hello, world' tool, which you can use to test the notarization process.
My sample project for this article will be named 'hello.'
Preparing the Xcode Project
The default settings in the ‘Command Line Tool' project are suitable for building and testing the tool on your Mac, but need some changes to create a distributable tool.
Choosing the proper signing certificates
Before you can notarize the command line tool, it needs to be signed with the correct certificates.
- in Xcode, select the blue project icon in the left sidebar
- select the black 'terminal' icon with your project's name under the 'Targets' list entry
- make sure the ‘General' tab is selected
- under ‘Signing' disable ‘Automatically manage signing'
- under ‘Signing (Debug)' choose your Team and choose ‘Developer ID Application' as the certificate
- under ‘Signing (Release)' choose your Team and choose ‘Developer ID Application' as the certificate
Enable Hardened Runtime
Enabling the ‘Hardened Runtime' will compile the binary in a way that makes it harder for external process to inject code. This will be requirement for successful notarization starting January 2020.
- from the view where you changed the signing options, click on ‘Build Settings' in the upper tab row
- click on ‘All' to show all available settings
- enter ‘enable hardened' in the search field, this will show the ‘Enable Hardened Runtime' setting
- set the value in the project column (blue icon) to
YES
Change the Install Build Location
If we want to automate the packaging and notarization, we need to know where Xcode builds the binary. The default location is in some /tmp
subdirectory and not very convenient. We will change the location for the final binary (the ‘product') to the build
subdirectory in the project folder:
- in the same view as above, enter ‘Installation Build' in the search field, this will show the ‘Installation Build Products Location' setting
- double click on the value in the Project column (blue icon), this will open a popup window
- change the value to
$SRCROOT/build/pkgroot
If you manage your code in git or another VCS, you want to add the build
subdirectory to the ignored locations (.gitignore
)
Build the Binary
You can use Xcode to write, test, and command line tool debug your. When you are ready to build and notarize a pkg installer, do the following:
- open Terminal and change directory to the project folder
% xcodebuild clean install
This will spew a lot of information out to the command line. You will see a build
subdirectory appear in the project folder, which will be filled with some directories with intermediate data.
After a successful build you should see a pkgroot
directory in the build folder, which contains your binary in the usr/local/bin
sub-path.
/usr/local/bin
is the default location for command line tools in the Command Line Tool project template. It suits me fine most of the time, but you can change it by modifying the ‘Installation Directory' build setting in Xcode and re-building from the command line.
Build the pkg
Command Line Tools can be signed, but not directly notarized. You can however notarize a zip, dmg, or pkg file containing a Command Line Tool. Also, it is much easier for users and administrators to install your tool when it comes in a proper installation package.
We can use the pkgroot
directory as our payload to build the installer package:
I have broken the command into multiple lines for clarity, you can enter the command in one line without the end-of-line backslashes . You want to replace the values for the identifier, version and signing certificate with your data.
This will build an installer package which would install your binary on the target system. You should inspect the pkg file with Pacifist or Suspicious Package and do a test install on a test system to verify everything works.
If you want to learn more about installer packages and pkgbuild
read my book 'Packaging for Apple Administrators.'
Notarizing the Installer Package
Xcode has a command line tool altool
which you can use to upload your tool for notarization:
The username
is your developer account email.
The asc-provider
is your ten digit Team ID. If you are only a member in a single team you do not need to provide this.
The password uses a special @keychain:
keyword that tells altool
to get the app-specific password out of a keychain item named Developer-altool
. (Remember we created that earlier?)
This will take a while. When the command has successfully uploaded the pkg to Apple's Notarization Servers, it will return a RequestUUID
. Your notarization request will be queued and eventually processed. You can check the status of your request with:
Apple will also send an email to your developer account when the process is complete. I my experience this rarely takes more than a minute or two. (Being in Central EU time zone might be an advantage there). When the process is complete, you can run the above notarization-info
command to get some details. The info will include a link that contains even more information, which can be useful when your request is rejected.
Note that the info links expire after 24 hours or so. You should copy down any information you want to keep longer.
Completing the Process
You will not receive anything back from Apple other than the confirmation or rejection of your request. When a Mac downloads your installer package and verifies its notarization status it will reach out to Apple's Notarization servers and they will confirm or reject the status.
If the Mac is offline at this time, or behind a proxy or firewall that blocks access to the Apple Servers, then it cannot verify whether your pkg file is notarized.
You can, however, ‘staple' the notarization ticket to the pkg file, so the clients do not need to connect to the servers:
You can also use stapler
to verify the process went well:
But since stapler
depends on the developer tools to be installed, you should generally prefer spctl
to check notarization:
Automating the Process
Obviously, I built a script to automate all this. Put the following script in the root of the project folder, modify the variables at the start of the script (lines 20–38) with your information, and run it.
Xcode For Mac
The script will build the tool, create a signed pkg, upload it for notarization, wait for the result, and then staple the pkg.
Dragon ball fighterz climax download. You can use this script as an external build tool target in Xcode. There are other ways to integrate scripts for automation in Xcode, but all of this is a new area for me and I am unsure which option is the best, and which I should recommend.
Links and Videos
These links and videos, especially Howard Oakley's post and Tom Bridge's PSU Presentation have been hugely helpful. Also thanks to co-worker Arnold for showing me this was even possible.
- Howard Oakley: Building and delivering command tools for Catalina
- Tom Bridge: PSU Conference Talk and Followup
- Apple Support: Notarizing Your Mac Software for macOS Catalina
- Apple Support: Using app-specific passwords
- Apple Developer: Notarizing Your App Before Distribution
- WWDC 2019: All About Notarization
- WWDC 2019: Advances in macOS Security
- Apple Developer: Resolving Common Notarization Issues
Going forward
Notarization is a key part of Apple's security strategy going in macOS.
How to jailbreak ios 9.3 5. As MacAdmins we will usually deploy software through management systems, where the Gatekeeper mechanisms which evaluate notarization are bypassed. There are, however, already special cases (Kernel Extensions) where notarization is mandatory. It is likely that Apple will continue to tighten these requirements in the future. The macOS Mojave 10.14.5 update has shown that Apple may not even wait for major releases to increase the requirements.
If you are building your own tools and software for macOS and plan to distribute the software to other computers, you should start signing and notarizing.
On the other hand, I find the introduction of Notarization to macOS encouraging. If Apple wanted to turn macOS into a 'App Store only system' like iOS, they would not have needed to build the notarization process and infrastructure. Instead, Apple seems to have embraced third-party-software from outside the App Store.
Notarization allows Apple to provide a security mechanism for software distributed through other means. It cannot be 100% effective, but when used correctly by Apple and the software developers it will provide a level of validation and trust for software downloaded from the internet.
Open source UML tools for MAC OS X
BOUML
BOUML is a free UML 2 tool box allowing you to specify and generate code in C++, Java, Idl, Php and Python. (GPL)
Uml Tool For Mac Xcode Download
Linux - FreeBSD - Windows - MAC OS X
Modelio
Modelio is an open source modeling environment. Modelio delivers a broad-focused range of standards-based functionalities for software developers, analysts, designers, business architects and system architects. (GPL)
Cross-platform
Papyrus
Papyrus is aiming at providing an integrated and user-consumable environment for editing any kind of EMF model and particularly supporting UML and related modeling languages such as SysML and MARTE. (EPL)
Cross-platform
UML Designer
UML Designer provides a set of common diagrams to work with UML 2.5 models. The intent is to provide an easy way to make the transition from UML to domain specific modeling. (EPL)
Cross-platform
Umple
Xcode For Mac Air
Umple is technology for Model-Oriented Programming. It adds abstractions such as UML associations, attributes, and state machines to object-oriented programming languages such as Java, PHP and Ruby. (MIT)
Xcode For Mac Download
Cross-platform
Uml Tool For Mac Xcode Editor
5 applications