我正在尝试为内部 HTTPS 服务器设置 HTTP 反向代理。顺便说一句,是的,我知道我正在放弃所有安全性。原始 HTTPS 服务器对我们来说本质上并不敏感,并且运行它的产品不允许以任何方式关闭 HTTPS 或重新配置嵌入式 Web 服务器。
我曾尝试使用 Nginx,但大多数人似乎都在使用 Apache,所以我现在也尝试使用 Apache。
这是我当前的虚拟主机配置:
<VirtualHost 0.0.0.0:10443>
ServerName server.domain.com
SSLProxyEngine on
#UnknownSSLDirectives
#SSLProxyMachineCertificateFile /etc/apache2/selfsignedcert.pem
SSLProxyCACertificateFile /etc/apache2/selfsignedcert.pem
ProxyRequests Off
ProxyPass / https://internalserver.internaldomain.com:2941/
ProxyPassReverse / https://internalserver.internaldomain.com:2941/
<Proxy>
Order Deny,Allow
Allow from all
</Proxy>
RequestHeader unset Authorization
ErrorLog /var/log/apache2/internalserver-error.log
CustomLog /var/log/apache2/internalserver-access.log common
</VirtualHost>
当我尝试打开http://server.domain.com:10443/我收到错误“401 未授权”。
在其他 ServerFault 问题中,我看到了对 UnknownSSLDirectives 的引用,但 Apache 抱怨该选项不存在。以及使用 SSLProxyMachineCertificateFile 而不是 SSLProxyCACertificateFile,但 Apache 抱怨在这种情况下 SSL 设置不完整。
我有点困惑。我该如何调试这个问题或者取得一些进展?谢谢!
答案1
截至 2018 年,不建议使用 Apache 或 stunnel 执行此任务。我建议使用 haproxy,因为它清晰度高、速度快。
至于 Apache 2.2,您在 上犯了错误<Proxy>
。在反向代理场景中, 的访问ProxyPass
由 block 控制<Location>
,而不是由 控制<Proxy>
。
仅适用<Proxy>
于向前代理,然后你做一个撤销代理人。手册里有。
答案2
我没有答案,但这里有一些调试问题的建议。
我会尝试在客户端模式下使用 stunnel 进行“反向 SSL 终止”(http://www.thegoldfish.org/2010/01/stunnel-in-client-mode/),并尝试是否可以通过高端口上的 stunnel 直接连接到 http(通过 curl / lynx / 通过 ssh 隧道连接高端口)。目前,我只处理 ssl 客户端,而不处理 Apache 的代理设置。
当我完成这项工作后,我会尝试在 Apache 中为 stunnel 端口设置普通的未加密 http 代理。我已使解密部分正常工作,并且 Apache 中的未加密 http 代理是一种已知且有据可查的设置。此外,我可以使用嗅探器(例如 tcpdump)来监听 Apache 和未加密的 stunnel 套接字之间的通信。
只有在这项工作完成后,我才会尝试弄清楚如何删除 stunnel 中间人并让 Apache 本身使用 https。
附注:如果后端服务在 cookie 上设置了安全标志,并且浏览器认为它处于未加密的 http 上,那么我预计身份验证会出现一些问题。其他一些标头和重定向也可能会产生问题。无论如何,在使用浏览器之前,请使用 curl -v 调试服务,并使用 Web 检查器(例如 Firebug)检查请求/响应标头和 cookie。