Solución al error "peer closed connection in SSL handshake while SSL handshaking to upstream" con Nginx como proxy inverso y Apache como backend

Artículos Guías Manuales Sistemas Linux Windows Redes MySql Binario 0 Binario Cero

Cuando se utiliza Nginx como proxy inverso frente a un servidor Apache, puede ocurrir el siguiente error en los registros de Nginx:

[error] 349#349: *44 peer closed connection in SSL handshake while SSL handshaking to upstream, client: 172.68.92.148, server: example.com, request: "GET /favicon.ico HTTP/2.0", upstream: "https://192.168.20.14:443/favicon.ico", host: "example.com", referrer: "https://example.com/path"
[error] 349#349: *46 peer closed connection in SSL handshake while SSL handshaking to upstream, client: 172.70.57.184, server: example1.com, request: "GET / HTTP/2.0", upstream: "https://192.168.20.17:443/", host: "example1.com"
[error] 349#349: *12 peer closed connection in SSL handshake while SSL handshaking to upstream, client: 162.158.123.23, server: example1.com, request: "GET /favicon.ico HTTP/2.0", upstream: "https://192.168.20.17:443/favicon.ico", host: "example1.com", referrer: "https://example1.com/"

Causa del problema

Este error ocurre debido a un conflicto en la configuración de Apache cuando se utiliza la directiva RemoteIPProxyProtocol On. Esta configuración no es compatible con el tráfico SSL enviado desde Nginx a Apache a través del protocolo HTTPS, lo que provoca que la conexión SSL falle durante el "handshake".

Solución

Para resolver este problema, es necesario deshabilitar la configuración RemoteIPProxyProtocol en Apache y asegurarse de que se utilice únicamente la directiva RemoteIPHeader para pasar la dirección IP real del cliente desde Nginx.

Pasos a seguir

  1. Editar el archivo de configuración de Apache: Abra el archivo de configuración principal de Apache, generalmente ubicado en /etc/apache2/apache2.conf:

    sudo nano /etc/apache2/apache2.conf
  2. Comentar o eliminar la línea RemoteIPProxyProtocol On: Busque la línea siguiente:

    RemoteIPProxyProtocol On

    Y coméntela añadiendo un # al inicio de la línea, o elimínela por completo:

    #RemoteIPProxyProtocol On
  3. Asegurarse de que RemoteIPHeader esté configurado correctamente: Asegúrese de que la directiva RemoteIPHeader esté configurada para aceptar el encabezado X-Forwarded-For, que es enviado por Nginx:

    RemoteIPHeader X-Forwarded-For
  4. Guardar los cambios y reiniciar Apache: Guarde el archivo y cierre el editor. Luego reinicie Apache para aplicar los cambios:

    sudo systemctl restart apache2
  5. Verificar la configuración en Nginx: Asegúrese de que Nginx esté configurado para pasar el encabezado X-Forwarded-For. Esto suele estar configurado por defecto, pero puede verificarse en el bloque server o location del archivo de configuración de Nginx:

    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  6. Revisar los registros: Después de realizar los cambios, monitoree los registros de Nginx y Apache para confirmar que el error ha sido resuelto y que las solicitudes se procesan correctamente.

Conclusión

El error "peer closed connection in SSL handshake while SSL handshaking to upstream" suele deberse a una configuración incorrecta de Apache al usar RemoteIPProxyProtocol con SSL. Al deshabilitar esta opción y utilizar solo RemoteIPHeader X-Forwarded-For, se soluciona el problema y se asegura que Nginx pase correctamente la IP del cliente al servidor Apache.