.NET: Microsoft Technologies based on the .NET software framework. Runtime: An environment required to run apps that aren't compiled to machine language.
The available public contracts do not establish that these three null values guarantee that no client certificate is presented, nor do they establish that Schannel will automatically select one; a security guarantee requires version-pinned .NET 10 implementation evidence that is not present in the cited material.
What is established
-
SocketsHttpHandler.SslOptionsis anSslClientAuthenticationOptionsinstance containing the client TLS settings.^1^ -
SslClientAuthenticationOptionsis the property bag used bySslStreamclient authentication, and its documentation explicitly identifiesSocketsHttpHandleras a consumer.^2^ -
ClientCertificatesis nullable and identifies certificates “to be considered” for client authentication. The contract does not define whethernulland an empty collection produce different Windows credentials.^3^ - The documented certificate-supply mechanisms are
ClientCertificates,LocalCertificateSelectionCallback, andClientCertificateContext; the latter has been available since .NET 8.^4^ - A selection callback chooses a local certificate and has a nullable return type. Its API contract does not say that returning
nullprohibits subsequent runtime or provider selection.^5^
Consequently, neither of these equivalences is documented for .NET 10:
ClientCertificates == null ≡ ClientCertificates.Count == 0
callback == null ≡ callback present and returning null
The older .NET Framework selection documentation says that an empty associated collection results in anonymous credentials, but it is explicitly a .NET Framework selection model—not a versioned .NET 10 SocketsHttpHandler/SslStream contract—so it cannot close this question.^6^
Automatic selection and Windows fallback
HttpClientHandler.ClientCertificateOptions = Automatic is a documented store-selection mode, while its default is Manual.^7^ That mode does not directly answer the proposed case because it uses an exclusive SocketsHttpHandler, not HttpClientHandler, and no corresponding automatic-selection option is established here.
Schannel supports credentials supplied by the caller or preexisting credentials, and a client authentication certificate is optional unless requested by the server.^8^^9^ Those statements alone do not prove that .NET 10 requests automatic store selection when the three managed inputs are null. The missing evidence is:
- The exact .NET 10 servicing tag or commit.
- The
SocketsHttpHandlerHTTPS connection path intoSslStream. - Certificate-selection handling for all three absent inputs.
- The
SCH_CREDENTIALS/SCHANNEL_CREDfields and flags passed toAcquireCredentialsHandle. - Whether those flags permit provider/store selection after no managed certificate was selected.
- Separate handling, if any, for TLS 1.2 and TLS 1.3.
Without that chain, no concrete fallback condition—or suppression guarantee—can be stated safely.
Version and platform scope
No exact .NET 10 servicing build can be named from these materials. .NET servicing updates are cumulative in support terms, and only the current servicing update remains supported after the next one ships; this does not prove invariant certificate-selection behavior across all 10.0 patches.^10^
On Windows, .NET TLS behavior is mediated through OS cryptographic APIs such as Schannel.^11^ TLS 1.2 support depends on the Windows version and configuration. Schannel TLS 1.3 is supported only beginning with Windows 11 and Windows Server 2022; enabling it on earlier Windows versions is not supported.^12^
How to validate the proposed deployment
Treat this as an implementation-validation requirement rather than relying on the null settings as a contractual prohibition:
- Record the exact runtime using
dotnet --infoand the Windows build. - Test against a server that sends
CertificateRequest, separately under TLS 1.2 and—on Windows 11/Server 2022 or later—TLS 1.3. - Capture the handshake with Wireshark or equivalent; Microsoft recommends wire inspection for determining which certificates were exchanged.^11^
- Verify that the client’s
Certificatemessage contains an empty certificate list rather than a certificate chain. For TLS 1.3, decrypting the handshake may be necessary to inspect messages afterServerHello. - Repeat with suitable certificates installed in each store relevant to the process identity. This tests presentation behavior; it does not prove that no store lookup occurred.
- Re-run the test for each .NET servicing update unless Microsoft publishes a contract guaranteeing this behavior.
A callback returning null may be included as defense-in-depth, but the cited .NET 10 delegate contract is insufficient to describe it as a guaranteed prohibition against all Schannel fallback.
References
- SocketsHttpHandler.SslOptions Property-Definition
- SslClientAuthenticationOptions Class-Definition
- SslClientAuthenticationOptions.ClientCertificates Property-Definition
- TLS/SSL best practices
- LocalCertificateSelectionCallback Delegate-Definition
- Certificate Selection and Validation
- HttpClientHandler.ClientCertificateOptions Property-Definition
- AcquireCredentialsHandle (Schannel) function
- Obtaining Schannel Credentials
- Releases and support for .NET
- Troubleshoot SslStream authentication issues
- Protocols in TLS/SSL (Schannel SSP)