Apache 反向代理保留 SSL

Apache 反向代理保留 SSL

康泰克思

我目前通过 VirtualHosts 安装了一个包含多个站点的 Apache。我的目标是慢慢迁移到 Dockerized 设置,其中一个 nginx 反向代理将请求分发到 Dockerized 应用程序。

为了开始迁移,我在 Apache 设置中创建了一个 catch-all;任何针对 Apache 不再知道的站点的请求都会被反向代理到 nginx-proxy docker 容器。然后,我可以将一个站点添加到 docker 解决方案中,在 Apache 中禁用它,转换过程无缝衔接。这对于 http 请求很有效;我在 https 请求方面遇到了问题。

问题

如何设置 apache 不与 https 请求交互,而只传递来自 nginx 的证书和加密数据?只是透明地来回传递请求?

client <-- https (nginx signed) --> apache <-- https (nginx signed) --> nginx

其他情况包括:

解密并重新签名: client <-- https (apache signed) --> apache <-- https (nginx signed) --> nginx

后台解密: client <-- https (apache signed) --> apache <-- http --> nginx

这些似乎是可能的,但由于 nginx 服务于多个域,因此 apache 签名不匹配。此外,如果 Apache 仍需要进行签名,它对迁移也没有帮助。

当前基本配置

<VirtualHost *:80>

    ServerName example.com

    ProxyPass / http://127.0.0.1:1001/
    ProxyPassReverse / http://127.0.0.1:1001/
    ProxyPreserveHost On

</VirtualHost>

<VirtualHost *:443>

    ServerName example.com

    ProxyPass / https://127.0.0.1:1002/
    ProxyPassReverse / https://127.0.0.1:1002/
    ProxyPreserveHost On

    # These three lines make Apache sign the requests. Without them I
    # generate SSL_ERROR_RX_RECORD_TOO_LONG errors, but with them the
    # response is always signed with the "example.com" certificate
    SSLCertificateFile /etc/letsencrypt/live/example.com/fullchain.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem
    Include /etc/letsencrypt/options-ssl-apache.conf

    # This options seems to make sense but I'm unsure what it does
    SSLProxyEngine On

</VirtualHost>

答案1

如果我理解正确的话,“端点”是指浏览器客户端?(“端点”通常是指 Web 服务端点,而不是服务消费者......)

“经典” HTTPS 甚至不允许您希望发生的场景。主机名通过 DNS 转换为 Web 服务器的 ip:port(443),然后发生 TLS,这在早期确实完全加密了主机名。因此,作为中间人,您的 apache 如果不拥有证书并解密 TLS 流量,将永远无法找出请求了哪个主机名/域名。

然而。正如经常发生的那样,成本(有限的公共 IP 范围)超过了主体安全性。因此 TLS 扩展了一个名为信噪比(2003 年编纂请求函数),现在很多人都依赖它,它允许服务器选择正确的服务器证书。

我的建议

...既然你已经提到一切都可以通过 HTTP 运行,那么在正面Apache 作为 https 端点......

endpoint <-- front_nginx signed --> front_nginx <-- HTTP --> Apache <-- HTTP --> target_nginx

...最后一步是将 SSL 迁移从 front-nginx 到 target-nginx,然后再解除 Apache 的依赖。

使用 SNI

如果你想依赖信噪比(诚​​然,您可能已经通过虚拟主机设置这样做了),启用 mod_proxy_connect 和禁用 SSLProxyEngine 可能就足够了。最好从 apache 中删除 SSL 证书,以确保它透明地通过连接进行测试。

以下是使用 haproxy 记录的场景:反向代理可以使用带有 SSL 直通的 SNI 吗?

我从未尝试过,所以不清楚详情。也许我提供的链接能对你有所帮助。

[编辑:]附录

(抱歉进行了多次编辑!)感谢您提出这个问题,它让我偶然发现了这一点:https://github.com/Lochnair/xt_tls

这可能会解决您的问题并为我提供一些技巧......

相关内容