Skip to content

Client certificate not sent during TLS handshake when Client Authentication EKU is missing (Certificate Authorities change 2026) #121982

@YurivanRuler

Description

@YurivanRuler

Description

Starting October 1, 2025, DigiCert (and other Certificate Authorities as well) will no longer include the Client Authentication EKU by default in public TLS certificates (DigiCert announcement). Certificates will be issued with Server Authentication EKU only unless ClientAuth EKU is explicitly requested during enrollment. This change aligns with industry-wide plans to phase out ClientAuth EKU from public TLS certificates.
In .NET (System.Net.Http → System.Net.Security), the CertificateHelper logic validates client certificates based on EKU and KeyUsage, relevant code located in CertificateHelper.

Because of this logic, certificates without Client Authentication EKU are considered invalid and are not sent during the TLS handshake. This surfaced in our environment when establishing a TLS connection: the client certificate was never presented, causing mTLS authentication to fail. A discussion about this topic from 2023 is closed GitHub issue 94152

Expected Behavior

I am not an expert in authentication, but based on my understanding and recent industry developments, I believe the current logic may not align with upcoming changes from major certificate authorities. To avoid future disruptions and ensure compatibility, it would be valuable to review and adapt this implementation to reflect these market trends.

.NET should possibly allow the certificate to be sent even if Client Authentication EKU is missing. This would prevent disruptions after DigiCert and other CAs remove Client Authentication EKU from public TLS certificates.

Actual Behavior

CertificateHelper.IsValidClientCertificate rejects certificates missing Client Authentication EKU.
As a result, the certificate is not offered during the handshake, and servers return 403 or similar errors in mTLS scenarios.

Impact

Organizations using public TLS certificates for mTLS will face production outages starting October 2025 when ClientAuth EKU is no longer included by default.
The risk increases by May 2026, when adding ClientAuth EKU may no longer be allowed at all.

Steps to Reproduce

  • Use a public TLS certificate with ServerAuth EKU only.
  • Configure HttpClientHandler with the certificate httpClientHandler.ClientCertificates.Add(certificate)
  • Connect to a server requiring client certificate authentication (mTLS).
  • Observe that the certificate is not sent and the server rejects the connection.

Workarounds

  • Explicitly request ClientAuth EKU during certificate enrollment (temporary solution).
  • Configure the certificate on the SocketsHttpHandler directly, example:
    .ConfigurePrimaryHttpMessageHandler(() => { var socketsHttpHandler = new SocketsHttpHandler(); var x509CertificateCollection = new X509CertificateCollection { X509CertificateLoader.LoadPkcs12(myCertificateBytes, password: null) }; socketsHttpHandler.SslOptions.ClientCertificates = x509CertificateCollection; return socketsHttpHandler; });

Proposed Fix / Discussion

  • Relax EKU validation: Allow certificates without Client Authentication EKU.

References

DigiCert announcement
Earlier discussed issue
CertificateHelper

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions