我有一个矩阵主服务器和一个 Django Web 应用程序,分别位于192.168.81
和的虚拟机上192.168.83
。主服务器使用矩阵-docker-ansible-deploy并在 nginx 上运行。它通过以下方式获取和更新 SSL 证书特拉菲克和让我们加密。
Web 应用程序使用自己的 Let's Encrypt 证书。虽然我可以并且已经让它们独立工作,但我无法让它们在相同的 80 和 443 端口上协同工作。
在 Web 应用程序端设置反向代理以从其域转移流量后,如下所示:
SSLEngine On
SSLCertificateFile /etc/letsencrypt/live/mysite.org/cert.pem
SSLCertificateKeyFile /etc/letsencrypt/live/mysite.org/privkey.pem
SSLCertificateChainFile /etc/letsencrypt/live/mysite.org/fullchain.pem
# Enable SSL Proxy Engine
SSLProxyEngine On
ProxyPass / https://192.168.1.83/
ProxyPassReverse / https://192.168.1.83/
我得到:
[Wed Jan 17 07:13:21.567813 2024] [core:notice] [pid 33994:tid 125031783462784] AH00094: Command line: '/usr/sbin/apache2'
[Wed Jan 17 07:15:23.409061 2024] [proxy:error] [pid 34272:tid 125031640188608] (20014)Internal error (specific information not available): [client 192.168.1.85:44054] AH01084: pass request body failed to 192.168.1.83:443 (192.168.1.83)
[Wed Jan 17 07:15:23.409180 2024] [proxy:error] [pid 34272:tid 125031640188608] [client 192.168.1.85:44054] AH00898: Error during SSL Handshake with remote server returned by /
[Wed Jan 17 07:15:23.409209 2024] [proxy_http:error] [pid 34272:tid 125031640188608] [client 192.168.1.85:44054] AH01097: pass request body failed to 192.168.1.83:443 (192.168.1.83) from 192.168.1.85 ()
[Wed Jan 17 07:15:23.715825 2024] [proxy:error] [pid 34273:tid 125031648581312] (20014)Internal error (specific information not available): [client 192.168.1.85:44070] AH01084: pass request body failed to 192.168.1.83:443 (192.168.1.83), referer: https://192.168.1.83/
[Wed Jan 17 07:15:23.715945 2024] [proxy:error] [pid 34273:tid 125031648581312] [client 192.168.1.85:44070] AH00898: Error during SSL Handshake with remote server returned by /favicon.ico, referer: https://192.168.1.83/
[Wed Jan 17 07:15:23.715970 2024] [proxy_http:error] [pid 34273:tid 125031648581312] [client 192.168.1.85:44070] AH01097: pass request body failed to 192.168.1.83:443 (192.168.1.83) from 192.168.1.85 (), referer: https://192.168.1.83/
更新:
由于在同一端口上运行两台服务器几乎肯定会搞乱 SSL 认证(除非我们希望它们共享相同的证书,并在单独的服务器上使用反向代理将来自不同域的流量重定向到各自的内部服务器),因此我想使用 80 和 443 以外的端口托管我的网络应用程序。
我该如何做呢?
答案1
这是因为后端 192.168.1.83:443 提供的 SSL/TLS 证书无效,因为有效证书始终需要一个域名。
我相信如果你在哪里打开https://192.168.1.83/在浏览器中(当然假设 IP 192.168.1.83 是可访问的),您会收到“连接不安全”警告。
您的选择是(大致按难度排序):
- 盲目信任后端网络并仅在正向代理上使用 SSL,通过纯 http 连接到后端。如果您的 apache 正向代理与这些虚拟机在同一台机器上运行,并且您同时控制正向代理和虚拟机,那么这就是我要做的。
- 不信任后端网络,并在前端和后端都进行加密,那么您要么需要
- 使用对证书有效的域名连接到后端(可能在 hosts 文件中配置域名的 IP),确保证书本身有效且已更新
- 在 apache 配置中明确为此连接设置对证书的信任
- 为后端服务设置自己的 ca,并将其配置为正向代理上的受信任(但请注意,一旦处理自己的 CA,您很容易陷入危险区域!)
- 我不建议在没有正确验证证书(例如禁用
SSLProxy*
选项)的情况下将正向代理配置为通过 SSL 连接,而是在后端网络受信任时选择选项 1,如果不可信,则选择上述三个选项之一。
- 仅在后端加密并使用 SNI 负载平衡代替 Apache 正向代理将 https 流量转发到后端而无需重新加密(在我看来,这是一个比选项 1 更高级的设置,我不知道 apache 是否适合这个应用程序)。