🔒 PQC Protocol Config

PQC TLS & Protocol Configuration

How to deploy post-quantum cryptography in TLS, SSH, and VPN today — with working configurations for Nginx, Apache, OpenSSH, and StrongSwan.

Deploy hybrid PQC now: X25519Kyber768 hybrid key exchange is supported in Chrome 116+, Firefox 119+, Safari 17+, Cloudflare (enabled by default), and AWS ALB. Hybrid provides quantum safety while maintaining full backward compatibility with older clients.

Current PQC Support Status (2024–2025)

Product / PlatformPQC SupportAlgorithmStatusAction
Chrome 116+ TLS key exchange X25519Kyber768 Enabled by default No action needed — PQC hybrid active for all HTTPS connections
Firefox 119+ TLS key exchange X25519Kyber768 Enabled by default No action needed
Safari / Apple TLS key exchange ML-KEM-768 (updated from Kyber) Enabled in Safari 17+ No action needed
Cloudflare CDN TLS key exchange + TLS termination X25519Kyber768 Enabled by default for all zones No action — Cloudflare handles it. Verify in CF analytics.
AWS Application Load Balancer TLS key exchange TLS_AES_128_GCM_SHA256 with PQC Available — must enable TLS 1.3 PQC cipher policy Set TLSv1.3 security policy in ALB listener
AWS CloudFront TLS key exchange X25519Kyber768 Available via TLSv1.3_2021 policy Update CloudFront distribution TLS policy
Google Cloud Load Balancer TLS key exchange X25519Kyber768 Available in TLS 1.3 mode Enable TLS 1.3 on GCP HTTPS load balancer
Nginx (OpenSSL 3.2+ / OQS build) TLS key exchange X25519Kyber768 and others Available with OQS provider build See Nginx tab — requires OQS OpenSSL build
Apache httpd (OQS build) TLS key exchange X25519Kyber768 Available with mod_ssl + OQS build See Apache tab — requires OQS OpenSSL
OpenSSH 9.0+ SSH key exchange sntrup761x25519-sha512 Available, not default in all distros Add KexAlgorithms line to sshd_config — see SSH tab
StrongSwan 5.9.6+ IKEv2 VPN Kyber (CRYSTALS) Available as plugin Install strongswan-plugin-oqs — see VPN tab
WireGuard Key exchange Curve25519 (not yet PQC) No mainline PQC support yet Monitor WireGuard PQ fork — not production ready
OpenVPN TLS/key exchange Depends on OpenSSL version Partial — depends on OpenSSL OQS build Complex — wait for mainline OpenSSL PQC support
Microsoft IIS / Schannel TLS Planned in Windows Server update Not yet available Monitor Windows PQC roadmap — expected 2025
Node.js (via OpenSSL) TLS X25519Kyber768 (OpenSSL 3.2+) Available when using Node 21+ with OQS OpenSSL Update to Node 21+ and OQS OpenSSL build

Nginx — PQC TLS Configuration

Option A: Cloudflare-terminated TLS (easiest — no server-side changes)

If you use Cloudflare in front of your Nginx, PQC hybrid is already active between clients and Cloudflare. The Cloudflare→Nginx connection uses classical TLS internally. This is the fastest way to give users PQC protection.

Option B: Direct Nginx with OQS-OpenSSL (native PQC)

Requires building Nginx with the OQS (Open Quantum Safe) provider for OpenSSL. This gives native PQC on the server without a CDN.

# Install dependencies apt-get install -y cmake ninja-build libssl-dev # Build liboqs git clone --branch main https://github.com/open-quantum-safe/liboqs.git cd liboqs && mkdir build && cd build cmake -GNinja -DCMAKE_INSTALL_PREFIX=/opt/oqs .. ninja && sudo ninja install # Build OQS-provider for OpenSSL git clone https://github.com/open-quantum-safe/oqs-provider.git cd oqs-provider && mkdir build && cd build cmake -DCMAKE_PREFIX_PATH=/opt/oqs -DOPENSSL_ROOT_DIR=/usr .. make && sudo make install # Build nginx with OpenSSL + OQS provider ./configure --with-openssl=/path/to/openssl \ --with-openssl-opt="enable-tls1_3" make && sudo make install

Nginx TLS configuration with PQC groups

