
Tengo una aplicación web Django que comparte los puertos externos 80 y 443 con otro servidor. localhost
Funciona bien sin el proxy inverso, pero cuando está habilitado, me encuentro con todo tipo de errores.
¿Cómo hacer que el proxy inverso funcione correctamente?
proxy-inverso.conf:
# SSL Certificate and other SSL configurations
SSLProxyEngine on
ProxyRequests on
SSLProxyVerify require
SSLProxyCheckPeerCN on
SSLProxyCheckPeerName on
SSLProxyCheckPeerExpire on
ProxyPreserveHost on
RequestHeader set X-Forwarded-Proto https
# Reverse Proxy Configuration
ProxyPass "/" "https://192.168.1.83/"
ProxyPassReverse "/" "https://192.168.1.83/"
# Additional SSL configurations if needed
Redireccioné todo http
e https
incluí el proxy anterior en mi archivo de configuración ssl-https. El sitio funciona normalmente.sinla inclusión (es decir, cuando Include .../reverse-proxy.conf
se comenta). Cuando se incluye el proxy inverso, obtengo:
[Thu Jan 18 07:09:39.835368 2024] [ssl:error] [pid 46505:tid 133251102926528] [remote 192.168.1.83:443] AH02039: Certificate Verification: Error (20): unable to get local issuer certificate
[Thu Jan 18 07:09:39.835470 2024] [ssl:error] [pid 46505:tid 133251102926528] [remote 192.168.1.83:443] AH02040: Certificate Verification: Certificate Chain too long (chain has 2 certificates, but maximum allowed are only 1)
[Thu Jan 18 07:09:39.835773 2024] [proxy:error] [pid 46505:tid 133251102926528] (20014)Internal error (specific information not available): [client 119.74.38.81:51224] AH01084: pass request body failed to 192.168.1.83:443 (192.168.1.83), referer: https://acupunctureclassique.duckdns.org/
[Thu Jan 18 07:09:39.835832 2024] [proxy:error] [pid 46505:tid 133251102926528] [client 119.74.38.81:51224] AH00898: Error during SSL Handshake with remote server returned by /login/, referer: https://acupunctureclassique.duckdns.org/
[Thu Jan 18 07:09:39.835861 2024] [proxy_http:error] [pid 46505:tid 133251102926528] [client 119.74.38.81:51224] AH01097: pass request body failed to 192.168.1.83:443 (192.168.1.83) from 119.74.38.81 (), referer: https://acupunctureclassique.duckdns.org/
En la parte delantera:
Proxy Error
The proxy server could not handle the request
Reason: Error during SSL Handshake with remote server
Apache/2.4.58 (Ubuntu) Server at acupunctureclassique.duckdns.org Port 443
Actualizar:
apachectl -S
VirtualHost configuration:
*:443 acupunctureclassique.duckdns.org (/etc/apache2/sites-enabled/acu-le-ssl.conf:2)
*:80 acupunctureclassique.duckdns.org (/etc/apache2/sites-enabled/acu.conf:1)
ServerRoot: "/etc/apache2"
Main DocumentRoot: "/var/www/html"
Main ErrorLog: "/var/log/apache2/error.log"
Mutex ssl-stapling: using_defaults
Mutex proxy: using_defaults
Mutex ssl-cache: using_defaults
Mutex default: dir="/var/run/apache2/" mechanism=default
Mutex watchdog-callback: using_defaults
Mutex rewrite-map: using_defaults
Mutex ssl-stapling-refresh: using_defaults
PidFile: "/var/run/apache2/apache2.pid"
Define: DUMP_VHOSTS
Define: DUMP_RUN_CFG
User: name="www-data" id=33 not_used
Group: name="www-data" id=33 not_used
Respuesta1
El problema real aquí resultó ser, después de discusiones en el chat, que el usuario estaba usando nginx para enviar tráfico a la misma instancia de nginx, creando un bucle de redireccionamiento ordenado, que eventualmente condujo a un mensaje de error de encabezado demasiado grande.
Envías tu tráfico a https://192.168.1.83
. Usted afirma que se trata de un certificado emitido por Let's Encrypt, pero LE lo hará.nuncaemitirá un certificado para 192.168.1.83
, ni ninguna CA pública emitirá dicho certificado. Recuerde que unválidoel certificado no es suficiente,tienepara que coincida con el nombre esperado, que en este caso es 192.168.1.83
. Sus registros también son bastante explícitos sobre esto.
Tienes algunas alternativas:
- Usar HTTP
- Utilice un certificado autofirmado y haga que Apache confíe en él usando
SSLProxyCACertificate
directiva. - Utilice un nombre de dominio válido y adquiera un certificado válido para el nombre de dominio. El nombre de dominio puede resolverse
192.168.1.83
o puede agregarse a/etc/hosts
, pero Apachevoluntadcoincida con el nombre de host y el nombre común (o SAN) en el certificado. - Desactivarverificación de nombre usando
SSLProxyCheckPeerName = off
Deshabilitar la verificación usandoSSLProxyVerify = none
, deshabilitando efectivamente la verificación. Esto es más o menos equivalente a usar http...
Respuesta2
Para invertir el proxy necesita crear un host virtual en /etc/apache2/sites-available. Aquí un ejemplo de dicha configuración de VirtualHost.
<VirtualHost *:80>
ServerName yourdomain.com
ServerAlias www.yourdomain.com
DocumentRoot /path/to/your/django/static/files
Alias /static/ /path/to/your/django/static/files/
<Directory /path/to/your/django/static/files>
Require all granted
</Directory>
ProxyPass / http://localhost:8000/
ProxyPassReverse / http://localhost:8000/
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
<VirtualHost *:443>
ServerName yourdomain.com
ServerAlias www.yourdomain.com
DocumentRoot /path/to/your/django/static/files
Alias /static/ /path/to/your/django/static/files/
<Directory /path/to/your/django/static/files>
Require all granted
</Directory>
SSLEngine on
SSLCertificateFile /path/to/your/ssl/certificate.crt
SSLCertificateKeyFile /path/to/your/ssl/private.key
SSLCertificateChainFile /path/to/your/ssl/chainfile.pem
ProxyPass / https://localhost:8000/
ProxyPassReverse / https://localhost:8000/
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
La parte https es opcional, puedes omitirla si no necesitas https