Windows TLS hardening: Schannel, cipher suites and safe rollback
Harden IIS/Nginx TLS on Windows with TLS 1.2/1.3, deliberate cipher suites, a registry backup and client testing before disabling old protocols.
- Build
- 26100.33650
- Edition
- Standard / Datacenter
- Architecture
- x64
- Support
- Documentation (E1)
- Evidence
- E1Official documentation
- Verified
- 2026-10-29
- Page type
- Task
The short answer
Section titled “The short answer”Windows TLS is Schannel; IIS/HTTP.sys and many services use it. Harden deliberately:
- Inventory clients and protocols.
- Enable TLS 1.2/1.3; disable TLS 1.0/1.1 only after client testing.
- Remove known-weak cipher suites; prefer ECDHE + AES-GCM/ChaCha20.
- Back up the registry before changes.
- Test with
openssl s_clientand a real client matrix.
Do not paste a random “perfect TLS” registry file into production.
Check what is offered
Section titled “Check what is offered”Get-TlsCipherSuite | Select-Object Name,Protocolopenssl s_client -connect lab.example:443 -servername lab.example -tls1_2openssl s_client -connect lab.example:443 -servername lab.example -tls1_3openssl output shows the negotiated protocol/cipher. For an external view, use a TLS scanner; do not rely only on a browser padlock.
Protocols
Section titled “Protocols”Registry paths (machine policy):
HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.0\ServerHKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.1\ServerHKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2\ServerHKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.3\ServerTypical hardening: Enabled=0, DisabledByDefault=1 for old protocols; Enabled=1, DisabledByDefault=0 for 1.2/1.3. A reboot is usually required for Schannel changes.
Back up first:
reg export "HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL" C:\backup\schannel.regCipher suites
Section titled “Cipher suites”Get-TlsCipherSuite | Sort-Object NameDisable-TlsCipherSuite -Name 'TLS_RSA_WITH_3DES_EDE_CBC_SHA'Prefer ECDHE + AES-GCM/ChaCha20. Do not disable every CBC suite if a legacy client still needs one; document the exception. Cipher order can matter for older clients.
IIS and Nginx
Section titled “IIS and Nginx”- IIS uses Schannel; the site binding only chooses the certificate.
- Nginx uses OpenSSL, not Schannel. Windows Nginx TLS is governed by
ssl_protocols/ssl_ciphers, not the registry. - If IIS and Nginx share a host, harden both separately.
Verify before and after
Section titled “Verify before and after”# beforeopenssl s_client -connect lab.example:443 -servername lab.example -tls1_2 </dev/null# aftercurl.exe -I https://lab.example/Test at least: current Chrome/Edge, a mobile client, an API client, and any legacy device you must support.
Lab boundary
Section titled “Lab boundary”E1. The lab used a self-signed certificate for WAC and did not change Schannel. The registry/cipher steps are the hardening plan to validate on Server 2025.