Q01: What is the real threat?
A: The threat is that attackers can collect encrypted network data and then break the asymmetric cryptography (RSA/ECC/DH) used to protect bulk data encryption keys (AES) once cryptographically relevant quantum computers come online. This is known as Harvest Now, Decrypt Later (HNDL).
Q02: Do I need to use TLS 1.3 for PQ support?
A: Yes. Earlier versions of TLS, including TLS 1.0, TLS 1.1, and TLS 1.2, do not and will not support post-quantum key establishment.
Q03: Does enabling TLS 1.3 give me hybrid PQ support?
A: No. By default, you will get ‘classic’ crypto algorithms. You must enable the PQ algorithms; this is explained later.
Q04: What Windows OS version must I use to get TLS 1.3 and post-quantum support?
A: TLS Hybrid Key Exchange using ML-KEM groups is available on Windows 11 starting with update KB5089573 for 24H2 and 25H2 and KB5095091 for 26H1.
For Windows Server 2025 use the patch from July 14, 2026-KB5099536 (OS Build 26100.33158)
Q05: What is hybrid crypto in TLS 1.3?
A: Hybrid crypto establishes cryptographic keys by combining elliptic-curve cryptography with post-quantum cryptography, allowing the client and server to use both algorithms during the TLS 1.3 key establishment. It’s a hedge in case the PQ cryptography is broken.
Q06: What crypto is used in hybrid?
A: Like all crypto in TLS, this is flexible; however, the most common hybrid crypto for web browser-based key establishment is X25519_MLKEM768 which combines the classic X25519 Elliptic Curve with post-quantum ML-KEM.
Q07: What is ML-KEM?
A: ML‑KEM (Module-Lattice Key Encapsulation Mechanism) is the new quantum-resistant method for securely establishing cryptographic keys between hosts. It is defined in FIPS 203.
Q08: Is hybrid TLS 1.3 enabled in Windows today?
A: No not by default; you must enable it. If you use Group Policy, you can set the policy there. If the machine does not have GP, then you can use the following from an elevated PowerShell prompt:
Enable-TlsEccCurve -Name "X25519_MLKEM768" -Position 0Note that -Position 0 is important as it places the hybrid group X25519_MLKEM768 at the top of the preferred group list. If you do not do this, you might not negotiate to the hybrid PQC group.
IMPORTANT: Note that Group Policy will override this setting, so don’t mix-n-match! If you see your group ordering change after calling the PS cmdlet, it's probably GP coming in and overriding the setting.
Q09: In the prior answer, you used the word ‘group’ what is a group?
A: In TLS 1.3, a "group" is simply the method (or algorithm) that the client and server agree to use to securely establish keys during the connection. Examples include X25519 (the most common Elliptic Curve TLS 1.3 group) or the newer hybrid X25519_MLKEM.
As a side note, the word "group" isn't arbitrary - it comes from the underlying algebra (elliptic-curve groups, finite-field multiplicative groups). It's mathematically precise; it's just opaque to anyone who isn't thinking about group theory! However, ML-KEM isn't built on a group at all - its hardness comes, in part, from lattices.
Q10: Is a group the same as a ciphersuite in TLS 1.3?
A: No, a group is not the same as a ciphersuite in TLS 1.3. The group is how the client and server agree on secret keys. The ciphersuite is how they use secret keys to encrypt and protect the traffic. They work together in a TLS 1.3 handshake, but they are two separate parts
Q11: Are there other groups I should know about?
A: Yes. There are three common hybrid groups; you have already met X25519_MLKEM768, but there is also SecP256r1_MLKEM768 and SecP384r1_MLKEM1024.
Q12: What group should I use?
A: Follow your organization’s cryptographic policy and required assurance profile. For browser interoperability, prefer X25519_MLKEM768 where supported and place it ahead of other groups. For regulated environments, use a hybrid group and implementation permitted by the applicable policy and validated cryptographic module; this may require SecP256r1_MLKEM768 or SecP384r1_MLKEM1024 instead of X25519_MLKEM768.
Q13: If there is TLD 1.3 with hybrid crypto, is there a version that is NOT hybrid?
A: Yes, it’s called ‘pure’, and that is where rather than using ECC+PQC, you use just PQC; for example instead of X25519+MLKEM768, you use only MLKEM768 or MLKEM1024 if CNSA 2.0 compliance is in scope. Some customers may eventually require this. You can read about the MLKEM-only Windows schannel update here August 27, 2026—KB5120998 (OS Builds 26200.9278 and 26100.9278) Preview | Microsoft Support.
Q14: What’s CNSA 2.0?
A: CNSA 2.0, the Commercial National Security Algorithm Suite 2.0, is the NSA's set of quantum-resistant cryptographic algorithm requirements for U.S. National Security Systems. It updates CNSA 1.0 by introducing post-quantum algorithms intended to protect classified and other national-security-sensitive information against both classical and future quantum attacks. It is important because transitioning cryptographic infrastructure takes years, while adversaries can collect encrypted data now and attempt to decrypt it later. Although its formal scope is National Security Systems, CNSA 2.0 also provides vendors and other organizations with a concrete high-assurance target for planning, product development, and post-quantum migration.
The list of algorithms that affect TLS includes:
- Key establishment: ML-KEM-1024 only (not 512, not 768)
- Digital signatures: ML-DSA-87 only (not 44, not 65)
- Hashing: SHA-384 or SHA-512 only
- Symmetric encryption: AES-256 only
Q15: How do I test if my server supports TLS 1.3?
A: See Appendix A.
Q16: How do I test if my server supports TLS 1.3 and PQC?
A: See Appendix B.
Q17: How do I use Wireshark to determine if my server supports TLS 1.3 and PQC?
A: See Appendix C.
Q18: Do both the client and server need to support hybrid PQC TLS?
A: Yes.
Q19: What happens if one side does not support hybrid PQC TLS?
A: If one side does not support hybrid PQC TLS, the connection may still succeed using another mutually supported TLS 1.3 key establishment group, for example X25519, but it will not use hybrid PQC protection. The exact behavior depends on the client, server, and TLS configuration.
Q20: How do I know if my client, such as a browser, supports PQC TLS?
A: Point your application or browser at a tool like this https://pqc.ninja/api/browsertest/ it will output something like:
{ "negotiated_curve": "X25519MLKEM768", "offered_curves": "X25519MLKEM768:X25519:prime256v1:secp384r1", "negotiated_cipher": "TLS_AES_256_GCM_SHA384", "offered_ciphers": "TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256", "alpn_protocol": "h3", "protocol": "TLSv1.3" }You can see that the browser and server negotiated to use the X25519_MLKEM768 hybrid group and the browser supports this along with two classic (ie; non-PQC) curves, prime256v1 and secp384r1.
Q21: Are PQC (ML-DSA) certificates required for TLS 1.3?
A: No, not for hybrid PQC key establishment. PQC certificates are a separate part of the post quantum migration and relate to authentication and digital signatures. Hybrid key establishment protects the session key agreement; PQC certificates will protect the certificate signature and authentication path.
Q22: Following the previous question, why does the server still use a classic certificate if the key negotiation is post-quantum?
A: This is by design. We need to secure data in transit first and foremost, since that represents the most immediate quantum threat. An adversary can perform a harvest-now, decrypt-later attack by storing encrypted communications today and waiting until quantum computers are available to decrypt them - any data being transmitted currently needs quantum-safe key exchange to be secure in the future. Authentication, however, does not have that same window of exposure: to perform a successful spoof via certificate misuse, an attacker would need a cryptographically meaningful quantum computer at the time of the session - they do not get to use it later. As we don't have that ability currently, by securing key exchange first we mitigate the most imminent threat while the ecosystem around it (CAs, trust anchors, relying parties, etc.) works towards supporting PQC signatures.
Q23: Is there a performance impact from hybrid PQC TLS?
A: We will provide more stats as they become available, but current details look good; X25519 vs X25519-MLKEM768 is about a 3%-6% latency delta and less than 1% CPU hit using Azure Linux, nginx + OpenSSL + SymCrypt and similar stats using https.sys on Windows Server 2025.
Q24: Should I enable this on internet-facing services first or internal services first?
A: Start with controlled pilots, then prioritize services that protect long-lived or high-value confidential data. Internet-facing services may provide broader coverage, but internal services can be easier to test and control. The right rollout order should balance risk, compatibility, visibility, and operational readiness.
Q25: What logging or telemetry should I capture during testing?
A: Capture the client and server IP addresses, the negotiated key-establishment group, the negotiated cipher suite, and the TLS protocol version for every test connection. Also record whether the handshake succeeded or failed and correlate each result with a timestamp or connection identifier. This makes it possible to confirm that TLS 1.3 and the expected hybrid PQC group were negotiated.
Below is a screen shot from a tool I have on GitHub that shows most of this passively in Windows using schannel and pktmon. The code is here x509cert/schannel-cap.
Appendix A - Testing for TLS 1.3
You can use tools like OpenSSL, PowerShell or a modern browser to test a server to determine if it supports TLS 1.3.
Let’s look at each.
OpenSSL
Use the following from a Windows or Linux command-line, obviously replacing the IP address and port number for your target service.
openssl s_client -connect 192.168.1.1:443 -tls1_3 -briefSuccess is when you see:
CONNECTION ESTABLISHED Protocol version: TLSv1.3PowerShell 7+
Save the following as Test-Tls13.ps1.
param( [Parameter(Mandatory)][string]$IpAddress, [Parameter(Mandatory)][int]$Port ) $tcp = New-Object System.Net.Sockets.TcpClient $tcp.Connect($IpAddress, $Port) $tls = New-Object System.Net.Security.SslStream($tcp.GetStream(), $false) try { $tls.AuthenticateAsClient($IpAddress, $null, [System.Security.Authentication.SslProtocols]::Tls13, $false) Write-Host "Connected: $($tls.SslProtocol), cipher $($tls.NegotiatedCipherSuite)" -ForegroundColor Green } catch { Write-Host "TLS 1.3 handshake failed: $($_.Exception.Message)" -ForegroundColor Red } finally { $tls.Dispose() $tcp.Dispose() }You can call this using positional syntax:
.\Test-Tls13.ps1 192.168.1.1 443Or using parameters:
.\Test-Tls13.ps1 -IpAddress "192.168.1.1" -Port 443Success is indicated by output like this:
Connected: Tls13, cipher TLS_AES_256_GCM_SHA384Edge and Chrome Browsers
Current versions of Edge and Chrome support hybrid TLS 1.3. After you make a connection to the server, click the ellipsis in the top right (…) -> More Tools -> Developer Tools -> Security.
If you don’t see the security option:
Then click on the + symbol and add the Security tab.
Now you will see the connection details, if you see TLS 1.3, then the server and client are connected with TLS 1.3. In the example below, the connection is also using X25519MLKEM, so the connection is not just using TLS 1.3, it’s using TLS 1.3 in PQ hybrid.
Appendix B – Testing for TLS 1.3 and PQC
The simplest and most reliable way to test a server to determine if it supports TLS 1.3 and PQC, is to use the following OpenSSL command-line:
.\openssl s_client -connect 127.0.0.1:8443 -tls1_3 -briefYou will see output like this:
Connecting to 127.0.0.1 CONNECTION ESTABLISHED Protocol version: TLSv1.3 Ciphersuite: TLS_AES_256_GCM_SHA384 Peer certificate: CN=localhost Hash used: SHA256 Negotiated TLS1.3 group: X25519MLKEM768
The group information, in this case X25519MLKEM is at the bottom, this indicates that hybrid PQC is in place for this connection.
Appendix C – Wireshark Filtering
Wireshark is commonly used to determine what data is travelling across a network. You can determine if a connection uses hybrid groups using the following steps:
- Start Wireshark,
- Perform some sample network connections (like make an API call or load a page in a browser),
- Stop the collection
- Enter the following in the filter window: tls.handshake.extensions_key_share_group
- Click on the packet of interest and scroll to the Extension: key_share line.
You will see something like this:
The line in this example shows that the connection uses X25519MLKEM768 which is a hybrid PQC group.
Note, you will often see TLS 1.2 used as the protocol version, Wireshark explains why:
The TLS Version field is a deprecated field, so ignore it!
Thanks!
As usual, a big thanks to the people who helped write and edit this document:
- Jessica Krynitsky - Windows Security
- Andrei Popov - Windows Security
- Aabha Thipsay - Windows Security
- Vick Mukherjeee - Azure Security