我正在尝试设置 SSL 连接隧道. 某种 SSL 代理。
最终目标
仅连接 http客户仅限 https服务器。
我的计划是
- 客户端:将端点更改为代理人
- 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)
问题
为什么 IP 与服务器不匹配?为什么连接到 10.0.2.2?
这是否意味着我连接到了错误的服务器?怎么会这样?这个错误说明了什么?远程服务器使用的是另一个版本的 SSL,不是吗?
答案1
- 为什么 IP 与服务器不匹配?为什么连接到 10.0.2.2?
因为该 IP 地址不是服务器它正在连接,但地址客户它正在从中接收信息的机器(运行 openssl s_client)。
这是否意味着我连接到了错误的服务器?怎么会这样?
不,这与服务器无关。
- 这个错误说明了什么?远程服务器使用的是另一个版本的 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 上的这个答案中;加粗部分似乎与您的场景相关:
服务器
stunnel
已options = NO_SSLv3
,但客户端正尝试使用 SSLv3 进行连接。您需要升级客户端以支持较新版本的 SSL,或者您需要更改 stunnel 配置以接受 SSLv3。
答案3
将其添加到配置文件即可。
sslversion = all
您可能还错过了另一件事。您应该明确设置“client = yes”,否则其默认为“no”。