我的问题是关于“安全性”我想这个问题也适用于 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进行代理传递连接——尤其是在本地主机上时——是没有必要的。
此外,由于此连接使用https
mod_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 标头从后端服务器推送。