PQC with Caddy 2.10

PUBLISHED ON JUN 20, 2025 — 339 words — ALPINE , CADDY , PQC


PQC

You might have noticed that PQC has become a (really) hot topic in the past few weeks, and to be honest, I don’t know why—since we are years away from a “real-life” cryptographic doomsday. I quote the NIST :

Researchers need to surmount many technical challenges before this can happen. Experts’ estimates range from a few years to a few decades.

However, just because PQC is still years away from being a matter of life and death doesn’t mean we should wait before toying with it or starting to use it. I’m not sure one should use it on mission-critical services yet, as the devil hides in bugs, and it’s wayyyy too early to have enough feedback on PQC algorithm implementations. But because I like to be on zee bleeding edge, I decided to activate support for PQC for this blog. It is totally useless —therefore, totally necessary!

And because I run Alpine Linux on zee bleeding edge also, I can benefit from Caddy 2.10…

arkham:~$ cat /etc/alpine-release
3.23.0_alpha20250612

arkham:~$ caddy --version
v2.10.0

So for my configuration, it is as simple as setting x25519mlkem76 for the curves options

opium.io {
        root * /lighttpd-jail
        encode gzip
        file_server
        tls {
        curves x25519mlkem768 secp384r1 secp256r1 x25519
        }
        header {
                Strict-Transport-Security "max-age=31536000;"
                X-Content-Type-Options "nosniff"
                X-Frame-Options "SAMEORIGIN"
                X-XSS-Protection "1; mode=block"
                Content-Security-Policy "script-src 'self'"
                Referrer-Policy "no-referrer-when-downgrade"
        }

        log {
                output file /var/log/access.log
        }
}

Restart Caddy and voilà!

Sadly even Chrome does not support PQC by default as of today… So you have to activate it in chrome://flags/ and search for tls

PQC

Restart Chrome, open the developper tools and hold and behold!

PQC

Sadly, you will see that the cipher is AES_128_GCM. Grover’s Algorithm halves the effective key lenght of symmetric key algorithms (AES in this case). So Since RFC 8446 requires TLS_AES_128_GCM and because Go’s stdlib for TLS doesn’t allow configuring cipher suites and order… you get a PQC web server not totally PQC proof…

But I’m no cryptographer so I might be wrong :)

This blog post is 100% human-written and 100% GenAI proofread.

TAGS: CADDY , PQC , TLS