Thanks for the clarification about Developer ID vs Apple Development and for the links.
Per your advice, I’ve switched both the host app and the DNS Proxy system extension to Apple Development signing and the legacy dns-proxy entitlement.
Current setup
macOS: 15.7.3 (24G419)
Xcode: 26.2 (17C52)
Host app bundle ID: com.example.agent.MyMacProxy
DNS Proxy system extension bundle ID: com.example.agent.MyMacProxy.dnsProxy
System extension entitlements:
<key>com.apple.developer.networking.networkextension</key>
<array>
<string>dns-proxy</string>
</array>
System extension Info.plist (built .systemextension inside the host app):
<key>NSExtension</key>
<dict>
<key>NSExtensionPointIdentifier</key>
<string>com.apple.system_extension.network_extension</string>
<key>NSExtensionPrincipalClass</key>
<string>MyMacProxy.DNSProxyProvider</string>
</dict>
There is no NetworkExtension key in this Info.plist (confirmed with plutil -p on the built .systemextension in both DerivedData and /Applications).
The system extension is embedded at:
MyMacProxy.app/Contents/Library/SystemExtensions/com.example.agent.MyMacProxy.dnsProxy.systemextension
The host app (from /Applications) configures the DNS Proxy via NEDNSProxyManager with:
providerBundleIdentifier = "com.example.agent.MyMacProxy.dnsProxy"
What happens
If I add a NetworkExtension dictionary with NEProviderClasses and try different keys like:
<key>NetworkExtension</key>
<dict>
<key>dns-proxy</key>
<array>
<string>MyMacProxy.DNSProxyProvider</string>
</array>
</dict>
(or DNSProxy, or NEDNSProxy as the key),
I consistently get Code=4 errors, for example:
Validating system extension com.example.agent.MyMacProxy.dnsProxy
System Extension validation failed:
Error Domain=NetworkExtensionErrorDomain Code=4
"The system extension com.example.agent.MyMacProxy.dnsProxy has an invalid extension point in its NetworkExtension key in its Info.plist: dns-proxy."
If I then remove the NetworkExtension dictionary entirely (leaving only the NSExtension dictionary shown above), the Code=4 error goes away, but nesessionmanager still reports Code=2 about NetworkExtension needing to be a non‑empty dictionary, even though that key is no longer present in the current Info.plist.
To try to reset state, I’ve done the following:
Remove standalone product, keep only embedded systemextension
(reconfigured build to only embed)
systemextensionsctl uninstall <TEAM_ID> com.example.agent.MyMacProxy.dnsProxy
systemextensionsctl reset
killall nesessionmanager
killall systemextensionsd
Reboot and reinstall host app into /Applications
The behaviour does not change: either Code=4 if NetworkExtension is present, or Code=2 complaining about NetworkExtension even when it’s not in the current plist.
Questions
For a DNS Proxy implemented as a Network Extension system extension under Apple Development signing, is the intended pattern to have no NetworkExtension dictionary at all (only NSExtensionPointIdentifier = com.apple.system_extension.network_extension plus the dns-proxy entitlement), or should DNS Proxy system extensions still declare a NetworkExtension dictionary with NEProviderClasses?
If a NetworkExtension dictionary is required, what are the currently valid keys for a DNS Proxy system extension?
dns-proxy, DNSProxy, and NEDNSProxy all trigger NetworkExtensionErrorDomain Code=4 with “invalid extension point” in my tests.
Do you have a minimal, known‑good DNS Proxy system extension sample (Info.plist + entitlements) that passes this validation on current macOS (15.7.3 / Xcode 26.2)? A small reference example would be extremely helpful to compare against my configuration.
Share and Enjoy, and thanks again for your time!