Using ACME certificates for TLS client authentication on macOS

Hello,

I'm trying to use a certificate provisioned through the com.apple.security.acme payload for TLS client authentication in Safari on macOS.

Provisioning the certificate via ACME using the device-attest-01 challenge is working fine and the signed certificate includes the Extended Key Usage: TLS Web Client Authentication.

Unfortunately on macOS in Safari I can't find a way to choose this identity when a server requests client authentication.

Using the same method works flawlessly on iOS. If a server requests client authentication Safari prompts the option to use the certificate and the connection to the web server succeeds as intended.

On macOS I have tried adding a com.apple.security.identitypreference payload to the profile, linking the certificate from the ACME payload to the domain name of a web server that requires client authentication, but that did not change the behavior in any way.

The following payload is used to request the certificate on both my MacBook and iPhone:


<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>PayloadDisplayName</key>
    <string>ACME Certificate Request</string>

    <key>PayloadIdentifier</key>
    <string>com.example.net.acmeprofile</string>

    <key>PayloadType</key>
    <string>Configuration</string>

    <key>PayloadUUID</key>
    <string>UUID-1111-1111-1111-111111111111</string>

    <key>PayloadVersion</key>
    <integer>1</integer>
    
    <key>PayloadContent</key>
    <array>
        <dict>
            <key>PayloadType</key>
            <string>com.apple.security.acme</string>

            <key>PayloadIdentifier</key>
            <string>com.example.net.acme</string>

            <key>PayloadUUID</key>
            <string>UUID-2222-2222-2222-222222222222</string>

            <key>PayloadVersion</key>
            <integer>1</integer>

            <key>DirectoryURL</key>
            <string>https://acme.example.net/acme/apple-acme/directory</string>

            <key>ClientIdentifier</key>
            <string>XXXXXXXXX</string>

            <key>KeyType</key>
            <string>ECSECPrimeRandom</string>

            <key>KeySize</key>
            <integer>256</integer>

            <key>UsageFlags</key>
            <integer>1</integer>

            <key>ExtendedKeyUsage</key>
            <array>
                <string>1.3.6.1.5.5.7.3.2</string>
            </array>

            <key>HardwareBound</key>
            <true/>
            
            <key>Attest</key>
            <true/>

            <key>AllowAllAppsAccess</key>
            <true/>

            <key>Subject</key>
            <array>
                <array>
                    <array>
                        <string>CN</string>
                        <string>XXXXXXXXX</string>
                    </array>
                </array>
            </array>
        </dict>
    </array>
</dict>
</plist>

And this is the identity payload I have added to the profile on macOS:

<key>PayloadType</key>
<string>com.apple.security.identitypreference</string>
 
<key>PayloadIdentifier</key>
<string>com.example.net.identitypreference</string>

<key>PayloadUUID</key>
<string>UUID-3333-3333-3333-3333333333333333</string>

<key>PayloadVersion</key>
<integer>1</integer>

<key>Name</key>
<string>mtls-endpoint.example.net</string>

<key>PayloadCertificateUUID</key>
<string>UUID-2222-2222-2222-222222222222</string>

Neither device is managed by an MDM service and they run macOS 26.6.1 and iOS 26.6 respectively.

Is there any additional configuration required on macOS to make an ACME-provisioned certificate available for client authentication in Safari?

Or is this simply the expected behavior, and client authentication requires a traditional certificate-key pair in the macOS Keychain?

Any help would be greatly appreciated!

Hello @nimeut,

I'm having exactly the same problem as you on macOS (unable to select the certificate), but on iOS, the certificate can be selected when the page loads. However, in macOS settings, the certificate generated by ACME is definitely there (System Settings > General > Profiles > [NAME] > ACME Certificate).

In the WWDC 22' video, it's stated that mTLS can be used with Safari.

I’ve tried several methods for the IdentityPreference, but none of them work (with/without protocol, with/without port, etc.). In my opinion, the documentation is far too incomplete, and the use cases are too limited (no third-party apps like Chrome on macOS, even with AllowAllAppsAccess, etc.), so I think I’ll switch to SCEP.

I find it unfortunate that Apple hasn’t made any progress on this topic since 2022, even though SCEP has been deprecated in the documentation for some time now.

Using ACME certificates for TLS client authentication on macOS
 
 
Q