我有一個小服務,只監聽https://本地主機:41952並檢查來源主機名稱(必須是 localhost)。我想連接“listen:1988”並將帶有 stunnel 的請求重定向到“localhost:41952”
https://192.168.1.10:1988 -> redirect https://localhost:41952
目前配置:
[myservice]
cert = stunnel.pem
accept = 0.0.0.0:1988
connect = localhost:41952
openssl_client 日誌:
請注意,此憑證與 localhost:41952 上的憑證不同。
捲曲測試:
$ curl https://192.168.1.17:1988/DYMO/DLS/Printing/Check -vk
* Trying 192.168.1.17...
* Connected to 192.168.1.17 (192.168.1.17) port 1988 (#0)
* TLS 1.2 connection using TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384
* Server certificate: localhost
> GET /DYMO/DLS/Printing/Check HTTP/1.1
> Host: 192.168.1.17:1988
> User-Agent: curl/7.43.0
> Accept: */*
>
永遠等待。
也許我需要client = yes
?但我沒有任何證書,除非我從服務網站上的 Firefox 匯出https://本地主機:41952
我原來的問題:
答案1
stunnel 是一個在非 SSL 和 SSL 之間建立網關的程式。來自主頁上的描述:
Stunnel 是一個代理,旨在為現有客戶端和伺服器添加 TLS 加密功能,而無需更改程式碼
此工具並非設計用於建立從 SSL 到 SSL 的網關。在你的情況下你需要的只是一個簡單的 TCP 轉發器,可以用索卡特:
socat TCP4-LISTEN:1988,fork TCP4:127.0.0.1:41952
使用此轉發器,與 192.168.1.17:1988 的連線將轉送至 127.0.0.1:41952。客戶端將從伺服器取得原始證書,因為轉送是在 TCP 層級完成的。伺服器將看到來自 127.0.0.1 的連線。
編輯:經過大量溝通,現在很清楚,目標不是在問題中聲明正確的來源主機名,而不是響應中聲明的正確的引用者,而是主機 HTTP 請求標頭具有預期值“localhost” '。由於主機標頭是從 URL 設定的,因此您需要確保請求轉發到遠端系統,並且瀏覽器不會嘗試自行解析 URL,否則它會嘗試連接到所在電腦上的伺服器瀏覽器正在執行。要將 URL 解析推遲到目標系統,您需要在那裡運行代理,即您嘗試過的 Charles 代理或某些 SOCKS 代理。
答案2
所以要連接到https://192.168.1.10:1988並到達在 IP 192.168.1.10 的主機上偵聽環回介面的連接埠 4952 的 SSL 服務:
我們需要 2 個 stunnel 節來實現我們想要的。
[myservice]
cert = stunnel.pem
client = no
accept = 0.0.0.0:1988
connect = localhost:1987
[myserviceaux]
cert = stunnel.pem
client = yes
accept = localhost:1987
connect = localhost:4952
我唯一無法實現的是將 stunnel 中的所有請求的標頭主機修改為 localhost。
從curl 來看,它運作得很好:
$ curl https://192.168.1.10:41951/DYMO/DLS/Printing/Check -k -H "Host: localhost"
答案3
我已經解決了類似的HTTPS-TO-HTTPS
問題視窗用這個指令:
netsh interface portproxy add v4tov4 listenport=443 listenaddress=127.0.0.1 connectport=[remote-https-port] connectaddress=[remote-ip]