Files
jenz 08c03ac533
CI / Build (clang, clang++, ubuntu-22.04, linux, 3.10, master, x86,x86_64) (push) Canceled after 0s
CI / Build (clang, clang++, windows-2022, windows, 3.10, master, x86,x86_64) (push) Canceled after 0s
CI / Release (push) Canceled after 0s
first commit
2026-09-13 22:18:11 +01:00

1.4 KiB

HSTS support

curl features EXPERIMENTAL support for the Strict-Transport-Security: HTTP header. Added in curl 7.74.0

Standard

HTTP Strict Transport Security

Behavior

libcurl features an in-memory cache for HSTS hosts, so that subsequent HTTP-only requests to a host name present in the cache will get internally "redirected" to the HTTPS version.

curl_easy_setopt() options:

  • CURLOPT_HSTS_CTRL - enable HSTS for this easy handle
  • CURLOPT_HSTS - specify file name where to store the HSTS cache on close (and possibly read from at startup)

curl cmdline options

  • --hsts [filename] - enable HSTS, use the file as HSTS cache. If filename is "" (no length) then no file will be used, only in-memory cache.

HSTS cache file format

Lines starting with # are ignored.

For each hsts entry:

[host name] "YYYYMMDD HH:MM:SS"

The [host name] is dot-prefixed if it is a includeSubDomain.

The time stamp is when the entry expires.

I considered using wget's file format for the HSTS cache. However, they store the time stamp as the epoch (number of seconds since 1970) and I strongly disagree with using that format. Instead I opted to use a format similar to the curl alt-svc cache file format.

Possible future additions

  • CURLOPT_HSTS_PRELOAD - provide a set of preloaded HSTS host names
  • ability to save to something else than a file