我有一个小服务,它只在https://localhost:41952上监听并检查源主机名(它必须是本地主机)。我想连接到“听:1988年”,并将请求重定向到"localhost:41952“。
https://192.168.1.10:1988 -> redirect https://localhost:41952当前配置:
[myservice]
cert = stunnel.pem
accept = 0.0.0.0:1988
connect = localhost:41952http://pastebin.com/7bg3sf7J
请注意,此证书与本地主机上的证书不同: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?但是我没有任何证书,除非我在服务https://localhost:41952的站点上从Firefox导出的证书
我最初的问题是:
发布于 2015-10-09 11:52:18
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代理。
发布于 2015-10-10 19:12:52
因此,要连接到https://192.168.1.10:1988并访问监听IP 192.168.1.10主机上环回接口的4952端口的SSL服务:
我们需要两节警钟才能实现我们想要的。
[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我唯一不能实现的就是修改头主机,使其成为适用于所有请求的本地主机。
从卷曲看,它工作得很完美:
$ curl https://192.168.1.10:41951/DYMO/DLS/Printing/Check -k -H "Host: localhost"发布于 2019-01-08 15:45:51
我使用以下命令解决了Windows上类似的HTTPS-TO-HTTPS问题:
netsh interface portproxy add v4tov4 listenport=443 listenaddress=127.0.0.1 connectport=[remote-https-port] connectaddress=[remote-ip]
https://serverfault.com/questions/727855
复制相似问题