使用 stunnel 的 SSL 代理

使用 stunnel 的 SSL 代理

我正在尝试设置 SSL 连接隧道. 某种 SSL 代理。

最终目标
仅连接 http客户仅限 https服务器

我的计划是

  1. 客户端:将端点更改为代理人
  2. PROXY:使用stunnel接收来自CLIENT的请求,并转发给SERVER

隧道配置文件

cert = /etc/stunnel/stunnel.pem
foreground = yes
chroot = /var/run/stunnel
setuid = stunnel
setgid = stunnel
pid = /stunnel.pid
debug = 7
[my_route]
accept = 7121
connect = SERVER:443
;connect = SERVER:443/somedata

测试 1

$openssl s_client -connect SERVER:443
New, TLSv1/SSLv3, Server public key is 2048 bit

测试 2

openssl s_client -connect PROXY:7121
New, TLSv1/SSLv3, Server public key is 2048 bit

结果(通过代理从客户端连接到服务器)。

Service [my_route] accepted (FD=3) from 10.0.2.2:12345
Service [my_route] started
Service [my_route] accepted connection from 10.0.2.2:12345
SSL state (accept): before/accept initialization
SSL_accept: 1408F10B: error:1408F10B:SSL routines:SSL3_GET_RECORD:wrong version number
Connection reset: 0 byte(s) sent to SSL, 0 byte(s) sent to socket
Local socket (FD=3) closed
Service [my_route] finished (0 left)

问题

  1. 为什么 IP 与服务器不匹配?为什么连接到 10.0.2.2?
    这是否意味着我连接到了错误的服务器?怎么会这样?

  2. 这个错误说明了什么?远程服务器使用的是另一个版本的 SSL,不是吗?

答案1

  1. 为什么 IP 与服务器不匹配?为什么连接到 10.0.2.2?

因为该 IP 地址不是服务器它正在连接,但地址客户它正在从中接收信息的机器(运行 openssl s_client)。

这是否意味着我连接到了错误的服务器?怎么会这样?

不,这与服务器无关。

  1. 这个错误说明了什么?远程服务器使用的是另一个版本的 SSL,不是吗?

这意味着您的 stunnel 尝试与连接的客户端 (openssl s_client) 进行 SSL 通信。它们似乎对要使用的 SSL 协议版本没有达成一致。

然而,这完全是错误的。在您要设置的配置中,stunnel 应该等待 HTTP 连接,并将这些连接通过 HTTPS 隧道传输到服务器。因此,您可能不会使用 openssl s_client 连接到您的 stunnel,因为 openssl s_client 将使用 SSL,而 stunnel 将等待非 SSL 连接。

client = yes要解决此问题,您需要在配置中添加一行。然后,不要使用 openssl s_client 作为 stunnel 的客户端,而应该使用 telnet ( telnet server2 7121),或者可以使用能够通过 HTTP 与服务器通信的程序(例如 Web 浏览器或类似程序,其 URL 以 开头http://PROXY:7121/...)。

此外,强烈建议在配置文件中使用 IP 地址(而不是文本主机名)。

类似这样的事情应该对你有用:

[my_route]
client = yes
accept = 7121
connect = aaa.bbb.ccc.ddd:443

答案2

看来这个问题已经得到解决在 Server Fault 上的这个答案中;加粗部分似乎与您的场景相关:

服务器stunneloptions = NO_SSLv3,但客户端正尝试使用 SSLv3 进行连接。您需要升级客户端以支持较新版本的 SSL,或者您需要更改 stunnel 配置以接受 SSLv3。

答案3

将其添加到配置文件即可。

sslversion = all

您可能还错过了另一件事。您应该明确设置“client = yes”,否则其默认为“no”。

相关内容