让我们拥有一个具有有效 TLS 证书的网络服务器,名为 b.my.tld。
我想在 a.my.tld 上配置 apache2 作为 b.my.tld 的反向代理。因此我添加了
ProxyPass / https://b.my.tld/
ProxyPassReverse / https://b.my.tld/
我的问题是:服务器 a 上的 apache2 无法连接到 b.my.tld,因为它需要 a.my.tld 的 TLS 证书,而不是 b 的。
是否有可能配置 apache2 以接受特定主机名的证书 - 或者 ProxyPass/ProxyPassReverse 中定义的主机名的证书?
答案1
如果您有https://b.my.tld/
并且 apache 需要 a.my.tld,那是因为您可能ProxyPreserveHost on
在其他地方使用了您未提及的内容。否则它将需要 b.my.tld 的证书。
无论如何,理想情况下,您反向代理的主机应该具有与其主机名匹配的证书(如今由于 Google 的特性,DNS 而不是 CN 条目应该足够了。)但是对于那些需要例外的情况,对于这种情况以及您使用的情况ProxyPreserveHost on
,Apache HTTPD 可以忽略目标证书名称:
SSLProxyCheckPeerName off
答案2
要将 Apache2 配置为具有自己的 TLS 证书的其他域(在本例中为 b.my.tld)的反向代理,您需要使用指令SSLProxyEngine
并专门为反向代理配置虚拟主机。操作方法如下:
- 确保
proxy
和proxy_http
模块在 Apache 中已启用:
sudo a2enmod proxy
sudo a2enmod proxy_http
- 为a.my.tld创建一个新的虚拟主机配置文件:
sudo nano /etc/apache2/sites-available/a.my.tld.conf
- 在虚拟主机配置文件中,设置反向代理并指定 TLS 设置:
<VirtualHost *:443>
ServerName a.my.tld
SSLEngine On
SSLProxyEngine On
SSLCertificateFile /path/to/a.my.tld.crt
SSLCertificateKeyFile /path/to/a.my.tld.key
ProxyPass / https://b.my.tld/
ProxyPassReverse / https://b.my.tld/
</VirtualHost>
确保将/path/to/a.my.tld.crt
和替换/path/to/a.my.tld.key
为 a.my.tld 的 SSL 证书和私钥文件的实际路径。
- 启用新的虚拟主机并重新加载 Apache:
sudo a2ensite a.my.tld.conf
sudo systemctl reload apache2
现在,服务器 a 上的 Apache 将充当 b.my.tld 的反向代理,并在与 b.my.tld 通信时使用为 a.my.tld 指定的 SSL 证书。此配置允许您在反向代理级别处理 SSL 终止,同时安全地提供来自后端服务器 (b.my.tld) 的内容。