Mutual TLS authentication using PIV card fails to send the entire client cert chain

My organization is using mutual TLS authentication for HTTPS, with PIV cards storing the certs. We observe that some OS X devices send only the leaf certs when establishing the mTLS connection, whereas others send the entire chain. We cannot validate the leaf cert without the intermediate cert, so those clients are rejected.

What drives the decision whether to send the whole chain, vs the leaf cert only?

For more details, and some things we observed.

The PIV cards are US DoD CAC cards: https://www.cac.mil/common-access-card/ The client cert chain on the card looks like this:

  1. Leaf client cert, CN=LastName.Name
  2. Intermediate cert, CN=DOD ID CA-70
  3. "Root" cert, CN=DoD Root CA 6
  4. through 8.: Additional interoperability certs.

Our system is set up to trust the "root" cert CN=DoD Root CA 6.

Neither the leaf cert, nor other certs in the chain are trusted by Apple Keychain Trust Store by default.

We find that most laptops will send the entire chain, 1 through 8, when establishing the mTLS connection with our servers. This allows us to validate them correctly.

On a subset of OS X devices, Google Chrome will only send the leaf chain. This happens even when we use exact same PIV card, and exact same PIV reader as on working laptops. Safari will not send any cert at all.

We found that if we explicitly add the CN=DoD Root CA 6 to the Apple Trust Store, Google Chrome and Safari will start sending a short chain, containing only certs 1 through 3. This allows the server to validate them. When we remove it from Trust Store, Chrome is back to sending only leaf, but Safari will not even send the leaf.

Again, this only happens on some laptops; on most of the laptops, both Safari and Google Chrome will send the entire chain, regardless of whatever is set up in Trust Store.

My suspicion is that for some reason, on those laptops, Safari will not send the client certs that OS X doesn't trust. This makes sense, but this is not the behavior we want. We want the same behavior on the working laptops, which is to send the whole chain.

All of our laptops are on OS X 14.4