143

我有Apache2(在 443 上收听)和一个正在运行的网络应用程序Tomcat7(在 8443 上收听)Ubuntu

我将apache2设置为反向代理,以便通过端口443而不是8443访问Web应用程序。此外,我不仅需要在浏览器和apache2之间进行SSL通信,还需要在apache2和tomcat7之间进行SSL通信,因此我在apache2和tomcat7上都设置了SSL . 如果我尝试通过直接联系 tomcat7 来访问 Web 应用程序,一切都很好。问题是当我尝试通过 apache2(反向代理)访问 tomcat 的 web 应用程序时,在浏览器上出现错误:

Proxy Error
The proxy server could not handle the request GET /web_app.
Reason: Error during SSL Handshake with remote server
4

6 回答 6

324

MK 的评论为我指明了正确的方向。

对于 Apache 2.4 及更高版本,有不同的默认值和新指令。

我正在运行 Apache 2.4.6,我必须添加以下指令才能使其正常工作:

SSLProxyEngine on
SSLProxyVerify none 
SSLProxyCheckPeerCN off
SSLProxyCheckPeerName off
SSLProxyCheckPeerExpire off
于 2014-02-27T13:14:25.250 回答
5

我在 docker、反向代理和 Web 服务器上设置了 2 台服务器。一年后,我的所有网站突然开始发生此错误。之前设置时,我在 Web 服务器上生成了一个自签名证书。

所以,我不得不再次生成 SSL 证书,它开始工作......

openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout ssl.key -out ssl.crt

于 2019-05-05T06:04:47.927 回答
2

面临与OP相同的问题:

  • Tomcat 直接通过 SOAP UI 访问时返回响应
  • 没有加载 html 文件
  • 使用上一个答案中提到的 Apache 属性时,出现网页但 AngularJS 无法获得 HTTP 响应

Tomcat SSL 证书已过期,而浏览器显示它是安全的 - Apache 证书远未过期。更新 Tomcat KeyStore 文件解决了这个问题。

于 2017-10-13T13:52:46.510 回答
1

在远程 OEL (Oracle Enterprise Linux) 7.8 服务器上,我有一个使用 HTTPS/8009 运行的后端 Web 应用程序。作为第三方应用程序,我没有选择禁用 SSL 或更改端口。

由于我需要从本地计算机的浏览器访问 Web 应用程序,我想到了使用 Apache httpd 设置反向代理(HTTP 到 HTTPS 映射)。现在我可以通过以下 URL 从本地浏览器访问 Web 应用程序:

http://10.157.146.97:1234/

仅供参考,在 Linux 机器内工作的 CURL 命令如下:

curl http://10.157.146.97:1234/
curl -k https://localhost:8009/

这是我的反向代理设置:

/etc/httpd/conf/httpd.conf

Listen 1234

<VirtualHost *:1234>
SSLProxyEngine On
SSLProxyVerify none
SSLProxyCheckPeerCN off
SSLProxyCheckPeerName off
SSLProxyCheckPeerExpire off
ProxyPreserveHost On
ProxyPass / https://localhost:8009/
ProxyPassReverse / https://localhost:8009/
</VirtualHost>

一方面我很挣扎,早些时候我尝试在 ProxyPass/ProxyPassReverse 中使用 url 模式(/sample),但这导致 css/js 文件出现 HTTP 404(未找到),因为 web-app 的欢迎页面包含间接 css/js 路径(下面的示例代码)。所以用 (/) 替换 url 模式 (/sample) 也解决了这个问题。

previous Not working config:
ProxyPass /sample https://localhost:8009/
ProxyPassReverse /sample https://localhost:8009/

<script defer src="abc.js"></script><link href="xyz.css" rel="stylesheet"></head>  
于 2021-09-12T15:11:13.420 回答
1

请注意,当您的系统禁用 TLSv1 时,也可能会发生该错误。例如,Ubuntu 20.x 默认禁用 TLSv1.0。例如,如果您有这样的事情:

Apache 2.4.41 on Ubutntu20 (proxy) --[https]--> old Apache serving TLS v1.0

SSLProxyVerify不会帮助你。

您需要做的是在openssl.conf. 至少在您可以更新旧服务器之前...

在 Ubuntu 上启用旧 TLS

所以在 Ubuntu 20.04.3 TLS 中有效地启用了 TLSv1 更改/etc/ssl/openssl.cnf。在文件顶部(在任何部分之前)添加:

# Added to enable TLS1.0
openssl_conf = default_conf

在文件的最后

##
# Added to enable TLS1.0
[default_conf]
ssl_conf = ssl_sect

[ssl_sect]
system_default = system_default_sect

[system_default_sect]
CipherString = DEFAULT@SECLEVEL=1
##

注释显然不是必需的,但在您想再次禁用 TLS1 时会有所帮助。

重新启动/重新启动后,一切都应该正常。

请注意,这是一个全局(系统范围)更改。所以它并不理想,但它确实有效。另请参阅:有关 Ubuntu 和默认 TLS 版本的更多说明

于 2021-11-02T20:07:04.700 回答
0

这是我对这个主题的变体,灵感来自这个 Git gist。服务器是一个带有内部自签名 SSL 证书的 Docker 容器,可在https://localhost:8443. 代理到server.example.org:443. 相关配置细节:

<VirtualHost AAA.BBB.CCC.DDD:443>
    ServerName server.example.org

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined

    # These settings are definitely needed
    SSLEngine On
    SSLProxyEngine On
    ProxyRequests Off
    SSLProxyVerify none 
    SSLProxyCheckPeerCN off
    SSLProxyCheckPeerName off
    SSLProxyCheckPeerExpire off

    # These may not be needed, depending on proxied application
    ProxyPreserveHost on
    RequestHeader set X-Forwarded-Proto https

    ProxyPass "/" "https://localhost:8443/"
    RewriteEngine on
    RewriteCond %{HTTP:Upgrade} websocket [NC]
    RewriteCond %{HTTP:Connection} upgrade [NC]
    RewriteRule ^/?(.*) "wss://localhost:8443/$1" [P,L]
    ProxyPassReverse "/" "https://localhost:8443/"
</VirtualHost>

SSLEngine On我和我之间的部分是RequestHeader...通过谷歌搜索和反复试验拼凑起来的。也许其中一些设置是不需要的,YMMV。

注意:需要RewriteRulewith"wss"是因为服务器使用安全的 websocket。

平台:Ubuntu 20.04.3 LTS、Apache 2.4.41。

于 2021-12-07T13:09:03.260 回答