Apache y Golang (o nodejs o springboot, etc.) con SSLPROXYpass y HTTP2

Apache y Golang (o nodejs o springboot, etc.) con SSLPROXYpass y HTTP2

mi pregunta es sobre "seguridad". Supongo que esta pregunta también es para nodejs o springboot o lo que sea que se ejecute en otro puerto con apache como servidor principal

Estoy probando algunas cosas con la aplicación golang y http2/push.

http2 necesita https

mi aplicación golang está activadahttps://127.0.0.1:7072/ y http2 funciona bien en esto

Después de muchas búsquedas, aquí está mi host virtual (WAMP local, todos los módulos proxy y http2 cargados) que ESTÁ FUNCIONANDO PERO:

<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> 

PERO mi pregunta de seguridad es sobre

SSLProxyVerify none 
SSLProxyCheckPeerCN off
SSLProxyCheckPeerName off
SSLProxyCheckPeerExpire off

si lo elimino hay un 500 en el navegador:

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

Entonces, qué piensas ? Quitar el sslcheck ¿es un problema? ¿Es otra solución elegante para "tengo Apache y quiero realizar una redirección completa pero conservar el dominio en una cuenta en http2?"

Respuesta1

ProxyPass        /  https://127.0.0.1

No hay absolutamente ninguna necesidad y hay pocos beneficios al usar TLS para volver a conectarse aservidor local.
TLS añade seguridad en el transporte para evitar escuchas en las comunicacionesentresistemas y para proporcionar autenticación (mutua), ninguna de las cuales es necesaria para el tráfico que no sale del sistema.

Además: Hasta donde yo sé, ni Apache 2.4 ninginxIncluso admite HTTP/2 en conexiones de proxy inverso ProxyPass de todos modos.

HTTP/2 requiere TLS, pero los beneficios existen principalmente en la conexión entre el cliente y el servidor, no tanto en conexiones LAN de baja latencia o conexiones FastCGI/ProxyPass dentro del propio sistema y generalmente es suficiente terminar HTTP/2 en su front-end y comunicarse en HTTP/1.1 con sus back-end.

Nota: Apache httpd versión 2.5 tieneexperimentalsoporte para 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 (texto sin cifrar)

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

Respuesta2

Algunas cosas para agregar a la respuesta de @HBruijn.

Estás haciendo proxy a una dirección IP:

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

Es raro (aunque no imposible) que un certificado tenga una dirección IP. Es por eso que recibe un error de certificado y por eso eliminó las comprobaciones de error para que esto funcione.

Estoy totalmente de acuerdo con @HBruijn en que usar HTTPS para la conexión de paso de proxy, especialmente cuando está en localhost, es innecesario.

Además, esta conexión se realiza a través de HTTP/1.1 ya que utiliza el httpsprotocolo mod_proxy_http. apache (2,5/maletero y 2.4) sí permite Proxy Pass sobre HTTP/2 usándolo con ( h2) o con HTTPS ( h2c). HTTP/2 no necesita HTTPS; solo lo necesita cuando se usa con el navegador. Por lo tanto, se puede utilizar sin HTTPS para conexiones de paso de proxy. Sin embargo, incluso h2 y h2c entoncesno permitir HTTP/2 Push en conexiones proxypor lo que no hay muchos beneficios al usar esto (especialmente porque todavía está marcado como experimental). La forma recomendada de enviar desde el backend es usar encabezados Link HTTP, que también se pueden hacer a través de conexiones HTTP/1.1.

Para resumir: simplemente conéctese a través de HTTP/1.1 sin HTTPS para evitar tener que desactivar esas comprobaciones de verificación. Aún puedes enviar desde el servidor back-end usando encabezados de enlace.

información relacionada