可以使用Apache作为反向代理从内部服务器提供SSL / TLS证书吗?



我有一个可以通过公共IP访问的Windows Server,其中一些Apache虚拟主机配置为代理传递到具有Web应用程序和服务的各种内部服务器(Apache充当反向代理)。在其中一个内部服务器上,我想使用letsencrypt配置HTTPS。

我设法在内部服务器上获得了工作证书和服务器配置,但问题是我的反向代理(Apache)不想通过隧道传输此HTTPS流量。

编辑:我知道使用证书配置反向代理会更容易,但是Let's Encrypt还没有适用于Windows的良好自动化选项,并且每60天左右手动更改证书将非常乏味。

Apache 2.4 (Windows) 中的虚拟主机配置如下所示:

<VirtualHost *:443>
ServerName somesubdomain.mydomain.com
DocumentRoot "E:/Apache2/htdocs"
DirectoryIndex index.html
ProxyRequests Off
<Proxy *>
Order deny,allow
Allow from all
</Proxy>
ProxyPreserveHost On 
ProxyPass /  https://10.3.1.83/
ProxyPassReverse /   https://10.3.1.83/
</VirtualHost>

在 10.3.1.83 (Ubuntu/Nginx) 上使用 letsencrypt 的 certbot,我生成了有效的证书并将 Nginx 配置为提供 HTTPS 和证书。

当我从局域网内部访问 Ubuntu/Nginx 服务器时,一切都可以正常工作。使用Chrome DevTools,我可以验证它是否具有正确的LetsEncrypt Certificate。

从外部(Internet)访问相应的子域,它会返回一个内部服务器错误页面,并在日志中Apache告诉我以下内容:

AH00961: HTTPS: failed to enable ssl support for 10.3.1.83:443 (10.3.1.83)

编辑:最后我找到了一些答案: 似乎SNI代理没有在Apache中实现,只有"SNI虚拟主机"。不过,可以使用HAProxy或其他项目。

Apache HTTPS 反向代理,带有 SNI 的代理,代理上没有密钥 https://serverfault.com/questions/614806/apache-mod-proxy-with-https-without-key-material-using-sni https://serverfault.com/questions/625362/can-a-reverse-proxy-use-sni-with-ssl-pass-through/625364

我认为您必须通过在代理上设置加密来加密从反向代理到客户端的流量。

如果有的话,您的内部网络服务器和代理也可以通过在 interna NO(但已编辑).l 服务器上设置 SSL 来共享 SSL 通信。

但是您不能为它们使用一个证书(或者这意味着您在多个服务器上使用相同的私钥/公共证书......

为什么会这样?因为如果流量在客户端和后端服务器之间加密,那么代理将无法读取 HTTP 请求的"主机"标头和其他有用的标头,因此将无法中继甚至理解请求......

因此,除非您复制证书,否则我的答案是...不,:-)

您的证书集中在您的代理上也不错......从证券的角度来看,它的风险更大(风险集中),但从管理的角度来看,它更容易(集中精力)。

编辑:如果您想吸引大量受众,包括我假设的过时的浏览器或开发库,答案是否定的(在其他情况下是肯定的,请参阅下面的对话)。

最新更新