我有一个小服务,只监听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 的连接。
编辑:经过大量沟通,现在很清楚,目的不是在问题中声明正确的源主机名,也不是在响应中声明正确的 Referer,而是 Host HTTP 请求标头具有预期值“localhost”。由于主机标头是从 URL 设置的,因此您需要确保请求被转发到远程系统,并且浏览器不会尝试自行解析 URL,否则它会尝试连接到运行浏览器的计算机上的服务器。要将 URL 的解析推迟到目标系统,您需要在那里运行代理,即您尝试过的 Charles Proxy 或某些 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 中所有请求的标头主机修改为本地主机。
从 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]