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。 1.1 與後端通訊。

注意:Apache httpd 版本 2.5 有實驗性的支援 HTTP/2https://httpd.apache.org/docs/trunk/mod/mod_proxy_http2.html

HTTP/2 (TLS)

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 進行代理傳遞連接 - 特別是當它位於本地主機上時 - 是不必要的。

此外,此連接是透過 HTTP/1.1 進行的,因為它使用httpsmod_proxy_http 協定。阿帕契(2.5/後車廂 2.4h2) 確實允許將其與 ( ) 或 HTTPS ( ) 一起使用透過 HTTP/2 進行代理傳遞h2c。 HTTP/2 不需要 HTTPS - 僅當與瀏覽器一起使用時才需要它。因此它可以在沒有 HTTPS 的情況下用於代理傳遞連線。然而即使是 h2 和 h2c不允許代理連線上的 HTTP/2 Push所以使用它根本沒有多大好處(特別是因為它仍然被標記為實驗性的)。從後端推送的建議方法是使用連結 HTTP 標頭 - 這也可以透過 HTTP/1.1 連線完成。

總結一下:只需透過 HTTP/1.1 連線而不使用 HTTPS,以避免關閉這些驗證檢查。您仍然可以使用連結標頭從後端伺服器推送。

相關內容