如何讓 Haproxy 不向後端伺服器發送 SNI 欄位?
在 en.wikipedia.org 而不是 zh.wikipedia.org 的反向代理工作之後,我的審查員阻止了 SNI 訪問 zh.wikipedia.org。如果沒有 SNI,那麼在 /etc/hosts 中正確的 IP 就足夠了。
原始配置:
defaults log 127.0.0.1:514 user timeout connect 5000s timeout client 5000s timeout server 5000s listen reverse-proxy bind 127.0.0.1:443 mode tcp balance static-rr server srv1 208.80.153.224
以下反向代理導致 Firefox 說:
該站點使用 HTTP 嚴格傳輸安全 (HSTS) 來指定 Firefox 只能安全地連接到它。因此,無法為此證書添加例外。
更改的配置:
global tune.ssl.default-dh-param 2048 defaults log 127.0.0.1:514 user timeout connect 5000s timeout client 5000s timeout server 5000s listen reverse-proxy bind 127.0.0.1:443 ssl crt /home/test/wiki.pem mode http http-response set-header Strict-Transport-Security "max-age=16000000; includeSubDomains; preload;" balance static-rr server srv1 208.80.153.224 ssl verify none
正如 drookie 所說,TCP 模式無法做到這一點,但在 Haproxy 中,HTTP 模式預設不發送 SNI 欄位。
該行
http-response set-header Strict-Transport-Security "max-age=16000000; includeSubDomains; preload;"
沒有意義。(在這種情況下您可以刪除它)這個真正的問題來源是瀏覽器配置,因為它預設拒絕所有未知的頒發者
警告:以下解決方法將完全禁用 HSTS,但您可以使用HTTPS Everywhere來獲得類似的安全性。
在 Firefox 中打開
about:config
然後更改network.stricttransportsecurity.preloadlist
為false
,這個反向工作作為例外。此外,您可能需要刪除 Firefox 中的 SiteSecurityServiceState.txt 以清除 Firefox 中的 HSTS 資訊。
警告:如果您不想使用瀏覽器擴展而無法驗證後端伺服器,請不要使用 CA 證書方式,然後為您創建一個 CA 證書,然後讓您的瀏覽器信任您的 CA 證書。
在此配置中,您不能,因為您使用的是
mode tcp
代理,因此您的 haproxy 只是透明地將整個 HTTP 會話傳遞到後端。您應該切換到mode http
並操作標題。