Apache 和 Golang(或 nodejs 或 springboot 等)带有 SSLPROXYpass 和 HTTP2

Apache 和 Golang(或 nodejs 或 springboot 等)带有 SSLPROXYpass 和 HTTP2

我的问题是关于“安全性”我想这个问题也适用于 nodejs 或 springboot 或以 apache 作为主服务器在另一个端口上运行的任何内容

我正在尝试使用 golang 应用程序和 http2/push

http2 需要 https

我的 golang 应用程序已开启https://127.0.0.1:7072/ 并且 http2 运行良好

经过多次搜索后,这里是我的虚拟主机(本地 WAMP,所有代理模块和 http2 已加载),它可以正常工作,但是:

<VirtualHost mygolang:443>

DocumentRoot "c:/wamp64/www"
ServerName mygolang:443
ServerAdmin [email protected]
ErrorLog "c:/wamp64/bin/apache/apache2.4.27/logs/ssl_error.log"
TransferLog "c:/wamp64/bin/apache/apache2.4.27/logs/access.log"


SSLEngine on
SSLProxyEngine on
SSLProxyVerify none 
SSLProxyCheckPeerCN off
SSLProxyCheckPeerName off
SSLProxyCheckPeerExpire off


SSLCertificateFile "C:\wamp64\bin\apache\apache2.4.27\conf\cert\certificate.crt"
SSLCertificateKeyFile "C:\wamp64\bin\apache\apache2.4.27\conf\key/private.key"

<FilesMatch "\.(cgi|shtml|phtml|php)$">
    SSLOptions +StdEnvVars
</FilesMatch>
<Directory "c:/wamp64/www">
    SSLOptions +StdEnvVars
</Directory>


BrowserMatch "MSIE [2-5]" \
     nokeepalive ssl-unclean-shutdown \
     downgrade-1.0 force-response-1.0

CustomLog "C:\wamp64\bin\apache\apache2.4.27\logs\ssl_request.log" \
      "%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"

ProxyRequests On
ProxyPreserveHost On
ProxyVia full
<proxy>
    Order deny,allow
    Allow from all
  </proxy>

  ProxyPass        /  https://127.0.0.1:7072/
  ProxyPassReverse /  https://127.0.0.1:7072/
</VirtualHost> 

但我的安全问题是关于

SSLProxyVerify none 
SSLProxyCheckPeerCN off
SSLProxyCheckPeerName off
SSLProxyCheckPeerExpire off

如果我删除它,浏览器中会出现 500:

Proxy Error
The proxy server could not handle the request GET /.

Reason: Error during SSL Handshake with remote server

Apache/2.4.27 (Win64) OpenSSL/1.1.0f PHP/7.1.9 Server at mygolang Port 443

那么,您怎么看?删除 sslcheck 有问题吗?对于“我有 apache 并且想要完全重定向但在 http2 上的一个帐户上保留域”来说,这是另一个优雅的解决方案吗?

答案1

ProxyPass        /  https://127.0.0.1

完全没有必要使用 TLS 连接回本地主机TLS
增加了传输安全性,以防止窃听通信之间系统并提供(相互)身份验证,但这对于不离开系统的流量来说都不是必需的。

此外:据我所知,Apache 2.4 和nginx甚至在 ProxyPass 反向代理连接上支持 HTTP/2。

HTTP/2 需要 TLS,但其好处主要存在于客户端和服务器之间的连接,而不是低延迟 LAN 连接,或系统本身内的 FastCGI/ProxyPass 连接,并且通常终止前端的 HTTP/2 并通过 HTTP/1.1 与后端进行通信就足够了。

注意:Apache httpd 版本 2.5 已实验支持 HTTP/2https://httpd.apache.org/docs/trunk/mod/mod_proxy_http2.html

HTTP/2(传输层安全协议)

ProxyPass "/app" "h2://app.example.com"
ProxyPassReverse "/app" "https://app.example.com"

HTTP/2(明文)

ProxyPass "/app" "h2c://app.example.com"
ProxyPassReverse "/app" "http://app.example.com"

答案2

对@HBruijn 的回答补充几点。

您正在代理一个 IP 地址:

ProxyPass        /  https://127.0.0.1:7072/
ProxyPassReverse /  https://127.0.0.1:7072/

证书中包含 IP 地址的情况很少见(但并非不可能)。因此,这就是您收到证书错误的原因,也是您必须删除错误检查才能使其正常工作的原因。

我完全同意@HBruijn的观点,使用HTTPS进行代理传递连接——尤其是在本地主机上时——是没有必要的。

此外,由于此连接使用httpsmod_proxy_http 协议,因此它通过 HTTP/1.1 进行连接。Apache (2.5/后备箱 2.4) 允许通过 HTTP/2 代理传递,将其与 ( h2) 或 HTTPS ( h2c) 一起使用。HTTP/2 不需要 HTTPS - 只有在与浏览器一起使用时才需要它。因此,它可以在没有 HTTPS 的情况下用于代理传递连接。但是,即使 h2 和 h2c 也不允许通过代理连接进行 HTTP/2 推送因此使用它根本没有什么好处(尤其是它仍然被标记为实验性的)。从后端推送的推荐方法是使用 Link HTTP 标头 - 这也可以通过 HTTP/1.1 连接完成。

总结一下:只需通过 HTTP/1.1 连接,无需 HTTPS,即可避免关闭这些验证检查。您仍然可以使用 Link 标头从后端服务器推送。

相关内容