客户端 (C)通过代理(磷)联系服务器(S):
A --http--> P --https--> S
我需要代理能够调查请求内容,为此我看到两个选项:
- SSL 隧道拦截:C发送
CONNECT
请求以在之间创建 SSL 隧道C和S,但是代理拦截并破坏 SSL 隧道,生成由受信任的内部 CA 即时签名的证书C来完成握手。 - 客户端使用一个
https://
方案:C不创建隧道,它只是将 HTTPS URL 传递给代理(就像处理 HTTP URL 一样),然后代理负责从S使用 HTTPS 并将其转发到C在清晰的 HTTP 中。
我认为之间的沟通C和磷为了已经安全,所以我认为设置 SSL 拦截没有意义:设置非常耗时,需要在客户端的根 CA 中注入自制 CA,浪费计算资源来处理无用的握手和加密。相反,第二个选项是轻量级的,允许完全禁止CONNECT
在代理上使用。
使用轻松进行的手动测试表明我的鱿鱼安装工作正常并正确支持第二个选项:我可以通过将方案传递给代理来telnet
成功检索文档。https://
然而,客户C在 FreeBSD 上,我没有找到一种方法来告诉任何客户端软件以相同的方式运行。
我在 中没有找到任何相关选项fetch
。同样的事情与wget
.
我也尝试过curl
,似乎可以解释这一点所有操作均通过 HTTP 进行,除非 -p/--proxytunnel使用,但即使没有此选项,它仍然尝试为 HTTPS 连接创建隧道。我也尝试使用此选项,包括尝试--no-proxytunnel
因为根据相同的联机帮助页,某些布尔选项接受此语法,但没有运气。代理隧道似乎确实在第 5635 行强制执行库/url.c(犯罪):
/*************************************************************
* If the protocol is using SSL and HTTP proxy is used, we set
* the tunnel_proxy bit.
*************************************************************/
if((conn->given->flags&PROTOPT_SSL) && conn->bits.httpproxy)
conn->bits.tunnel_proxy = TRUE;
任何解决方案,无论是使用 FreeBSD 基本系统中的工具还是存储库中可用的一些知名客户端都将受到欢迎!