server { listen 443 ssl; server_name example.com; ssl_certificate /etc/ssl/certs/fullchain.pem; ssl_certificate_key /etc/ssl/private/key.pem; # TLS 1.3 only (required for PQC key exchange) ssl_protocols TLSv1.3; # PQC hybrid key exchange groups # X25519MLKEM768 = X25519 + ML-KEM-768 hybrid (preferred) # x25519 fallback for clients without PQC support ssl_ecdh_curve X25519MLKEM768:x25519:P-256; # Strong cipher suites ssl_ciphers TLS_AES_256_GCM_SHA384:TLS_AES_128_GCM_SHA256; ssl_prefer_server_ciphers off; ssl_session_timeout 1d; ssl_session_cache shared:SSL:10m; # HSTS add_header Strict-Transport-Security "max-age=63072000" always; }

Verify PQC is active

# Check which groups were negotiated openssl s_client -connect yoursite.com:443 -groups X25519MLKEM768 2>&1 | grep -E "Server Temp Key|groups" # Expected output if PQC is active: # Server Temp Key: X25519MLKEM768, 1216 bits # Or use Cloudflare's checker: # https://pq.cloudflareresearch.com

OpenSSH — PQC Key Exchange Configuration

OpenSSH 9.0+ supports hybrid PQC key exchange via sntrup761x25519-sha512 (streamlined NTRU + X25519). This is available in Ubuntu 22.04+, Debian 12+, RHEL 9+, and macOS 14+.

Server configuration (/etc/ssh/sshd_config)

# Check OpenSSH version first — must be 9.0+ ssh -V # OpenSSH_9.x or higher required # /etc/ssh/sshd_config — add these lines: # Prefer PQC hybrid, fall back to X25519 for compatibility KexAlgorithms sntrup761x25519-sha512@openssh.com,curve25519-sha256,diffie-hellman-group16-sha512 # Use Ed25519 for host authentication (quantum-vulnerable but # not yet replaceable until PQC SSH host key support arrives) HostKeyAlgorithms ssh-ed25519,ecdsa-sha2-nistp256 # Disable weak algorithms Ciphers aes256-gcm@openssh.com,chacha20-poly1305@openssh.com MACs hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com # Restart SSH to apply sudo systemctl restart sshd # Verify PQC KEX is negotiated on connection: ssh -vvv user@server 2>&1 | grep kex # Look for: kex: server->client: sntrup761x25519-sha512@openssh.com

Client configuration (~/.ssh/config)

Host * # Prefer PQC hybrid key exchange KexAlgorithms sntrup761x25519-sha512@openssh.com,curve25519-sha256 # Strong ciphers only Ciphers aes256-gcm@openssh.com,chacha20-poly1305@openssh.com MACs hmac-sha2-512-etm@openssh.com # Disable weak host key algorithms HostKeyAlgorithms ssh-ed25519,ecdsa-sha2-nistp256

VPN — PQC IKEv2 Configuration (StrongSwan)

StrongSwan 5.9.6+ supports PQC key exchange in IKEv2 via the oqs-plugins. This provides quantum-safe key exchange for IPSec VPN tunnels.

# Install StrongSwan with OQS plugin apt-get install strongswan strongswan-swanctl # Build StrongSwan OQS plugin from source git clone https://github.com/open-quantum-safe/oqs-provider # Follow README at github.com/strongswan/strongswan for OQS integration # /etc/swanctl/conf.d/pqc-vpn.conf connections { pqc-tunnel { version = 2 proposals = aes256gcm128-sha512-mlkem768-x25519 # PQC hybrid local { auth = pubkey certs = server-cert.pem } remote { auth = pubkey } children { pqc-sa { esp_proposals = aes256gcm128-sha512 } } } } # Hybrid proposal: mlkem768-x25519 = ML-KEM-768 + X25519 # Safe if either classical OR PQC remains unbroken

Testing & Verification Tools

ToolWhat It ChecksCommand / URL
Cloudflare PQ Checker Whether your browser negotiated PQC key exchange with Cloudflare https://pq.cloudflareresearch.com
OpenSSL s_client Negotiate specific PQC groups and verify openssl s_client -connect host:443 -groups X25519MLKEM768
Wireshark / tshark Capture TLS handshake and inspect ClientHello supported_groups extension tshark -i eth0 -f "tcp port 443" -Y "tls.handshake.type==1"
nmap ssl-enum-ciphers Enumerate supported TLS cipher suites and key exchange groups nmap --script ssl-enum-ciphers -p 443 host
testssl.sh Comprehensive TLS configuration analysis including PQC group support testssl.sh --pqc https://yourhost.com
OpenSSL version check Verify OpenSSL supports PQC groups openssl list -kem-algorithms | grep -i mlkem
SSH verbose connection Verify PQC KEX algorithm negotiated ssh -vvv user@host 2>&1 | grep "kex: "