4.4 KiB
MacOS packaging and distribution
We distribute the application as a zipped MacOS app bundle.
Notes on codesigning and notarization
Running a binary on a Mac that was not both codesigned and notarized by Apple is a pain. The user needs to run it. Get an error message. Go to System preferences > Security > authorize the app. Then try again, and finally be presented a button to open the app.
In order to avoid that, we've started distributing codesigned binaries starting from version 1.0. This is the notes i've taken describing the stepped involved in codesigning the produced macOS binary on a Linux machine, for posterity. This is not cleaned up.
Bulk notes from the codesigning experiment
Create an account at https://developer.apple.com.
Pay to get into the developer program. Going the organization way is cumbersome. Go the personal way. They'll ask for a KYC (gov ID). Wait to be accepted.
Go to "certificates, ids and profiles". Create a new certificate. Select a Developer ID application certificate to distribute apps outside of the store.
(We should look into the installer feature later on. Maybe we could bundle a bitcoind there.)
They ask for a "Certificate Signing Request (CSR)" that you need to generate on your Mac. I don't have a Mac. Generate it using OpenSSL:
openssl genrsa -out wizardsardine_liana.key 2048
openssl req -new -sha256 -key wizardsardine_liana.key -out wizardsardine_liana_codesigning.csr -subj "/emailAddress=antoine@wizardsardine.com, CN=Antoine Poinsot, C=FR"
(Note you have no choice in the size or type of the key here, they expect a RSA(2048) key.)
For the profile type select "G2 Sub-CA". We are using an Xcode newer than 11.4.1 and the codesigning tool we use supports the new CA.
Now you get to be able to download your certificate (I've stored it as
"antoine_devid_liana_codesigning.cer"). Thankfully rcodesign supports various certificate format,
so we don't even have to convert it to PEM.
Download rcodesign:
curl -OL https://github.com/indygreg/apple-platform-rs/releases/download/apple-codesign%2F0.22.0/apple-codesign-0.22.0-x86_64-unknown-linux-musl.tar.gz
tar -xzf apple-codesign-0.22.0-x86_64-unknown-linux-musl.tar.gz
./apple-codesign-0.22.0-x86_64-unknown-linux-musl/rcodesign --help
Sign the packaged application using the sign command (mind `--code-signature-flags for the
necessary hardened runtime):
./apple-codesign-0.22.0-x86_64-unknown-linux-musl/rcodesign sign --code-signature-flags runtime --pem-source wizardsardine_liana.key --der-source antoine_devid_liana_codesigning.cer Liana.app
You can see the chain of certificates was applied using the diff-signatures command against
another bundle. The best way to verify the signature is by using the codesign command on a Mac.
Finally, we need to notarize the app. Follow the instructions at https://gregoryszorc.com/docs/apple-codesign/main/apple_codesign_rcodesign.html#notarizing-and-stapling:
- Create an API key from https://appstoreconnect.apple.com/ (and not a key from https://developer.apple.com/account/resources/authkeys)
- Download it and encode it into a JSON file using the
encode-app-store-connect-api-keycommand - Use the
notary-submitcommand to request notarization
./apple-codesign-0.22.0-x86_64-unknown-linux-musl/rcodesign notary-submit --max-wait-seconds 600 --api-key-path ./encoded_appstore_api_key.json --staple Liana.app
According to
https://developer.apple.com/documentation/security/notarizing_macos_software_before_distribution/customizing_the_notarization_workflow#3087732
this can take up to a hour. I've experienced more. You can see the status of an existing request
using the notary-log command.
Resources:
- https://gist.github.com/jcward/d08b33fc3e6c5f90c18437956e5ccc35
- https://github.com/achow101/signapple
- https://developer.apple.com/library/archive/technotes/tn2206/_index.html#//apple_ref/doc/uid/DTS40007919
- https://gregoryszorc.com/docs/apple-codesign/main/index.html
- https://www.apple.com/certificateauthority/
- https://developer.apple.com/documentation/security/notarizing_macos_software_before_distribution
Resources on packaging an application for MacOS: