it-swarm-es.com

¿Cómo fuerzo a Apache a usar HTTPS junto con AJP?

Tenemos un sitio web Apache, con ciertas partes impulsadas por JBoss. La pregunta es, ¿cómo podemos hacer que Apache obligue a que todas las solicitudes HTTP sean redirigidas al equivalente HTTPS?

En nuestro antiguo servidor (CentOS 4, Apache 2.0, mod_jk), tenemos la siguiente configuración:

<VirtualHost 1.2.3.4:80>
Redirect / https://www.foo.com/
</VirtualHost>

Esto funciona muy bien: cualquier solicitud a una página web PHP, Vanilla HTML o JBoss se redirige. Sin embargo, en nuestro nuevo servidor (CentOS 5, Apache 2.2, mod_proxy_ajp), la misma configuración solo funciona para las páginas de Vanilla, no para nada que se envíe a JBoss usando AJP.

También probé lo siguiente, que encontré en http://www.webmasterworld.com/Apache/3050511.htm :

<Proxy *>
    RewriteEngine on
    RewriteCond %{SERVER_PORT} !^443$
    RewriteRule ^.*$ https://%{SERVER_NAME}%{REQUEST_URI} [L,R]
</Proxy>

Pero todavía no hubo suerte. Siento que me estoy perdiendo algo obvio. ¿Alguna ayuda?

PD No soy de ninguna manera un experto en Apache. Me disculpo si resulta ser una pregunta para principiantes :-P.

5
Matt Solnit

Si lo entiendo correctamente, desea actualizar todas las solicitudes http a https. Si esto es correcto, intente esto

<VirtualHost ip:80>
   ServerName www.company.com

   RedirectMatch permanent ^(.*)$ https://www.company.com$1
</VirtualHost>

<VirtualHost ip:443>
   ServerName www.company.com

   Include vhosts.d/includes/ssl.conf

   # assumes you want to proxy everything on this vhost to jboss:8009
   <Location / >
       ProxyPass ajp://jboss:8009/
   </Location>
</VirtualHost>
9
Dave Cheney

Esta sintaxis redirigirá a HTTPS manteniendo el host y la URL iguales:

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule .* https://%{HTTP_Host}%{REQUEST_URI} [R=301,L]

A veces solo desea redirigir un directorio, es decir, un área de administración:

RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^/admin(|/.*)$ https://%{HTTP_Host}%{REQUEST_URI} [R=301,L]
5
Mauricio Sánchez

Independientemente de cómo lo resuelva, puedo sugerir que coloque la directiva SSLRequireSSL en las ubicaciones en las que desea que solo sea SSL. De esa manera, si hay un error de configuración más adelante en el proceso, no se expone nada a través de una conexión que no sea SSL.

2
CK.

La sintaxis más eficiente para la redirección SSL es usar Apache env var HTTPS

Te gusta esto:

Reescritura de host

RewriteEngine On
RewriteCond %{HTTPS} !=on
RewriteRule .* https://yourhost.com%{REQUEST_URI} [R,L]

Sin reescritura de Host

RewriteEngine On
RewriteCond %{HTTPS} !=on
RewriteRule .* https://%{HTTP_Host}%{REQUEST_URI} [R,L]

En lo que respecta a mod_jk vs Apache2.2 ajp proxy, uso mod_jk solo porque encuentro que JkMount y JkUnMount son útiles cuando necesitas separar contenido estático y dinámico, yo diría que es más sencillo. La forma en que estructuro mis configuraciones es con condicional, incluido para ssl. Entonces tengo un httpd.conf para cada Host, tengo un directorio para cada conf que incluye la siguiente manera:

/etc/httpd/test_conf.httdp.conf:

SeverName test.com
ServerRoot /etc/httpd
LoadModule jk_module modules/mod_jk.so
LoadModule ssl_module/mod_ssl.so
(snip)
Include conf/test_com/*.conf

/etc/httpd/test_conf/mod_jk.conf

<IfModule jk_module>
JkWorkersFile conf/test_conf/workers.properties

JkLogFile logs/test_conf/mod_jk.log 

JkLogLevel error

JkLogStampFormat "[%a %b %d %H:%M:%S %Y]"

JkRequestLogFormat "%w %V %T"

RewriteEngine on
RewriteCond %{REQUEST_METHOD} ^(PUT|DELETE|TRACK|OPTIONS|TRACE)
RewriteRule .* - [F] 

JkMount /* loadbalancer
JkUnMount /error* loadbalancer

JkShmFile run/jk.shm

<Location /jkstatus/>
JkMount status
Order deny,allow
Deny from all
Allow from 127.0.0.1
</Location>

</IfModule>

/etc/httpd/conf/test_conf/workers.properties

worker.list=loadbalancer,status

worker.node1.port=8009
worker.node1.Host=192.168.1.100
worker.node1.type=ajp13
worker.node1.lbfactor=2
worker.node1.ping_mode=A
worker.node1.connect_timeout=10000
worker.node1.prepost_timeout=10000
worker.node1.socket_timeout=90
worker.node1.connection_pool_timeout=600
worker.node1.method=R
worker.node1.fail_on_status=500,501,502,503

worker.node2.reference=worker.node1
worker.node2.Host=192.168.1.200

worker.loadbalancer.type=lb
worker.loadbalancer.balance_workers=node1,node2
worker.loadbalancer.sticky_session=true
worker.status.type=status

/etc/httpd/conf/test_conf/httpd-ssl.conf

<IfModule ssl_module>
Listen 192.200.10.100:443

RewriteEngine On
RewriteCond %{HTTPS} !=on
RewriteRule .* https://%{HTTP_Host}%{REQUEST_URI} [R,L]

(snip)
<VirtualHost 192.200.10.100:443>

DocumentRoot "/var/www/test.com/htdocs"
ServerName test.com
(snip)
SSLEngine on
SSLProtocol all -SSLv2 
SSLCipherSuite DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:EDH-RSA-DES-CBC3-SHA:AES256-SHA:DES-CBC3-SHA:AES128-SHA:RC4-SHA

SSLCertificateFile "conf/test_conf/ssl/test_com.crt"
SSLCertificateKeyFile "conf/test_conf/ssl/test_com.key"
SSLCACertificateFile "conf/test_conf/ssl/VerisignIntermediate.crt"


BrowserMatch ".*MSIE.*" \
         nokeepalive ssl-unclean-shutdown \
         downgrade-1.0 force-response-1.0

JkMount /* loadbalancer
JkUnMount /error* loadbalancer

JkStripSession On

</VirtualHost>
</IfModule>
2
feniix