使用远程服务器进行 SSL 握手时出错

我有 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
219383 次浏览

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

在 Apache 2.4及以上版本中,有不同的默认值和一个新指令。

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

SSLProxyEngine on
SSLProxyVerify none
SSLProxyCheckPeerCN off
SSLProxyCheckPeerName off
SSLProxyCheckPeerExpire off

面临着与 OP 相同的问题:

  • Tomcat 在通过 SOAPUI 直接访问时返回响应
  • 没有加载 html 文件
  • 当使用前面答案中提到的 Apache 属性时,出现了网页,但 AngularJS 无法获得 HTTP 响应

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

我有2个服务器设置在多克,反向代理和网络服务器。 这个错误在一年后突然出现在我所有的网站上。 在早些时候进行设置时,我在 Web 服务器上生成了一个自签名证书。

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

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

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

由于我需要从本地机器的浏览器访问 web 应用程序,我想用 Apache httpd 设置一个反向代理(HTTP 到 HTTPS 映射)。现在我可以通过下面的网址从我的本地浏览器访问网络应用程序:

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/ProxyPassRT 中使用 url 模式(/sample) ,但是这导致了 css/js 文件的 HTTP 404(没有找到) ,因为 web 应用的欢迎页面包含了间接的 css/js 路径(下面的示例代码)。因此,用(/)代替 url pattern (/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>

请注意,当您的系统禁用 TLSv1时,也可能发生此错误。比如 Ubuntu 20.x 默认禁用了 TLSv1.0。例如,如果你有这样的东西:

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

SSLProxyVerify等将 没有帮助你。

您需要做的是在 openssl.conf中启用 TLS 1.0。至少在你能更新旧服务器之前..。

在 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 版本的注释

下面是我的这个主题的变体,灵感来自 这个 Git 要点。该服务器是一个 Docker 容器,具有内部自签名的 SSL 证书,可在 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 OnRequestHeader...之间的部分我通过谷歌和尝试和错误放在一起。也许有些设置是不需要的,YMMV。

注意: 需要使用带有 "wss"RewriteRule,因为服务器使用安全的 websockets。

平台: Ubuntu 20.04.3 LTS,Apache 2.4.41。

我的问题是一台 Apache 服务器在另一台后面,而且每台服务器上都有不匹配的证书。

我花了一段时间才意识到

SSLCertificateFile

还有

SSLCertificateKeyFile

指向每个服务器上具有相同名称的文件,但是与第二个服务器相比,第一个服务器具有更新的证书和私钥,因此文件的内容是不同的。