Developer ID

RSS for tag

Developer ID certificates are unique identifiers from Apple that assure users that you are a trusted developer.

Posts under Developer ID tag

200 Posts

Post

Replies

Boosts

Views

Activity

Notarized, Developer ID-signed App for Direct Distribution Won't Run (Wants App Store Sign-In, Then Says Damaged)
Hi all, I'm attempting to distribute a notarized expiring demo variant of my Mac App Store app (TypeMetal) directly to potential customers as a download on our website, using the procedure documented here: https://developer.apple.com/documentation/security/notarizing_macos_software_before_distribution I successfully complete the 9 steps listed in "Notarize Your App Automatically as Part of the Distribution Process", including choosing "Developer ID (Distribute directly to customers)" and "Upload (Send to Apple notary service)", and successfully download the resultant .app bundle, but I'm unable to run the app. It looks to me as if the system is attempting to obtain an App Store receipt for the app, when what I want is for this variant of the app to be treated as distinct from the purchased Mac App Store version, and be runnable without purchase. I have tried changing the app's bundle identifier and removing the LSApplicationCategoryType (in the Xcode target's settings, before building), but neither seems to affect these results. I'm left wondering how the system is determining that this is an .app that requires App Store sign-in/receipt-checking. When I copy the downloaded, notarized .app to a different macOS user account, log in as that user, and attempt to launch it there, the system presents a panel, prompting for the user to sign in with their Apple ID: When I attempt to launch the app in my own user account (the one I build and develop in), the system presents the same prompt in a slightly different form: Whether or not I provide a valid Apple ID sign-in in either case, the launched app then terminates with a fatal alert. (Same result in a separate user account as in my own development account.) I would like for the distributed app to be runnable by customers without requiring an App Store receipt. I have verified that my own App Store receipt-checking code is being omitted, as I intend, from the build I that submit for notarization. Is there something I need to do differently to make this work? The notarized app has passed the checks described here: Resolving Common Notarization Issues https://developer.apple.com/documentation/security/notarizing_macos_software_before_distribution/resolving_common_notarization_issues#3087721 I can provide the outputs of the codesign and spctl checks recommended on that page, if that would be helpful. The .app contains one embedded framework (OpenSSL.framework) and one command-line executable (tidy), but I believe they are correctly code-signed. I'm testing this on a 2020 M1 MacBook Air running macOS 12.3.1 (21E258), using Xcode 13.3.1 (13E500a) to do the build, upload for notarization, and export of the notarized result. Thanks very much in advance for any insight you can offer. Troy Stephens Coherence Labs, LLC
5
0
1.6k
May ’22
Notarization error 1048
I'm trying to get a pkg file notarized.The notarization process worked fine for me until some day ago.Now, when I run the altool command, I get this error : *** Error: To use this application, you must first sign in to iTunes Connect and sign the relevant contracts. (1048)I have checked https://developer.apple.com/account/ and https://appstoreconnect.apple.com/agreements/ too see if you have any pending agreement, but there is nothing there.The command I use is 'xcrun altool --notarize-app --primary-bundle-id $MYBUNDLEID --username $MYUSERID --asc-provider $MYTEAMID --password $MYAPPPASSWORD --file $MYPKGFILE'The last time the altool command worked for me was on the 29 May.Any idea what is going wrong here?
8
0
16k
May ’22
Testing Hardened Runtime?
So I've enabled Hardened Runtime on my app but want to test it actually does what it is meant to do.So I put in a simple couple of calls to location services on a button: CLLocationManager* locMan = [CLLocationManager new]; [locMan startUpdatingLocation];and expected my app to crash on Mojave since I hadn't ticked the "Location" option in the "Resource Access" section of the Hardened Runtime capabilities.Instead it carried on as normal and I saw the Location StatusItem show up in the menu bar with my app listed as something that was using Location services.So now I'm wondering if Hardened Runtime is really turned on for my app or not. Or am I misunderstanding its usage?FYI - My app is distributed via Developer ID provisioning, not the App Store.
2
0
2.1k
Apr ’22
What happens when Developer ID Installer certificate expires?
Hello. According to Apple documentation, Developer ID Installer Certificate (Mac applications): If your certificate expires, users can no longer launch installer packages for your Mac applications that were signed with this certificate. https://developer.apple.com/support/certificates/ However, using installer signed before expiration, I can still install the application, even after certificate has expired and installer even shows it as Expired but valid. Could you please clarify if the quote above is true? Or how is it possible that I can still install the application? Thank you, Jakub
2
0
2.8k
Apr ’22
Certificates need to created again from next account if app move from older one ?
Recently, We have move our live app from one account to another one which is using same email id. App movement work is done by raising the request, Currently there is no issue for exiting user or those downloading and using our live app. Now, for implementing In-App purchase or other features, We have to create certificates or provisioning again from new account. Currently only app id is showing, no provisioning profile, certificates and push notification key in that account. Kindly guide us. We just want to keep exiting features working and also need to add few more. If there is any way to move certificates or exiting configuration as well from old to new account. Let us know. Thanks David
0
0
1.2k
Apr ’22
Notarized app not able to load dynamic library signed by another team
We have an app company.app and it is loading dynamic library from a thirdparty vendor - let's call it vendor.dylib.company.app is signed by our organisation's developer ID certificate. We have notarized company.app with hardened runtime enabled.vendor.dylib is signed and notarised by vendor's certificate.Now, when company.app tries to load the dylib using dlopen, we get an error "not valid for use in process using Library Validation: mapping process and mapped file (non-platform) have different Team IDs"I read about disabling library validation entitlement https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_security_cs_disable-library-validation?language=objc and https://forums.developer.apple.com/thread/126895I added this in the info.plist file <key>com.apple.security.cs.disable-library-validation</key> <true/>After building the app and notarising it, i can still see the value com.apple.security.cs.disable-library-validation set to true in the final app's Info.plist.Yet, i get the same error "not valid for use....... mapped file have different Team IDs". It's as if 'disabling library validation entitlement' didn't take effect.Any pointers how to go about this?Note : I cannot opt for a solution where we take vendor.dylib and sign it with our certificate because even though it does seem to solve the loading problem, the vendor's code itself is doing some checksum verification which breaks if vendor.dylib is re-signed with our cert.
5
0
3.7k
Mar ’22
Know Expiration date of Developer ID Signed MAC App
I have gone through this section related to Developer ID. But I'm not very clear about the role of developer id provisioning profile toward the expiration date of the Mac App. It says app that don't utilize the developer id provisioning profile will not expire even though the cert expire after the app installation of the app. Then it says apps that utilize advanced capabilities of provisioning profile will not work after the expiration of provisioning profile even though the cert is not expired. So what is meant by "Apps that don't utilize PP" and "Apps that utilize advance Capabilities of PP" Can we signed developer ID app with and without provisioning profiles? How we know that whether the PP is affect on the expiration date of Mac App or not?
1
0
1.1k
Mar ’22
How to change DYLD_LIBRARY_PATH at runtime?
Hello, I've searched for other posts on this topic but I haven't found anything that provides an answer.Here's my test program snippet, using the Xcode Mac Application Obj-C starter project:- (void)applicationDidFinishLaunching:(NSNotification *)aNotification { // Insert code here to initialize your application char const * dyld_library_path_original = getenv("DYLD_LIBRARY_PATH"); char dyld_library_path_new[1024]; strcpy(dyld_library_path_new, "/Applications/MATLAB_R2020a.app/bin/maci64:"); strcat(dyld_library_path_new, dyld_library_path_original); int rc = setenv("DYLD_LIBRARY_PATH", dyld_library_path_new, 1); NSLog(@"DYLD_LIBRARY_PATH=%s, rc=%d", getenv("DYLD_LIBRARY_PATH"), rc); void * handle1 = dlopen("libeng.dylib", RTLD_NOW); NSLog(@"Test 1: dlopen(libeng.dylib) = %p, err=%s", handle1, dlerror()); void * handle2 = dlopen("/Applications/MATLAB_R2020a.app/bin/maci64/libeng.dylib", RTLD_NOW); NSLog(@"Test 2: dlopen(libeng.dylib) = %p, err=%s", handle2, dlerror()); }As you can see, I'm trying to dlopen a dylib in the installed MATLAB application. But I don't think the specific dylib matters. What matters is that I'm dlopening it using just the leaf name of the path, after setting DYLD_LIBRARY_PATH at runtime to include MATLAB's dir (Test 1). This fails.But when I dlopen it with the full path (Test 2) it works. Here's the output:DYLD_LIBRARY_PATH=/Applications/MATLAB_R2020a.app/bin/maci64:/Users/hecht/Library/Developer/Xcode/DerivedData/TestML-droybqyctybedebamivvyiixjhnn/Build/Products/Debug:/usr/lib/system/introspection, rc=0 Test 1: dlopen(libeng.dylib) = 0x0, err=dlopen(libeng.dylib, 2): image not found Test 2: dlopen(libeng.dylib) = 0x6000039041a0, err=(null)I have Hardened Runtime enabled, with these entitlements turned on:Allow DYLD Environment VariablesDisable Library ValidationThe second one is doing its job, because without it, Test 2 fails also.But the first one doesn't help in allowing me to modify DYLD_LIBRARY_PATH at runtime. If I set the environment variable before launching (Xcode > Product > Scheme > Edit Scheme > Arguments > Environment Variables) then Test 1 works. Is there a way to get dyld to honor changes to this environment variable made at runtime?
5
0
6.1k
Mar ’22
how do I notarize python module
Hello, I have a electron app. I want to notarize this app. But there is a problem about python module.In my case, some user will use it offline, so I need prepare common python modules for them.When I try to notarize app, Apple will return failed, and logs tell to me that python module (.so files) does not cotains a valid signature or a secure timestamp signature. What can I do to make app notarized with python module?Can I let apple ignore these python module in app or Is there a way to signature these python modules ?
8
0
2.5k
Mar ’22
how to delete a 'ghost' signing certificate (Xcode 13.2.1)
In my keychain, I have one Developer ID Application certificate, with a private key, for my Team. In Xcode's Accounts/Manage Certificates dialog, there are three Developer ID Application certificates, two of which have a red 'x' badge and the status 'missing private key'. I can right click on any of those three entries and my only enabled choice is "Export". Email creator or Delete are disabled. Why? In my Team's account, there are indeed three Developer ID Application certificates, with different expiration dates, but I only have the private key for one of them. By choosing Manual signing, I can choose a specific certificate from my keychain, but Xcode 13.2.1 tells me that this certificate is missing its private key - but I can see that private key in my keychain!
1
0
1.7k
Mar ’22
Can I update a resouce in a signed app and then just resign the updated resource?
Hi,I have an automated build process that produces custom apps for different customers. The only thing that is customized is a resource in the app.I would like to be able to just code sign the entire app once and then for each customer just update and code sign the resource.After doing the initial code signing of the app "codesign -vvv --deep --strict myapp.app" shows that everything is OK.I then replace myapp.app//Contents/Resources/CustomFile with a new one and code sign it:codesign -f -s "Developer ID Application: MY Company" --options runtime --keychain "Buildsystem" "myapp.app/Contents/Resources/CustomFile"But then "codesign -vvv --deep --strict myapp.app" shows there is a problem:myapp.app: a sealed resource is missing or invalidfile modified: myapp.app/Contents/Resources/CustomFileCan anybody explain why this doesn't work?My work around is to always update the resource in an unsigned app and then code sign the entire thing.
7
0
5k
Mar ’22
Monteray can’t be opened because Apple cannot check it for malicious software?
Hi, I'm responsible for generating the macOS installer for Apache NetBeans. Up until today I've not had any issues, the DMG created has never had any issues being used on others machines. The process we have signs and notarizes the app, as expected. However when downloading this from the internet at attempting to install the app, users are reporting that it cannot be opened because it cannot be checked by Apple for malicious software. Heres a link to the app: https://dist.apache.org/repos/dist/dev/netbeans/netbeans-installers/13/Apache-NetBeans-13-bin-macosx.dmg If I try to open this myself(after downloading), I can see 2 messages in Console: 1: assessment denied for Apache-NetBeans-13-bin-macosx.dmg com.apple.message.domain: com.apple.security.assessment.outcome2 com.apple.message.signature2: bundle:UNBUNDLED com.apple.message.signature: denied:no usable signature com.apple.message.signature3: Apache-NetBeans-13-bin-macosx.dmg com.apple.message.signature5: UNKNOWN com.apple.message.signature4: 3 SenderMachUUID: 8702454A-423C-33A4-BDAA-656186E59614 2: assessment denied for Apache NetBeans 13.pkg com.apple.message.domain: com.apple.security.assessment.outcome2 com.apple.message.signature2: bundle:UNBUNDLED com.apple.message.signature3: Apache NetBeans 13.pkg com.apple.message.signature5: UNKNOWN com.apple.message.signature4: 2 com.apple.message.signature: denied:Unnotarized Developer ID SenderMachUUID: 8702454A-423C-33A4-BDAA-656186E59614 I'm struggling to work out how to further diagnose this, to allow us to release this application? The notarization of this app comes back as "Package Approved", so I don't get that reference in those messages. Any help or advice on how to continue with this?
11
0
3.2k
Mar ’22
Signing a Mac Product For Distribution
IMPORTANT This post has been replaced by two shiny new posts: Creating Distribution-Signed Code for Mac Packaging Mac Software for Distribution See the preamble in Creating Distribution-Signed Code for Mac for more context. I’ve left the original post here just for the record. Share and Enjoy — Quinn “The Eskimo!” Apple Developer Relations, Developer Technical Support, Core OS/Hardware let myEmail = "eskimo" + "1" + "@" + "apple.com" I spend a lot of time helping Mac developers with notarisation and Gatekeeper problems, and many of these problems are caused by incorrect code signing. The instructions for how to sign and package a Mac product for distribution are rather scattered, so I’ve written them all down in one place. And rather than keep that to myself, I’m posting it here for everyone’s benefit. If you have any corrections, feel free to get in touch with me directly (my email address is in my signature). And if have any questions about this, it’s probably best to ask them here on DevForums. I’ve locked this thread, so just start a new thread tagging it with Code Signing, Notarization, or Gatekeeper. Or, if you want one-on-one help, open a DTS tech support incident and we can pick things up in that context. IMPORTANT None of the following has been formally reviewed, so it’s not official Apple documentation. Signing a Mac Product For Distribution The best way to sign and package an app is via Xcode: Build a version of your app to distribute using Xcode’s Product > Archive command, and then package that archive for your distribution channel via the Organizer. See Xcode Help > Distribute your app for the details. However, not all Mac products can be distributed this way. For example: An app that’s distributed outside of the Mac App Store on a disk image A product that has to be installed via an installer package An app that uses a third-party development environment In these cases you must manually sign and package your product. Note If you find this post a little abstract, and would prefer to follow a concrete example, see Manual Code Signing Example. Consult Resources for Third-Party Development Environments Many third-party development environments have their own strategies for signing and packaging the products they build. If you’re using a third-party development environment, consult its support resources for advice before continuing. Decide on a Container Format To get started, decide on your container format. Mac products support two distribution channels: An app can be distributed via the Mac App Store Apps and non-apps can be distributed outside of the Mac App Store using Developer ID signing A Mac App Store app must be submitted as an installer package. In contrast, products distributed outside of the Mac App Store can use a variety of different container formats, the most common being: Zip archive (.zip) Disk image (.dmg) Installer package (.pkg) It’s also possible to nest these. For example, you might have an app inside an installer package on a disk image. Each container format has its own pros and cons, so pick an approach based on the requirements of your product. However, this choice affects how you package your product, something discussed in more detail below. Structure Your Code Correctly All code that you distribute must be signed. There’s two parts to this: Structuring your code to support signing Actually signing it You must structure your code correctly. If you don’t, it may be hard (or in some cases impossible) to sign it. First things first, identify all the code in your product. There are many types of code, including apps, app extensions, frameworks, other bundled code (like XPC Services), shared libraries, and command-line tools. Each type of code has two key attributes Is it bundled code? (apps, app extensions, frameworks, other bundled code) Is it a main executable? (apps, app extensions, command-line tools) Both of these attributes affect how you sign the code. In addition, whether the code is bundled is critical to how you structure it. Specifically, bundled code supports the notion of nested code. For example, you might have an app extension nested within your app’s bundle. When dealing with nested code, follow these rules: Place any nested code in the appropriate nested code location. For more on that, see Placing Content in a Bundle. Do not place non-code items in a nested code location. Rather, place these in the bundle’s resources directory (typically Contents/Resources). IMPORTANT Scripts are not considered code. If you have scripts — shell, Python, AppleScript, or whatever — place them in the resources directory. These will still be signed, but as a resource rather than as code. Provisioning Profile If you have a main executable that uses a restricted entitlement, one that must be allowlisted by a provisioning profile, place the profile in your bundle at the path Contents/embedded.provisionprofile. The profile is sealed by the code signature, so do this before signing the code. If your product contains multiple executables that need a profile — for example, you have an app with an embedded Network Extension app extension, both of which need the Network Extensions entitlement — repeat this process for each of these code executables. If your product includes a non-bundled executable that uses a restricted entitlement, you must package that executable in an app-like structure. For the details, see Signing a Daemon with a Restricted Entitlement. Handling Alien Code Structures If you’re using a complex third-party library, you may find that the structure required by the library does not match up with the structure required by macOS. For an in-depth discussion of the techniques you can use to resolve this, see Embedding Nonstandard Code Structures in a Bundle. Sign Your Code Sign code using the codesign tool. Read the following sections to learn about the specific arguments to use, but also keep these general rules in mind: Do not use the --deep argument. This feature is helpful in some specific circumstances but it will cause problems when signing a complex program. For a detailed explanation as to why, see --deep Considered Harmful. Rather, sign each code item separately. For a complex app, you should create a script to do this. Sign from the inside out. That is, if A depends on B, sign B before you sign A. When you sign A, the code signature encodes information about B, and changing B after the fact can break the seal on that code signature. Basic Signing No matter what sort of code you’re signing, the basic codesign command looks like this: % codesign -s III /path/to/your/code` where III is the name of the code signing identity to use. The specific identity varies depending on your target platform. See the following sections for details. When signing bundled code (as defined in Structure Your Code Correctly) pass in the path to the bundle, not the path to the code. If you’re re-signing code — that is, the code you’re signing is already signed — pass the -f option. If you’re signing a main executable (as defined in Structure Your Code Correctly) that needs entitlements, add --entitlements EEE.entitlements, where EEE.entitlements is a path to a property list file that contains your entitlements. IMPORTANT The entitlements property list file must be in the standard XML format with LF line endings, no comments, and no BOM. If you’re not sure of the file’s provenance, use plutil to convert it to the standard format. See Ensure Properly Formatted Entitlements in Resolving Common Notarization Issues. If you’re signing non-bundled code, set the code signing identifier by adding -i BBB, where BBB is the bundle ID the code would have if it had a bundle ID. For example, if you have an app whose bundle ID is com.example.flying-animals that has a nested command-line tool called pig-jato, the bundle ID for that tool would logically be com.example.flying-animals.pig-jato, and that’s a perfectly fine value to use for BBB. Note For bundled code, you don’t need to supply a code signing identifier because codesign defaults to using the bundle ID. Mac App Store Signing If you’re distributing via the Mac App Store, use your Mac App Distribution signing identity in place of III in the example above. This will typically be named 3rd Party Mac Developer Application: TTT, where TTT identifies your team. You can also use an Apple Distribution signing identity, with the name Apple Distribution: TTT. Developer ID Signing If you’re distributing outside of the Mac App Store, use your Developer ID Application signing identity in place of III in the example above. This will typically be named Developer ID Application: TTT, where TTT identifies your team. All Developer ID signed code needs a secure timestamp; enable this by adding the --timestamp option. If you’re signing a main executable (as defined in Structure Your Code Correctly), enable the hardened runtime by adding -o runtime option. The hardened runtime enables additional security checks within your process. You may need to make minor code changes to be compatible with those additional security checks. For some specific examples, watch WWDC 2019 Session 703 All About Notarization. Failing that, you can opt out of these additional security checks using entitlements. See Hardened Runtime Entitlements Build Your Container Once you’ve signed the code in your product, it’s time to wrap it in a container for distribution. Follow the advice appropriate for your chosen container format in the following sections. If you’re using a nested container format — for example, an app inside an installer package on a disk image — work from the inside out, following the advice for each level of nesting. Build a Zip Archive Use the ditto tool to create a zip archive for your product: Create a directory that holds everything you want to distribute. Run the ditto as shown below, where DDD is the path to the directory from step 1 and ZZZ is the path where ditto creates the zip archive. % ditto -c -k --keepParent DDD ZZZ Zip archives cannot be signed (although their contents can be). Build an Installer Package Use the productbuild tool to create a simple installer package for a single app: % productbuild --sign III --component AAA /Applications PPP In this example: III is either your Mac Installer Distribution or Developer ID Installer signing identity, depending on your distribution channel. This will typically be named 3rd Party Mac Developer Installer: TTT or Developer ID Installer: TTT, where TTT identifies your team. AAA is the path to your app. PPP is the path where productbuild creates the installer package. IMPORTANT The above is the simplest possible example. There are many different ways to create installer packages. See the man pages for productbuild, productsign, pkgbuild, and pkgutil for more details. Build a Disk Image Use the hdiutil tool to create a disk image for distribution: Create a directory to act as the source for the root directory of your disk image’s volume. Populate that directory with the items you want to distribute. Use hdiutil command shown below to create the disk image, where SSS is the directory from step 1 and DDD is the path where hdiutil creates the disk image. Use codesign command shown below to sign the disk image, where III is your Developer ID Application signing identity (typically named Developer ID Application: TTT, where TTT identifies your team), BBB is a pseudo bundle ID as discussed in Basic Signing, and DDD is the path to the disk image from step 3. % hdiutil create -srcFolder SSS -o DDD % codesign -s III --timestamp -i BBB DDD IMPORTANT There are various third-party tools that can help you create a disk image in exactly the right way. For example, the tool might arrange the icons nicely, set a background image, and add a symlink to /Applications. If you use such a tool, or create your own tool for this, make sure that the resulting disk image: Is signed with your Developer ID Application signing identity Is a UDIF-format read-only zip-compressed disk image (type UDZO) Notarisation If you’re distributing outside of the Mac App Store, you must notarise the file you intend to distribute to your users. For instructions on doing this, see Customizing the Notarization Workflow. Skip the Export a Package for Notarization section because you already have the file that you want to submit. If you’re using a nested container format, only notarise the outermost container. For example, if you have an app inside an installer package on a disk image, sign the app, sign the installer package, and sign the disk image, but only notarise the disk image. The exception to this rule is if you have a custom third-party installer. In that case, see the discussion in Customizing the Notarization Workflow. Stapler Once you have notarised your product, you should staple the resulting ticket to the file you intend to distribute. Customizing the Notarization Workflow discusses how to do this for a zip archive. The other common container formats (installer package and disk image) support stapling directly. For example: % xcrun stapler staple FlyingAnimals.dmg Note Stapling is recommended but not mandatory. If you don’t staple, a user may have problems if they try to install or run your app for the first time when the Mac is offline. Change history: 20 Jan 2020 — First version. 27 Jan 2020 — Minor editorial changes. 9 Mar 2020 — Moved the details of --deep into a separate post, --deep Considered Harmful. 10 Mar 2020 — Fixed a typo. 30 Mar 2020 — Added a link to Manual Code Signing Example. 26 Feb 2021 — Fixed the formatting. Add a discussion of the entitlements file format. Minor editorial changes. 1 Mar 2021 — Added the Provisioning Profile section. 21 Oct 2021 — Updated the Structure Your Code Correctly section to reference Placing Content in a Bundle. 22 Dec 2021 — Replaced links to two DevForums posts with links to the official documentation, namely those for Signing a Daemon with a Restricted Entitlement and Embedding Nonstandard Code Structures in a Bundle. Made some other editorial changes.
0
0
32k
Mar ’22
Library validation and CoreMedia I/O plug-ins
Hi!The problem I want to discuss is not new, but it is becoming more and more critical for the project I'm working on. So I have to rise it again.Our project is a virtual webcam for macOS implemented as a CoreMedia I/O DAL plug-in. Plug-in is installed at /Library/CoreMediaIO/Plug-Ins/DAL and can be loaded into any client application that wants to use the webcam.The problem appeared when Apple introduced 'Hardened Runtime' in macOS Mojave which by default turns on 'Library Validation' feature. Library validation disables loading for frameworks/plugins/libraries which are either: 1) not signed; 2) signed but 'Team Identifier' in signing certificate is different than certificate of a client application signature. As a result, even though our plugin is properly signed and notarized, it can't be loaded into client application with hardened runtime because of that 2nd case.First alarming incident was last year when Google Chrome on macOS enabled hardened runtime, and stopped showing our webcam in the list. I requested a technical support (case ID for TSI: 718328224), then made a feedback to Apple (FB7071665) about any possible solutions for our case, at least in the future versions of macOS. But I see there's still no reaction there.Now things are getting worse. Skype and Zoom stopped support our webcam for the same reason. Some others announced they will do this too. There's a possibility to add 'com.apple.security.cs.disable-library-validation' entitlement to the client application - that would help with our issue. But Zoom and Skype refuse to add this because of security reasons - after some security exploits were uncovered.The situation is quite critical for our product as many users use our webcam only for Zoom, Skype and similar applications.So, the question is: are there any possible workarounds for our case? I know that for audio plugins (VST, etc.) there's a special entitlement: 'com.apple.security.temporary-exception.audio-unit-host' that allows loading even unsigned plugins into hosting application. Why there's no such entitlement for DAL plugins? Or will it appear in macOS 10.16? I think it would be reasonable to add an entitlement that would only reject loading of unsigned plugins, but would allow loading of plugins with different 'Team ID' in signing certificate.
19
0
9.4k
Feb ’22
How to app distribution for Mac
I'm developing an app for mac, and I'm a complete novice I've never done in my life. There are a total of 2 targets via extension, one of which contains endpoint-security. Anyway, I succeeded in setting up the provisioning file on the developing PC, building it, and running it. I also wanted to bundle all those apps via dmg and run them on different Macos. But here's the problem: When I run it on another PC, I get a notification being blocked by the gatekeeper. When I ran the following command through Google, rejected was confirmed, and I found out that this is the difference between notarization. command : spctl --assess --verbose=4 --type exec /Applications/My.app result : /Applications/My.app : rejected Afterwards I created Certificates -> Add -> Developer ID Applications certificate from Apple Developer site and registered it to my keychain. After doing Xcode's Product -> Archives -> Distribute App -> Developer ID -> Upload for notarization, I selected as follows. Distribution Certificate => Developer ID Applications App1: [Error] Profile doesn't include the selected signing certificate. [Error] Profile is not a "Developer ID" profile. App2: [Error] Profile doesn't include the selected signing certificate. [Error] Profile is not a "Developer ID" profile. An error occurred in the provisioning profile, and when you use the provisioning used for build, I confirmed that the error occurred because the Type was Development. [Where you need help] So I chose Developer ID from Create Profile on Apple developer site to create a new provisioning profile for Developer ID Applications. But it says no certificate here. Also, Distribution has the following items, and no matter which one I select, I could not create a provisioning file using the Developer ID Applications certificate created above. [Distribution List] ad hoc Create a distribution provisioning profile to install your app on a limited number of registered devices. tvOS Ad Hoc Create a distribution provisioning profile to install your app on a limited number of registered tvOS devices. Developer ID Create a Developer ID provisioning profile to use Apple services with your Developer ID signed applications. In House To sign iOS apps for In House Distribution, you need a Certificate. tvOS In House To sign tvOS apps for In House Distribution, you need a Certificate. I would like to create a provisioning file for notarization, can you tell me in detail where to create it?
8
0
3.4k
Feb ’22
How do I re-sign a .pkg installer file?
My Developer ID Installer is expiring soon, according to this page I must re-sign all my existing installers or else no one can use them anymore. How do I do this? Can I strip away or replace the signature somehow? What I've tried so far: I have removed the old certificate from my keychain and added a new one. It has the same ID and everything as the old certificate, but a new expiry date. I've tried running productsign which looks like it's replacing the signature alright but when I inspect the new installer it still has the old certificate expiry date. Command used: productsign --sign MYSIGNID oldSignedInstaller.pkg newSignedInstaller.pkg
2
0
3.3k
Feb ’22
Question about creating certificates
Hello, I read on the Apple Support page that for iOS Distribution certificates, when they expire, "Users will no longer be able to run apps that have been signed with this certificate. You must distribute a new version of your app that is signed with a new certificate." We have 2 certificates that will be expiring soon, a Distribution certificate and an iOS Distribution certificate. I think this app is on the App store. I understand that some certificates can expire without having an affect on the apps; they just need to be updated in order to put a new version out there. I am trying to figure out if ours apply to that scenario or the one above where it will immediately affect installed apps. Any feedback on that? The Apple support person I talked to said I would have to create the certificates before the expiration date, and I have to coordinate that with the release of an updated version of the app. So I believe I need to coordinate with the developer and create the certificate when he uploads a new version of the app. Also, he told me that the iOS Distribution certificates and the Distribution certificates are created in different ways. I found this about creating iOS Distribution certificates: https://support.staffbase.com/hc/en-us/articles/115003458931-Creating-the-iOS-Distribution-Certificate Can all these steps be done ahead of time and I could send the certificate file to the developer? Is there a URL that shows the different way to create Distribution certificates? Thank you. Any answers to these questions would be very helpful.
4
0
2.5k
Jan ’22
What is the purpose of Apple Development and Apple Distribution certificates for macOS?
What is the purpose of Apple Development and Apple Distribution certificates for macOS application?It is quite new types of certificates in addition to existing iOS/Mac Development/Distribution.According to the documentation https://help.apple.com/xcode/mac/current/#/dev154b28f09?sub=dev23755c6c6Apple Development — For macOS apps, use app services during development and testing.Apple Distribution — For macOS apps, sign an app before distributing it through the Mac App Store.What does it mean sign an app before distributing because for distributing it through the Mac App Store I have to use Mac App Distribution (the name is `3rd Party Mac Developer Application`) and Mac Installer Distribution (the name is `3rd Party Mac Developer Installer`).
3
0
9.4k
Jan ’22
Notarized, Developer ID-signed App for Direct Distribution Won't Run (Wants App Store Sign-In, Then Says Damaged)
Hi all, I'm attempting to distribute a notarized expiring demo variant of my Mac App Store app (TypeMetal) directly to potential customers as a download on our website, using the procedure documented here: https://developer.apple.com/documentation/security/notarizing_macos_software_before_distribution I successfully complete the 9 steps listed in "Notarize Your App Automatically as Part of the Distribution Process", including choosing "Developer ID (Distribute directly to customers)" and "Upload (Send to Apple notary service)", and successfully download the resultant .app bundle, but I'm unable to run the app. It looks to me as if the system is attempting to obtain an App Store receipt for the app, when what I want is for this variant of the app to be treated as distinct from the purchased Mac App Store version, and be runnable without purchase. I have tried changing the app's bundle identifier and removing the LSApplicationCategoryType (in the Xcode target's settings, before building), but neither seems to affect these results. I'm left wondering how the system is determining that this is an .app that requires App Store sign-in/receipt-checking. When I copy the downloaded, notarized .app to a different macOS user account, log in as that user, and attempt to launch it there, the system presents a panel, prompting for the user to sign in with their Apple ID: When I attempt to launch the app in my own user account (the one I build and develop in), the system presents the same prompt in a slightly different form: Whether or not I provide a valid Apple ID sign-in in either case, the launched app then terminates with a fatal alert. (Same result in a separate user account as in my own development account.) I would like for the distributed app to be runnable by customers without requiring an App Store receipt. I have verified that my own App Store receipt-checking code is being omitted, as I intend, from the build I that submit for notarization. Is there something I need to do differently to make this work? The notarized app has passed the checks described here: Resolving Common Notarization Issues https://developer.apple.com/documentation/security/notarizing_macos_software_before_distribution/resolving_common_notarization_issues#3087721 I can provide the outputs of the codesign and spctl checks recommended on that page, if that would be helpful. The .app contains one embedded framework (OpenSSL.framework) and one command-line executable (tidy), but I believe they are correctly code-signed. I'm testing this on a 2020 M1 MacBook Air running macOS 12.3.1 (21E258), using Xcode 13.3.1 (13E500a) to do the build, upload for notarization, and export of the notarized result. Thanks very much in advance for any insight you can offer. Troy Stephens Coherence Labs, LLC
Replies
5
Boosts
0
Views
1.6k
Activity
May ’22
Notarization error 1048
I'm trying to get a pkg file notarized.The notarization process worked fine for me until some day ago.Now, when I run the altool command, I get this error : *** Error: To use this application, you must first sign in to iTunes Connect and sign the relevant contracts. (1048)I have checked https://developer.apple.com/account/ and https://appstoreconnect.apple.com/agreements/ too see if you have any pending agreement, but there is nothing there.The command I use is 'xcrun altool --notarize-app --primary-bundle-id $MYBUNDLEID --username $MYUSERID --asc-provider $MYTEAMID --password $MYAPPPASSWORD --file $MYPKGFILE'The last time the altool command worked for me was on the 29 May.Any idea what is going wrong here?
Replies
8
Boosts
0
Views
16k
Activity
May ’22
Testing Hardened Runtime?
So I've enabled Hardened Runtime on my app but want to test it actually does what it is meant to do.So I put in a simple couple of calls to location services on a button: CLLocationManager* locMan = [CLLocationManager new]; [locMan startUpdatingLocation];and expected my app to crash on Mojave since I hadn't ticked the "Location" option in the "Resource Access" section of the Hardened Runtime capabilities.Instead it carried on as normal and I saw the Location StatusItem show up in the menu bar with my app listed as something that was using Location services.So now I'm wondering if Hardened Runtime is really turned on for my app or not. Or am I misunderstanding its usage?FYI - My app is distributed via Developer ID provisioning, not the App Store.
Replies
2
Boosts
0
Views
2.1k
Activity
Apr ’22
What happens when Developer ID Installer certificate expires?
Hello. According to Apple documentation, Developer ID Installer Certificate (Mac applications): If your certificate expires, users can no longer launch installer packages for your Mac applications that were signed with this certificate. https://developer.apple.com/support/certificates/ However, using installer signed before expiration, I can still install the application, even after certificate has expired and installer even shows it as Expired but valid. Could you please clarify if the quote above is true? Or how is it possible that I can still install the application? Thank you, Jakub
Replies
2
Boosts
0
Views
2.8k
Activity
Apr ’22
Certificates need to created again from next account if app move from older one ?
Recently, We have move our live app from one account to another one which is using same email id. App movement work is done by raising the request, Currently there is no issue for exiting user or those downloading and using our live app. Now, for implementing In-App purchase or other features, We have to create certificates or provisioning again from new account. Currently only app id is showing, no provisioning profile, certificates and push notification key in that account. Kindly guide us. We just want to keep exiting features working and also need to add few more. If there is any way to move certificates or exiting configuration as well from old to new account. Let us know. Thanks David
Replies
0
Boosts
0
Views
1.2k
Activity
Apr ’22
Notarized app not able to load dynamic library signed by another team
We have an app company.app and it is loading dynamic library from a thirdparty vendor - let's call it vendor.dylib.company.app is signed by our organisation's developer ID certificate. We have notarized company.app with hardened runtime enabled.vendor.dylib is signed and notarised by vendor's certificate.Now, when company.app tries to load the dylib using dlopen, we get an error "not valid for use in process using Library Validation: mapping process and mapped file (non-platform) have different Team IDs"I read about disabling library validation entitlement https://developer.apple.com/documentation/bundleresources/entitlements/com_apple_security_cs_disable-library-validation?language=objc and https://forums.developer.apple.com/thread/126895I added this in the info.plist file <key>com.apple.security.cs.disable-library-validation</key> <true/>After building the app and notarising it, i can still see the value com.apple.security.cs.disable-library-validation set to true in the final app's Info.plist.Yet, i get the same error "not valid for use....... mapped file have different Team IDs". It's as if 'disabling library validation entitlement' didn't take effect.Any pointers how to go about this?Note : I cannot opt for a solution where we take vendor.dylib and sign it with our certificate because even though it does seem to solve the loading problem, the vendor's code itself is doing some checksum verification which breaks if vendor.dylib is re-signed with our cert.
Replies
5
Boosts
0
Views
3.7k
Activity
Mar ’22
Know Expiration date of Developer ID Signed MAC App
I have gone through this section related to Developer ID. But I'm not very clear about the role of developer id provisioning profile toward the expiration date of the Mac App. It says app that don't utilize the developer id provisioning profile will not expire even though the cert expire after the app installation of the app. Then it says apps that utilize advanced capabilities of provisioning profile will not work after the expiration of provisioning profile even though the cert is not expired. So what is meant by "Apps that don't utilize PP" and "Apps that utilize advance Capabilities of PP" Can we signed developer ID app with and without provisioning profiles? How we know that whether the PP is affect on the expiration date of Mac App or not?
Replies
1
Boosts
0
Views
1.1k
Activity
Mar ’22
How to change DYLD_LIBRARY_PATH at runtime?
Hello, I've searched for other posts on this topic but I haven't found anything that provides an answer.Here's my test program snippet, using the Xcode Mac Application Obj-C starter project:- (void)applicationDidFinishLaunching:(NSNotification *)aNotification { // Insert code here to initialize your application char const * dyld_library_path_original = getenv("DYLD_LIBRARY_PATH"); char dyld_library_path_new[1024]; strcpy(dyld_library_path_new, "/Applications/MATLAB_R2020a.app/bin/maci64:"); strcat(dyld_library_path_new, dyld_library_path_original); int rc = setenv("DYLD_LIBRARY_PATH", dyld_library_path_new, 1); NSLog(@"DYLD_LIBRARY_PATH=%s, rc=%d", getenv("DYLD_LIBRARY_PATH"), rc); void * handle1 = dlopen("libeng.dylib", RTLD_NOW); NSLog(@"Test 1: dlopen(libeng.dylib) = %p, err=%s", handle1, dlerror()); void * handle2 = dlopen("/Applications/MATLAB_R2020a.app/bin/maci64/libeng.dylib", RTLD_NOW); NSLog(@"Test 2: dlopen(libeng.dylib) = %p, err=%s", handle2, dlerror()); }As you can see, I'm trying to dlopen a dylib in the installed MATLAB application. But I don't think the specific dylib matters. What matters is that I'm dlopening it using just the leaf name of the path, after setting DYLD_LIBRARY_PATH at runtime to include MATLAB's dir (Test 1). This fails.But when I dlopen it with the full path (Test 2) it works. Here's the output:DYLD_LIBRARY_PATH=/Applications/MATLAB_R2020a.app/bin/maci64:/Users/hecht/Library/Developer/Xcode/DerivedData/TestML-droybqyctybedebamivvyiixjhnn/Build/Products/Debug:/usr/lib/system/introspection, rc=0 Test 1: dlopen(libeng.dylib) = 0x0, err=dlopen(libeng.dylib, 2): image not found Test 2: dlopen(libeng.dylib) = 0x6000039041a0, err=(null)I have Hardened Runtime enabled, with these entitlements turned on:Allow DYLD Environment VariablesDisable Library ValidationThe second one is doing its job, because without it, Test 2 fails also.But the first one doesn't help in allowing me to modify DYLD_LIBRARY_PATH at runtime. If I set the environment variable before launching (Xcode > Product > Scheme > Edit Scheme > Arguments > Environment Variables) then Test 1 works. Is there a way to get dyld to honor changes to this environment variable made at runtime?
Replies
5
Boosts
0
Views
6.1k
Activity
Mar ’22
how do I notarize python module
Hello, I have a electron app. I want to notarize this app. But there is a problem about python module.In my case, some user will use it offline, so I need prepare common python modules for them.When I try to notarize app, Apple will return failed, and logs tell to me that python module (.so files) does not cotains a valid signature or a secure timestamp signature. What can I do to make app notarized with python module?Can I let apple ignore these python module in app or Is there a way to signature these python modules ?
Replies
8
Boosts
0
Views
2.5k
Activity
Mar ’22
how to delete a 'ghost' signing certificate (Xcode 13.2.1)
In my keychain, I have one Developer ID Application certificate, with a private key, for my Team. In Xcode's Accounts/Manage Certificates dialog, there are three Developer ID Application certificates, two of which have a red 'x' badge and the status 'missing private key'. I can right click on any of those three entries and my only enabled choice is "Export". Email creator or Delete are disabled. Why? In my Team's account, there are indeed three Developer ID Application certificates, with different expiration dates, but I only have the private key for one of them. By choosing Manual signing, I can choose a specific certificate from my keychain, but Xcode 13.2.1 tells me that this certificate is missing its private key - but I can see that private key in my keychain!
Replies
1
Boosts
0
Views
1.7k
Activity
Mar ’22
Can I update a resouce in a signed app and then just resign the updated resource?
Hi,I have an automated build process that produces custom apps for different customers. The only thing that is customized is a resource in the app.I would like to be able to just code sign the entire app once and then for each customer just update and code sign the resource.After doing the initial code signing of the app "codesign -vvv --deep --strict myapp.app" shows that everything is OK.I then replace myapp.app//Contents/Resources/CustomFile with a new one and code sign it:codesign -f -s "Developer ID Application: MY Company" --options runtime --keychain "Buildsystem" "myapp.app/Contents/Resources/CustomFile"But then "codesign -vvv --deep --strict myapp.app" shows there is a problem:myapp.app: a sealed resource is missing or invalidfile modified: myapp.app/Contents/Resources/CustomFileCan anybody explain why this doesn't work?My work around is to always update the resource in an unsigned app and then code sign the entire thing.
Replies
7
Boosts
0
Views
5k
Activity
Mar ’22
Monteray can’t be opened because Apple cannot check it for malicious software?
Hi, I'm responsible for generating the macOS installer for Apache NetBeans. Up until today I've not had any issues, the DMG created has never had any issues being used on others machines. The process we have signs and notarizes the app, as expected. However when downloading this from the internet at attempting to install the app, users are reporting that it cannot be opened because it cannot be checked by Apple for malicious software. Heres a link to the app: https://dist.apache.org/repos/dist/dev/netbeans/netbeans-installers/13/Apache-NetBeans-13-bin-macosx.dmg If I try to open this myself(after downloading), I can see 2 messages in Console: 1: assessment denied for Apache-NetBeans-13-bin-macosx.dmg com.apple.message.domain: com.apple.security.assessment.outcome2 com.apple.message.signature2: bundle:UNBUNDLED com.apple.message.signature: denied:no usable signature com.apple.message.signature3: Apache-NetBeans-13-bin-macosx.dmg com.apple.message.signature5: UNKNOWN com.apple.message.signature4: 3 SenderMachUUID: 8702454A-423C-33A4-BDAA-656186E59614 2: assessment denied for Apache NetBeans 13.pkg com.apple.message.domain: com.apple.security.assessment.outcome2 com.apple.message.signature2: bundle:UNBUNDLED com.apple.message.signature3: Apache NetBeans 13.pkg com.apple.message.signature5: UNKNOWN com.apple.message.signature4: 2 com.apple.message.signature: denied:Unnotarized Developer ID SenderMachUUID: 8702454A-423C-33A4-BDAA-656186E59614 I'm struggling to work out how to further diagnose this, to allow us to release this application? The notarization of this app comes back as "Package Approved", so I don't get that reference in those messages. Any help or advice on how to continue with this?
Replies
11
Boosts
0
Views
3.2k
Activity
Mar ’22
Signing a Mac Product For Distribution
IMPORTANT This post has been replaced by two shiny new posts: Creating Distribution-Signed Code for Mac Packaging Mac Software for Distribution See the preamble in Creating Distribution-Signed Code for Mac for more context. I’ve left the original post here just for the record. Share and Enjoy — Quinn “The Eskimo!” Apple Developer Relations, Developer Technical Support, Core OS/Hardware let myEmail = "eskimo" + "1" + "@" + "apple.com" I spend a lot of time helping Mac developers with notarisation and Gatekeeper problems, and many of these problems are caused by incorrect code signing. The instructions for how to sign and package a Mac product for distribution are rather scattered, so I’ve written them all down in one place. And rather than keep that to myself, I’m posting it here for everyone’s benefit. If you have any corrections, feel free to get in touch with me directly (my email address is in my signature). And if have any questions about this, it’s probably best to ask them here on DevForums. I’ve locked this thread, so just start a new thread tagging it with Code Signing, Notarization, or Gatekeeper. Or, if you want one-on-one help, open a DTS tech support incident and we can pick things up in that context. IMPORTANT None of the following has been formally reviewed, so it’s not official Apple documentation. Signing a Mac Product For Distribution The best way to sign and package an app is via Xcode: Build a version of your app to distribute using Xcode’s Product > Archive command, and then package that archive for your distribution channel via the Organizer. See Xcode Help > Distribute your app for the details. However, not all Mac products can be distributed this way. For example: An app that’s distributed outside of the Mac App Store on a disk image A product that has to be installed via an installer package An app that uses a third-party development environment In these cases you must manually sign and package your product. Note If you find this post a little abstract, and would prefer to follow a concrete example, see Manual Code Signing Example. Consult Resources for Third-Party Development Environments Many third-party development environments have their own strategies for signing and packaging the products they build. If you’re using a third-party development environment, consult its support resources for advice before continuing. Decide on a Container Format To get started, decide on your container format. Mac products support two distribution channels: An app can be distributed via the Mac App Store Apps and non-apps can be distributed outside of the Mac App Store using Developer ID signing A Mac App Store app must be submitted as an installer package. In contrast, products distributed outside of the Mac App Store can use a variety of different container formats, the most common being: Zip archive (.zip) Disk image (.dmg) Installer package (.pkg) It’s also possible to nest these. For example, you might have an app inside an installer package on a disk image. Each container format has its own pros and cons, so pick an approach based on the requirements of your product. However, this choice affects how you package your product, something discussed in more detail below. Structure Your Code Correctly All code that you distribute must be signed. There’s two parts to this: Structuring your code to support signing Actually signing it You must structure your code correctly. If you don’t, it may be hard (or in some cases impossible) to sign it. First things first, identify all the code in your product. There are many types of code, including apps, app extensions, frameworks, other bundled code (like XPC Services), shared libraries, and command-line tools. Each type of code has two key attributes Is it bundled code? (apps, app extensions, frameworks, other bundled code) Is it a main executable? (apps, app extensions, command-line tools) Both of these attributes affect how you sign the code. In addition, whether the code is bundled is critical to how you structure it. Specifically, bundled code supports the notion of nested code. For example, you might have an app extension nested within your app’s bundle. When dealing with nested code, follow these rules: Place any nested code in the appropriate nested code location. For more on that, see Placing Content in a Bundle. Do not place non-code items in a nested code location. Rather, place these in the bundle’s resources directory (typically Contents/Resources). IMPORTANT Scripts are not considered code. If you have scripts — shell, Python, AppleScript, or whatever — place them in the resources directory. These will still be signed, but as a resource rather than as code. Provisioning Profile If you have a main executable that uses a restricted entitlement, one that must be allowlisted by a provisioning profile, place the profile in your bundle at the path Contents/embedded.provisionprofile. The profile is sealed by the code signature, so do this before signing the code. If your product contains multiple executables that need a profile — for example, you have an app with an embedded Network Extension app extension, both of which need the Network Extensions entitlement — repeat this process for each of these code executables. If your product includes a non-bundled executable that uses a restricted entitlement, you must package that executable in an app-like structure. For the details, see Signing a Daemon with a Restricted Entitlement. Handling Alien Code Structures If you’re using a complex third-party library, you may find that the structure required by the library does not match up with the structure required by macOS. For an in-depth discussion of the techniques you can use to resolve this, see Embedding Nonstandard Code Structures in a Bundle. Sign Your Code Sign code using the codesign tool. Read the following sections to learn about the specific arguments to use, but also keep these general rules in mind: Do not use the --deep argument. This feature is helpful in some specific circumstances but it will cause problems when signing a complex program. For a detailed explanation as to why, see --deep Considered Harmful. Rather, sign each code item separately. For a complex app, you should create a script to do this. Sign from the inside out. That is, if A depends on B, sign B before you sign A. When you sign A, the code signature encodes information about B, and changing B after the fact can break the seal on that code signature. Basic Signing No matter what sort of code you’re signing, the basic codesign command looks like this: % codesign -s III /path/to/your/code` where III is the name of the code signing identity to use. The specific identity varies depending on your target platform. See the following sections for details. When signing bundled code (as defined in Structure Your Code Correctly) pass in the path to the bundle, not the path to the code. If you’re re-signing code — that is, the code you’re signing is already signed — pass the -f option. If you’re signing a main executable (as defined in Structure Your Code Correctly) that needs entitlements, add --entitlements EEE.entitlements, where EEE.entitlements is a path to a property list file that contains your entitlements. IMPORTANT The entitlements property list file must be in the standard XML format with LF line endings, no comments, and no BOM. If you’re not sure of the file’s provenance, use plutil to convert it to the standard format. See Ensure Properly Formatted Entitlements in Resolving Common Notarization Issues. If you’re signing non-bundled code, set the code signing identifier by adding -i BBB, where BBB is the bundle ID the code would have if it had a bundle ID. For example, if you have an app whose bundle ID is com.example.flying-animals that has a nested command-line tool called pig-jato, the bundle ID for that tool would logically be com.example.flying-animals.pig-jato, and that’s a perfectly fine value to use for BBB. Note For bundled code, you don’t need to supply a code signing identifier because codesign defaults to using the bundle ID. Mac App Store Signing If you’re distributing via the Mac App Store, use your Mac App Distribution signing identity in place of III in the example above. This will typically be named 3rd Party Mac Developer Application: TTT, where TTT identifies your team. You can also use an Apple Distribution signing identity, with the name Apple Distribution: TTT. Developer ID Signing If you’re distributing outside of the Mac App Store, use your Developer ID Application signing identity in place of III in the example above. This will typically be named Developer ID Application: TTT, where TTT identifies your team. All Developer ID signed code needs a secure timestamp; enable this by adding the --timestamp option. If you’re signing a main executable (as defined in Structure Your Code Correctly), enable the hardened runtime by adding -o runtime option. The hardened runtime enables additional security checks within your process. You may need to make minor code changes to be compatible with those additional security checks. For some specific examples, watch WWDC 2019 Session 703 All About Notarization. Failing that, you can opt out of these additional security checks using entitlements. See Hardened Runtime Entitlements Build Your Container Once you’ve signed the code in your product, it’s time to wrap it in a container for distribution. Follow the advice appropriate for your chosen container format in the following sections. If you’re using a nested container format — for example, an app inside an installer package on a disk image — work from the inside out, following the advice for each level of nesting. Build a Zip Archive Use the ditto tool to create a zip archive for your product: Create a directory that holds everything you want to distribute. Run the ditto as shown below, where DDD is the path to the directory from step 1 and ZZZ is the path where ditto creates the zip archive. % ditto -c -k --keepParent DDD ZZZ Zip archives cannot be signed (although their contents can be). Build an Installer Package Use the productbuild tool to create a simple installer package for a single app: % productbuild --sign III --component AAA /Applications PPP In this example: III is either your Mac Installer Distribution or Developer ID Installer signing identity, depending on your distribution channel. This will typically be named 3rd Party Mac Developer Installer: TTT or Developer ID Installer: TTT, where TTT identifies your team. AAA is the path to your app. PPP is the path where productbuild creates the installer package. IMPORTANT The above is the simplest possible example. There are many different ways to create installer packages. See the man pages for productbuild, productsign, pkgbuild, and pkgutil for more details. Build a Disk Image Use the hdiutil tool to create a disk image for distribution: Create a directory to act as the source for the root directory of your disk image’s volume. Populate that directory with the items you want to distribute. Use hdiutil command shown below to create the disk image, where SSS is the directory from step 1 and DDD is the path where hdiutil creates the disk image. Use codesign command shown below to sign the disk image, where III is your Developer ID Application signing identity (typically named Developer ID Application: TTT, where TTT identifies your team), BBB is a pseudo bundle ID as discussed in Basic Signing, and DDD is the path to the disk image from step 3. % hdiutil create -srcFolder SSS -o DDD % codesign -s III --timestamp -i BBB DDD IMPORTANT There are various third-party tools that can help you create a disk image in exactly the right way. For example, the tool might arrange the icons nicely, set a background image, and add a symlink to /Applications. If you use such a tool, or create your own tool for this, make sure that the resulting disk image: Is signed with your Developer ID Application signing identity Is a UDIF-format read-only zip-compressed disk image (type UDZO) Notarisation If you’re distributing outside of the Mac App Store, you must notarise the file you intend to distribute to your users. For instructions on doing this, see Customizing the Notarization Workflow. Skip the Export a Package for Notarization section because you already have the file that you want to submit. If you’re using a nested container format, only notarise the outermost container. For example, if you have an app inside an installer package on a disk image, sign the app, sign the installer package, and sign the disk image, but only notarise the disk image. The exception to this rule is if you have a custom third-party installer. In that case, see the discussion in Customizing the Notarization Workflow. Stapler Once you have notarised your product, you should staple the resulting ticket to the file you intend to distribute. Customizing the Notarization Workflow discusses how to do this for a zip archive. The other common container formats (installer package and disk image) support stapling directly. For example: % xcrun stapler staple FlyingAnimals.dmg Note Stapling is recommended but not mandatory. If you don’t staple, a user may have problems if they try to install or run your app for the first time when the Mac is offline. Change history: 20 Jan 2020 — First version. 27 Jan 2020 — Minor editorial changes. 9 Mar 2020 — Moved the details of --deep into a separate post, --deep Considered Harmful. 10 Mar 2020 — Fixed a typo. 30 Mar 2020 — Added a link to Manual Code Signing Example. 26 Feb 2021 — Fixed the formatting. Add a discussion of the entitlements file format. Minor editorial changes. 1 Mar 2021 — Added the Provisioning Profile section. 21 Oct 2021 — Updated the Structure Your Code Correctly section to reference Placing Content in a Bundle. 22 Dec 2021 — Replaced links to two DevForums posts with links to the official documentation, namely those for Signing a Daemon with a Restricted Entitlement and Embedding Nonstandard Code Structures in a Bundle. Made some other editorial changes.
Replies
0
Boosts
0
Views
32k
Activity
Mar ’22
Library validation and CoreMedia I/O plug-ins
Hi!The problem I want to discuss is not new, but it is becoming more and more critical for the project I'm working on. So I have to rise it again.Our project is a virtual webcam for macOS implemented as a CoreMedia I/O DAL plug-in. Plug-in is installed at /Library/CoreMediaIO/Plug-Ins/DAL and can be loaded into any client application that wants to use the webcam.The problem appeared when Apple introduced 'Hardened Runtime' in macOS Mojave which by default turns on 'Library Validation' feature. Library validation disables loading for frameworks/plugins/libraries which are either: 1) not signed; 2) signed but 'Team Identifier' in signing certificate is different than certificate of a client application signature. As a result, even though our plugin is properly signed and notarized, it can't be loaded into client application with hardened runtime because of that 2nd case.First alarming incident was last year when Google Chrome on macOS enabled hardened runtime, and stopped showing our webcam in the list. I requested a technical support (case ID for TSI: 718328224), then made a feedback to Apple (FB7071665) about any possible solutions for our case, at least in the future versions of macOS. But I see there's still no reaction there.Now things are getting worse. Skype and Zoom stopped support our webcam for the same reason. Some others announced they will do this too. There's a possibility to add 'com.apple.security.cs.disable-library-validation' entitlement to the client application - that would help with our issue. But Zoom and Skype refuse to add this because of security reasons - after some security exploits were uncovered.The situation is quite critical for our product as many users use our webcam only for Zoom, Skype and similar applications.So, the question is: are there any possible workarounds for our case? I know that for audio plugins (VST, etc.) there's a special entitlement: 'com.apple.security.temporary-exception.audio-unit-host' that allows loading even unsigned plugins into hosting application. Why there's no such entitlement for DAL plugins? Or will it appear in macOS 10.16? I think it would be reasonable to add an entitlement that would only reject loading of unsigned plugins, but would allow loading of plugins with different 'Team ID' in signing certificate.
Replies
19
Boosts
0
Views
9.4k
Activity
Feb ’22
How to app distribution for Mac
I'm developing an app for mac, and I'm a complete novice I've never done in my life. There are a total of 2 targets via extension, one of which contains endpoint-security. Anyway, I succeeded in setting up the provisioning file on the developing PC, building it, and running it. I also wanted to bundle all those apps via dmg and run them on different Macos. But here's the problem: When I run it on another PC, I get a notification being blocked by the gatekeeper. When I ran the following command through Google, rejected was confirmed, and I found out that this is the difference between notarization. command : spctl --assess --verbose=4 --type exec /Applications/My.app result : /Applications/My.app : rejected Afterwards I created Certificates -> Add -> Developer ID Applications certificate from Apple Developer site and registered it to my keychain. After doing Xcode's Product -> Archives -> Distribute App -> Developer ID -> Upload for notarization, I selected as follows. Distribution Certificate => Developer ID Applications App1: [Error] Profile doesn't include the selected signing certificate. [Error] Profile is not a "Developer ID" profile. App2: [Error] Profile doesn't include the selected signing certificate. [Error] Profile is not a "Developer ID" profile. An error occurred in the provisioning profile, and when you use the provisioning used for build, I confirmed that the error occurred because the Type was Development. [Where you need help] So I chose Developer ID from Create Profile on Apple developer site to create a new provisioning profile for Developer ID Applications. But it says no certificate here. Also, Distribution has the following items, and no matter which one I select, I could not create a provisioning file using the Developer ID Applications certificate created above. [Distribution List] ad hoc Create a distribution provisioning profile to install your app on a limited number of registered devices. tvOS Ad Hoc Create a distribution provisioning profile to install your app on a limited number of registered tvOS devices. Developer ID Create a Developer ID provisioning profile to use Apple services with your Developer ID signed applications. In House To sign iOS apps for In House Distribution, you need a Certificate. tvOS In House To sign tvOS apps for In House Distribution, you need a Certificate. I would like to create a provisioning file for notarization, can you tell me in detail where to create it?
Replies
8
Boosts
0
Views
3.4k
Activity
Feb ’22
How do I re-sign a .pkg installer file?
My Developer ID Installer is expiring soon, according to this page I must re-sign all my existing installers or else no one can use them anymore. How do I do this? Can I strip away or replace the signature somehow? What I've tried so far: I have removed the old certificate from my keychain and added a new one. It has the same ID and everything as the old certificate, but a new expiry date. I've tried running productsign which looks like it's replacing the signature alright but when I inspect the new installer it still has the old certificate expiry date. Command used: productsign --sign MYSIGNID oldSignedInstaller.pkg newSignedInstaller.pkg
Replies
2
Boosts
0
Views
3.3k
Activity
Feb ’22
Question about creating certificates
Hello, I read on the Apple Support page that for iOS Distribution certificates, when they expire, "Users will no longer be able to run apps that have been signed with this certificate. You must distribute a new version of your app that is signed with a new certificate." We have 2 certificates that will be expiring soon, a Distribution certificate and an iOS Distribution certificate. I think this app is on the App store. I understand that some certificates can expire without having an affect on the apps; they just need to be updated in order to put a new version out there. I am trying to figure out if ours apply to that scenario or the one above where it will immediately affect installed apps. Any feedback on that? The Apple support person I talked to said I would have to create the certificates before the expiration date, and I have to coordinate that with the release of an updated version of the app. So I believe I need to coordinate with the developer and create the certificate when he uploads a new version of the app. Also, he told me that the iOS Distribution certificates and the Distribution certificates are created in different ways. I found this about creating iOS Distribution certificates: https://support.staffbase.com/hc/en-us/articles/115003458931-Creating-the-iOS-Distribution-Certificate Can all these steps be done ahead of time and I could send the certificate file to the developer? Is there a URL that shows the different way to create Distribution certificates? Thank you. Any answers to these questions would be very helpful.
Replies
4
Boosts
0
Views
2.5k
Activity
Jan ’22
What is the purpose of Apple Development and Apple Distribution certificates for macOS?
What is the purpose of Apple Development and Apple Distribution certificates for macOS application?It is quite new types of certificates in addition to existing iOS/Mac Development/Distribution.According to the documentation https://help.apple.com/xcode/mac/current/#/dev154b28f09?sub=dev23755c6c6Apple Development — For macOS apps, use app services during development and testing.Apple Distribution — For macOS apps, sign an app before distributing it through the Mac App Store.What does it mean sign an app before distributing because for distributing it through the Mac App Store I have to use Mac App Distribution (the name is `3rd Party Mac Developer Application`) and Mac Installer Distribution (the name is `3rd Party Mac Developer Installer`).
Replies
3
Boosts
0
Views
9.4k
Activity
Jan ’22