¿Puedo definir HTTP y HTTPS en el mismo VirtualHost en Apache conf?

13

Tengo una gran definición de VirtualHost que no quiero duplicar solo para que el sitio también se ejecute a través de HTTPS.

Esto es lo que quiero hacer:

<VirtualHost *>
    ServerName example.com

    <If port=443>
        SSLEngine on
        SSLCertificateFile ...
        SSLCertificateKeyFile ...
        SSLCertificateChainFile ...
    </If>

    (other config)

</VirtualHost>

Hay alguna manera de hacer esto?
¿Me estoy perdiendo algún otro método para no duplicar la configuración?

Jake
fuente

Respuestas:

12

La versión estable actual del Apache (2.2) no tiene esa característica, pero el 2.4 sí tiene la directiva IF .

Tiene que crear dos VirtualHosts por ahora, pero puede configurar algunas cosas a través del entorno o las variables globales de apache y usar eso en su configuración de virtualhost (configurando el documentroot por ejemplo). De esta manera, si desea cambiar, puede hacerlo con una sola línea de modificación.

Por supuesto, puede usar include para hacer algo como esto:

<VirtualHost *:80>
        include /etc/apache2/vhost.conf.d/site1
</VirtualHost>

<VirtualHost *:443>
        include /etc/apache2/vhost.conf.d/site1
        include /etc/apache2/vhost.conf.d/site1-ssl
</VirtualHost>

ps: SNI será mainstream años antes de la adaptación de IPv6. Todo el navegador convencional lo admite ya suponiendo que esté en un sistema operativo compatible.

editar: como se detectó la frecuencia no se puede poner SSLEngine en un bloque If, ​​por lo que mi respuesta es incorrecta.

Tyrael
fuente
8
Intentar poner SSLEngine Onen un <If>testamento dará SSLEngine not allowed here, por lo que el caso de uso sugerido al comienzo de esta respuesta lamentablemente no parece posible. Esto parece deberse al requisito de que "solo las directivas que admiten el contexto del directorio se pueden usar dentro de esta sección de configuración". (ref) y SSLEnginees server config, virtual host (ref) , no directorio.
Fooquency
3

No. Puede mover la mayoría de las cosas a la configuración Global y heredarla en VirtualHost.

Chris S
fuente
1
Desafortunadamente, tengo algunos VirtualHosts, cada uno con una configuración diferente y la mayoría necesita trabajar sobre HTTP y HTTPS.
Jake
1
Tan inútil como es esta respuesta, es la única correcta. Vaya a un servidor web que no apesta. :)
intgr
3

Esto fue respondido en otra pregunta. Use una declaración de inclusión. Funcionó como un encanto para mí:

Servir http (puerto 80) y https (puerto 443) en el mismo VirtualHost

# Acme Co
<VirtualHost 192.168.56.101:80>
        Include /usr/local/apache2/conf/main-acme.conf
</VirtualHost>

###* SSL
<VirtualHost 192.168.56.101:443>
        Include /usr/local/apache2/conf/main-acme.conf
        SSLEngine On
</VirtualHost>
Kevin Parker
fuente
2

Para los hosts virtuales SSL, debe usar un segundo puerto ala

<VirtualHost *:443>
    ServerName abc.com
</VirtualHost>
<VirtualHost *:4443>
    Servername def.com
</VirtualHost>

o tienes que usar direcciones IP separadas

<VirtualHost 192.168.0.1:443>
    ServerName abc.com
</VirtualHost>
<VirtualHost 192.168.0.2:443>
    Servername def.com
</VirtualHost>

Hay una muy buena explicación en los documentos de Apache SSL http://httpd.apache.org/docs/2.0/ssl/ssl_faq.html

Busque "¿Por qué no puedo usar SSL con hosts virtuales basados ​​en nombre / no basados ​​en IP?"

Paul S
fuente
2
Sin embargo, tenga en cuenta esto para el futuro: en.wikipedia.org/wiki/Server_Name_Indication
mattdm
Irónicamente, para cuando SNI sea lo suficientemente aceptado como para ser utilizado de manera segura para la mayoría de los sitios de alojamiento virtual, IPv6 probablemente será lo suficientemente común como para que sea irrelevante.
jgoldschrafe
44
@jgoldschrafe Hola 2010, ¡es futuro hablar aquí! Caniuse reciente muestra que los navegadores que no son SNI son <2% en todo el mundo. Desde el primer mundo probablemente sea mucho, mucho menos. IPv4 sigue vivo y bien :)
kubanczyk
2
@kubanczyk ¡Me tienes! :)
jgoldschrafe
@jgoldschrafe Incluso con IPv6, seguiría prefiriendo SNI sobre la asignación de bloques de direcciones a una sola máquina, ya que las IP son principalmente para el enrutamiento y es más fácil de administrar de esa manera.
Bachsau