将 Apache2 SSL 设置为反向代理

将 Apache2 SSL 设置为反向代理

我有一个 Web 应用程序,用于处理需要公开披露的潜在敏感信息。不幸的是,它内置了自己专有的 Web 服务器,不支持 SSL。由于软件审批流程,我不得不使用 Apache 作为反向代理。

我几乎完全可以正常工作,通过 SSL 直接访问任何页面都可以完美运行,但 Web 服务器发送的重定向不会被重写。例如尝试访问根 URLhttps://frontend.example.tld:4000/当您未登录时应将您重定向至https://frontend.example.tld:4000/login但它却重定向到http://frontend.example.tld:4000/login这会导致 BadRequest。

我对此进行的所有谷歌搜索都表明过时的设置似乎在 apache2 中不再可用,并建议更改代理后面的应用程序来处理它(不幸的是这不是一个选项)。

这是我的 apache 配置的相关部分:

<IfModule mod_ssl.c>
  Listen 4000

  <VirtualHost *:4000>
    ServerAdmin webmaster@localhost
    ServerName frontend.example.tld

    CustomLog ${APACHE_LOG_DIR}/ssl_access.log combined
    CustomLog ${APACHE_LOG_DIR}/ssl_request_log "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"
    ErrorLog ${APACHE_LOG_DIR}/error.log
    LogLevel info

    SSLProtocol -ALL +SSLv3 +TLSv1
    SSLCipherSuite ALL:!ADH:!EXPORT56:!EXP:!eNULL:!aNULL:RC4+RSA:+HIGH:+MEDIUM:!LOW:!SSLv2

    SSLEngine on
    SSLCertificateFile    /etc/ssl/certs/frontend.crt
    SSLCertificateKeyFile /etc/ssl/private/frontend.key
    SSLCertificateChainFile  /etc/ssl/certs/gd_bundle.crt

    BrowserMatch "MSIE [2-6]" nokeepalive ssl-unclean-shutdown downgrade-1.0 force-response-1.0
    BrowserMatch "MSIE [17-9]" ssl-unclean-shutdown

    ProxyRequests Off
    ProxyPreserveHost On

    ProxyPass / http://127.0.0.1:3000/
    ProxyPassReverse / http://127.0.0.1:3000/
  </VirtualHost>
</IfModule> 

我在其他地方加载了代理和 proxy_http 模块。

更新:

以下是尝试重定向后收到的错误消息的内容:

错误的请求

您的浏览器发送了一个此服务器无法理解的请求。原因:您正在向启用 SSL 的服务器端口发送纯 HTTP 请求。请使用 HTTPS 方案访问此 URL。提示: https://frontend.example.tld/

答案1

似乎应用程序正在Location根据传入标头的内容生成该标头Host,这正是我们想要的(并由 实现ProxyPreserveHost),但它不知道新位置的正确协议。

根据应用程序的工作方式,我们有几种处理此问题的选项:

  1. 转过头来ProxyPreserveHost Off看看是否有帮助;生成的Location标题应该与您现有的标题相匹配ProxyPassReverse,并相应地修改为正确的 URL,或者如果这不起作用;
  2. 添加新ProxyPassReverse行(保留旧行)尝试匹配并更改Location应用程序正在发送的标头。

    ProxyPassReverse / http://frontend.example.tld:4000/
    

答案2

我遇到了类似的问题,我的配置中缺少以下几行,但它帮我解决了:

    SSLProxyEngine          On
    SSLProxyVerify          none
    SSLProxyCheckPeerCN     off

将这些行放在 之后SSLEngine On

相关内容