Pi-hole FTL version: v6.7 (commit fa65a88f)
Web version: v6.6
Core version: v6.4.3
OS: Debian GNU/Linux (trixie), kernel 6.18.39+rpt-rpi-2712, aarch64 (Raspberry Pi 5)
Install method: standard package install
Summary
Setting webserver.port to force HTTPS-only (e.g. "443s,[::]:443s" or "80r,443s,[::]:80r,[::]:443s") causes the embedded webserver to accept TCP connections and log successful TLS certificate loading, but the TLS handshake itself fails on every connection attempt β both locally (127.0.0.1) and from remote clients. The only reliable fix is a full system reboot; restarting the pihole-FTL service (even repeatedly, even after reverting the config) does not resolve it once triggered.
Steps to reproduce
- Start from a working config with the default
webserver.port = "80o,443os,[::]:80o,[::]:443os"(optional TLS) β confirmed working, HTTPS and HTTP both respond normally. - Change
webserver.portto"80r,443s,[::]:80r,[::]:443s"(or"443s,[::]:443s") directly in/etc/pihole/pihole.toml. sudo systemctl restart pihole-FTL.- Attempt
curl -v -k ``https://127.0.0.1/admin/.
Expected behavior
HTTPS connections succeed (as they do when the same certificate is used with 443os), and HTTP either redirects (80r) or is refused, depending on config.
Actual behavior
curlfails during the TLS handshake immediately after sending the Client Hello:
* TLSv1.3 (OUT), TLS handshake, Client hello (1):
* Send failure: Broken pipe
* TLSv1.3 (OUT), TLS alert, decode error (562):
* TLS connect error: error:0A000126:SSL routines::unexpected eof while reading
curl: (35) Send failure: Broken pipe
openssl s_client -connect 127.0.0.1:443shows the TCP connection succeeds, but 0 bytes are read from the server ("SSL handshake has read 0 bytes and written 1551 bytes") β the server never responds to the Client Hello at all.- Plain HTTP (
curl ``http://127.0.0.1/admin/) also starts failing withRecv failure: Connection reset by peeronce this state is triggered β even after revertingwebserver.portback to the original80o,443os,...value and restarting the service again. /var/log/pihole/FTL.logshows no error at all β it reports success on every restart:
INFO: Reading certificate from /etc/pihole/tls.pem ...
INFO: Using SSL/TLS certificate file /etc/pihole/tls.pem
INFO: - 0.0.0.0:80 (HTTP, IPv4, redirecting, OK)
INFO: - 0.0.0.0:443 (HTTPS, IPv4, OK)
ss -tlnpconfirms the sockets are correctly bound and listening on both 80 and 443.- The certificate itself was verified valid and well-formed (
openssl x509 -noout -dates -subjectshows correct validity window; file contains 1 PRIVATE KEY block and 2 CERTIFICATE blocks as expected). pstree/ps -eLfconfirm the webserver thread is present and alive within the mainpihole-FTLprocess (no crashed/missing child process).- No firewall rules (
nft list ruleset,iptables -L -n -v) reference ports 80/443 at all β ruled out as a cause. - A local, unrelated Python
http.serveron a different port works fine at the same time, ruling out a system-wide networking/conntrack issue. sudo systemctl stop pihole-FTLfollowed by a cleanstart(confirmed viaps auxthat no process/thread survived the stop) does not clear the issue.- Only
sudo rebootrestores normal function β and even then, retriggering the443s-only config change reproduces the exact same failure again (tested twice, reproducible).
Additional notes
- CrowdSec + crowdsec-firewall-bouncer are running on this host, but
cscli decisions listshowed no active decisions during the failure, ruling that out as well. - This appears to point to a state/resource issue specific to the civetweb webserver thread that a graceful config reload/restart does not clean up, but a full process teardown (via reboot) does. Possibly related to how the optional-vs-mandatory TLS listener mode is initialized/torn down.
Happy to provide full journalctl -u pihole-FTL output, pihole.toml diffs, or run additional diagnostics if useful.