Exchange ServerHow-to

TLS hardening on Exchange Server: TLS 1.2, TLS 1.3 and ciphers without breaking mail flow

What Exchange Server SE and 2019 support for TLS 1.2 and TLS 1.3, the Schannel and .NET settings Microsoft documents, and how to find partners still on TLS 1.0 before you switch it off.

Switching off old TLS versions on Exchange is mostly registry work, but the order matters: change one side only, or disable TLS 1.0 before you know who still uses it, and partner mail, scanners or older clients stop connecting. Here I'll cover what Exchange Server SE and 2019 support, including TLS 1.3, the Schannel and .NET settings Microsoft documents, and how to prove the result with Health Checker and the SMTP logs.

How this guide is organised: How it works → Step-by-step → Verify → Tips & gotchasFlow diagram of the article's sections in reading order: 1. How it works. 2. Step-by-step (6 steps: Take a baseline with Health Checker; Find out who still uses TLS 1.0 or 1.1; Make .NET inherit the Schannel settings; Enable TLS 1.2, then disable TLS 1.0 and 1.1; TLS 1.3: leave it on where it's supported; Cipher suites, hashes and curves). 3. Verify. 4. Tips & gotchas. Toolbox: Enable-TlsCipherSuite, Disable-TlsCipherSuite, Get-TlsCipherSuite, …\SCHANNEL\Protocols, SystemDefaultTlsVersions.1How it works2Step-by-step3Verify4Tips & gotchas1Take a baselinewith Health C…2Find out whostill uses TLS…3Make .NETinherit the Sc…4Enable TLS 1.2,then disable T…5TLS 1.3: leaveit on where it'…6Cipher suites,hashes and c…TOOLBOXEnable-TlsCipherSuiteDisable-TlsCipherSuiteGet-TlsCipherSuite…\SCHANNEL\ProtocolsSystemDefaultTlsVersionsHow this guide is organised: How it works → Step-by-step → Verify → Tips & gotchasFlow diagram of the article's sections in reading order: 1. How it works. 2. Step-by-step (6 steps: Take a baseline with Health Checker; Find out who still uses TLS 1.0 or 1.1; Make .NET inherit the Schannel settings; Enable TLS 1.2, then disable TLS 1.0 and 1.1; TLS 1.3: leave it on where it's supported; Cipher suites, hashes and curves). 3. Verify. 4. Tips & gotchas. Toolbox: Enable-TlsCipherSuite, Disable-TlsCipherSuite, Get-TlsCipherSuite, …\SCHANNEL\Protocols, SystemDefaultTlsVersions.1How it works2Step-by-step1Take a baseline with Health Checker2Find out who still uses TLS 1.0 or 1.13Make .NET inherit the Schannel settings4Enable TLS 1.2, then disable TLS 1.0 and 1.15TLS 1.3: leave it on where it's supported6Cipher suites, hashes and curves3Verify4Tips & gotchasTOOLBOXEnable-TlsCipherSuiteDisable-TlsCipherSuiteGet-TlsCipherSuite…\SCHANNEL\ProtocolsSystemDefaultTlsVersions
At a glance: how this guide is organised · 6 steps · 5 key settings and tools

How it works: what each version supports#

Exchange is both a TLS server and a TLS client (it connects to other mail servers, Exchange Online and other Exchange servers), so Schannel needs matching Client and Server keys for each protocol under HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols. Microsoft documents this support position:

ProtocolExchange Server SE / 2019Exchange 2016
TLS 1.0 and 1.1Supported; disabled by default on Exchange 2019Supported; Windows defaults apply
TLS 1.2Enabled by defaultSupported, not configured by default
TLS 1.3Exchange 2019 CU15 or later on Windows Server 2022/2025 (enabled by default); not on Windows Server 2019Not supported

Exchange Server SE continues the Exchange 2019 CU15 code base, so the same TLS 1.3 rule applies to it.

Note: TLS 1.3 support excludes SMTP, so mail flow still needs TLS 1.2. Microsoft states that a TLS 1.3-only configuration isn't supported yet and that SMTP support will follow in a future update. Re-check the page before you plan one.

The other half is .NET Framework. Exchange's .NET code follows Schannel only when SystemDefaultTlsVersions is 1, and SchUseStrongCrypto (outgoing connections only) blocks weak protocols. Exchange 2019 CU14 and later set both on new installations; upgraded servers may lack them.

Step-by-step#

1. Take a baseline with Health Checker#

Run the Exchange Health Checker on every server and keep the report. Its TLS check reads the client and server values for TLS 1.0 to 1.3, warns while TLS 1.0 or 1.1 is enabled, flags client/server mismatches and reports both .NET values. For its TLS 1.3 result, see the note in step 5.

2. Find out who still uses TLS 1.0 or 1.1#

Microsoft's pre-checks cover domain controllers, load balancers, clients, multi-function printers, partners and third-party applications. For SMTP, the protocol logs record each session's negotiated version: SP_PROT_TLS1_0_SERVER, SP_PROT_TLS1_1_SERVER or SP_PROT_TLS1_2_SERVER when Exchange receives, and the matching client value when it sends. With protocol logging enabled on your connectors, this groups the remote hosts that negotiated TLS 1.0 or 1.1 with the Front End Transport service:

PowerShell
$log = (Get-TransportService $env:COMPUTERNAME).ReceiveProtocolLogPath.PathName.Replace('Hub','FrontEnd')
Select-String -Path "$log\*.log" -Pattern 'TLS1_[01]' |
    ForEach-Object { ($_.Line -split ',')[5] -replace ':\d+$' } |
    Group-Object -NoElement | Sort-Object Count -Descending

Repeat against SendProtocolLogPath for outbound sessions. For HTTPS, use IIS custom logging fields or load balancer logs; POP and IMAP don't log the TLS version, so they need a network trace.

3. Make .NET inherit the Schannel settings#

PowerShell
foreach ($key in 'HKLM:\SOFTWARE\Microsoft\.NETFramework\v4.0.30319',
                 'HKLM:\SOFTWARE\Wow6432Node\Microsoft\.NETFramework\v4.0.30319') {
    Set-ItemProperty -Path $key -Name SystemDefaultTlsVersions -Value 1 -Type DWord
    Set-ItemProperty -Path $key -Name SchUseStrongCrypto -Value 1 -Type DWord
}

Exchange doesn't need the same values under the .NET 2.0 keys (v2.0.50727), but Microsoft recommends setting them identically for consistency.

4. Enable TLS 1.2, then disable TLS 1.0 and 1.1#

PowerShell
$base  = 'HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols'
$state = @{ 'TLS 1.0' = 0; 'TLS 1.1' = 0; 'TLS 1.2' = 1 }
foreach ($proto in $state.Keys) {
    New-Item -Path $base -Name $proto -ErrorAction SilentlyContinue | Out-Null
    foreach ($side in 'Client', 'Server') {
        New-Item -Path "$base\$proto" -Name $side -ErrorAction SilentlyContinue | Out-Null
        Set-ItemProperty -Path "$base\$proto\$side" -Name Enabled -Value $state[$proto] -Type DWord
        Set-ItemProperty -Path "$base\$proto\$side" -Name DisabledByDefault -Value (1 - $state[$proto]) -Type DWord
    }
}

It takes effect after a restart. Apply it to every Exchange server, Edge Transport included, one server at a time; for DAG members, use maintenance mode around the reboot.

5. TLS 1.3: leave it on where it's supported#

On Exchange 2019 CU15 or later and Exchange SE on Windows Server 2022 or 2025, TLS 1.3 is already enabled for HTTPS. Keep TLS 1.2 enabled alongside it for SMTP. If a hardening baseline switched TLS 1.3 off, Microsoft's page lists the TLS 1.3 Client and Server keys to restore, plus the TLS 1.3 cipher suites:

PowerShell
Enable-TlsCipherSuite -Name TLS_AES_256_GCM_SHA384 -Position 0
Enable-TlsCipherSuite -Name TLS_AES_128_GCM_SHA256 -Position 1

Note: Health Checker and Microsoft Learn disagree on TLS 1.3. Health Checker's TLS check page (CSS-Exchange) still says Exchange doesn't support TLS 1.3 and reports any setting other than disabled as an error; the Learn page supports it on Exchange 2019 CU15 or later and SE on Windows Server 2022/2025, except for SMTP. So read a TLS 1.3 error against the server's build and OS. On a supported combination, follow Learn: run the latest Health Checker, check that the TLS 1.3 Client and Server values match and TLS 1.2 is still enabled, and don't switch TLS 1.3 off just to clear the finding. On Windows Server 2019, Exchange 2016 or builds before CU15, the error is valid: disable TLS 1.3.

6. Cipher suites, hashes and curves#

Exchange 2019 and SE ship with a preconfigured cipher and hashing setup; Microsoft's cipher steps bring Exchange 2016 to the same set. Apply them as a separate change after TLS 1.0 and 1.1 are off, so you know which step upset a client. On Windows Server 2016, the recommended TLS 1.2 order is:

  1. TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384, TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
  2. TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384, TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256
  3. The CBC equivalents: TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384, TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256, TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256

The page also disables the RC4, DES, Triple DES, RC2 and NULL ciphers and the MD5 hash, prefers the NistP384 and NistP256 curves, and disables curve25519 (not available in FIPS mode). On Exchange 2016, also set AllowInsecureRenegoClients and AllowInsecureRenegoServers to 0 (renegotiation strict mode, on by default in Exchange 2019).

Watch out: If cipher suites come from Group Policy (Computer Configuration › Administrative Templates › Network › SSL Configuration Settings › SSL Cipher Suite Order), Enable-TlsCipherSuite and Disable-TlsCipherSuite can't change them. Change the policy instead, and make sure security baselines don't overwrite your Schannel keys.

Verify#

  • Health Checker shows no TLS warnings: TLS 1.0 and 1.1 off on both sides, no mismatch, and both .NET values set to 1. For a TLS 1.3 error, see step 5.
  • Get-TlsCipherSuite | Format-Table Name lists only the suites you expect.
  • For OWA, the Security panel in Microsoft Edge Developer Tools shows TLS 1.2, or TLS 1.3 on Windows Server 2022/2025.
  • Received headers show what each hop negotiated, for example (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384), except for authenticated client submission, where Microsoft notes the shown version isn't the client's.
  • The step 2 search finds no new TLS 1.0 or 1.1 sessions, and test mail to Exchange Online, partners and scan-to-email devices goes through.

Tips & gotchas#

  • Partners still on TLS 1.0. Once you disable it, their TLS handshake with you fails. Where TLS is required (RequireTLS on a connector, or a partner that enforces it), mail queues; where it's opportunistic, the sending server decides whether to retry without encryption. Contact them with the evidence from step 2 first.
  • Load balancers that bridge SSL negotiate TLS separately with clients and with Exchange; both legs need TLS 1.2.
  • Hybrid. Wrong TLS settings cause problems with Microsoft 365, so test the connectors afterwards; see Exchange hybrid mail flow: connectors and TLS.
  • Unsupported combinations: don't enable TLS 1.3 on Windows Server 2019, on Exchange 2016, or on Exchange 2019 builds before CU15.

References#

Revision history: Oct 2026 — updated for recent Microsoft changes and re-checked against Microsoft Learn: details confirmed.

Written and checked against current Microsoft Learn documentation. Test changes with a pilot group before rolling them out to everyone, and if an admin center path has moved since, search for the setting name instead.

Spotted a mistake, or did this fix work differently for you? Email me or message me on LinkedIn — corrections are credited in the article.

Written by

Omer Eltayeb

Intune Subject Matter Expert in Cairo, Egypt, former Microsoft Cloud Solutions Architect, Microsoft Certified Trainer and Microsoft Innovative Educator Expert (2024–26) and Microsoft Elevate Educator Expert (2026–27). I share practical, step-by-step guides, study plans, scripts and toolkits for Microsoft Intune, Configuration Manager, Microsoft Entra ID, Microsoft Defender, Exchange and Microsoft 365 with the community.

Microsoft Certified Trainer (MCT) 2026Microsoft Innovative Educator Expert 2025–2026Microsoft Elevate Educator Expert 2026–2027ISC2 Certified Information Systems Security Professional (CISSP)Microsoft 365 Certified: Enterprise Administrator Expert (MS-102)