Kann ich HTTP und HTTPS in demselben VirtualHost in Apache conf definieren?

12

Ich habe eine ziemlich große VirtualHost-Definition, die ich nicht duplizieren möchte, nur damit die Site auch über HTTPS ausgeführt wird.

Folgendes möchte ich tun:

<VirtualHost *>
    ServerName example.com

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

    (other config)

</VirtualHost>

Gibt es eine Möglichkeit, dies zu tun?
Fehlt mir eine andere Methode, um die Konfiguration nicht zu duplizieren?

Jake
quelle

Antworten:

12

Die aktuelle stabile Version von Apache (2.2) verfügt nicht über diese Funktion, die Version 2.4 jedoch über die IF-Direktive .

Sie müssen vorerst zwei VirtualHosts erstellen, aber Sie können einige Dinge über globale Umgebungsvariablen oder Apache-Variablen festlegen und diese in Ihrer virtualhost-Konfiguration verwenden (z. B. das Einstellen der Dokumentwurzel). Wenn Sie dies ändern möchten, können Sie dies mit nur einer Änderungszeile tun.

Natürlich können Sie include verwenden, um so etwas zu tun:

<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 wird Jahre vor der IPv6-Anpassung Mainstream sein . Alle gängigen Browser unterstützen dies bereits, sofern Sie sich auf einem unterstützten Betriebssystem befinden.

Bearbeiten: Wenn die Häufigkeit festgestellt wird, können Sie SSLEngine nicht auf einen If-Block setzen, sodass meine Antwort falsch ist.

Tyrael
quelle
7
Der Versuch, SSLEngine Onein <If>Testament einzugeben SSLEngine not allowed here, gibt daher den vorgeschlagenen Anwendungsfall zu Beginn dieser Antwort leider nicht möglich. Dies scheint darauf zurückzuführen zu sein, dass in diesem Konfigurationsabschnitt nur Anweisungen verwendet werden dürfen, die den Verzeichniskontext unterstützen. (ref) und SSLEngineist server config, virtual host (ref) , kein Verzeichnis.
Fooquency
3

Nein. Sie können die meisten Dinge in die globale Konfiguration verschieben und im VirtualHost erben.

Chris S.
quelle
1
Leider habe ich einige VirtualHosts, die jeweils unterschiedliche Konfigurationen haben und am meisten über HTTP und HTTPS arbeiten müssen.
Jake
1
So wenig hilfreich diese Antwort ist, sie ist die einzig richtige. Bitte wechseln Sie zu einem Webserver, der nicht saugt. :)
intgr
3

Dies wurde in einer anderen Frage beantwortet. Verwenden Sie eine Include-Anweisung. Arbeitete wie ein Zauber für mich:

Stellen Sie http (Port 80) und https (Port 443) auf demselben VirtualHost bereit

# 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
quelle
2

Für virtuelle SSL-Hosts müssen Sie entweder einen zweiten Port verwenden

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

oder Sie müssen separate IPs verwenden

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

Es gibt tatsächlich eine sehr gute Erklärung in den Apache SSL-Dokumenten http://httpd.apache.org/docs/2.0/ssl/ssl_faq.html

Suchen Sie nach "Warum kann ich SSL nicht mit namenbasierten / nicht IP-basierten virtuellen Hosts verwenden?"

Paul S.
quelle
2
Beachten Sie
Ironischerweise wird IPv6 zu dem Zeitpunkt, an dem SNI allgemein akzeptiert genug ist, um für die meisten virtuellen Hosting-Sites sicher verwendet zu werden, wahrscheinlich alltäglich genug sein, um es irrelevant zu machen.
Jgoldschrafe
4
@jgoldschrafe Hallo 2010, hier spricht die Zukunft! Jüngste Caniuse zeigt, dass Nicht-SNI-Browser weltweit <2% sind. Von der ersten Welt ist es wahrscheinlich viel viel weniger. IPv4 noch am Leben und gut :)
Kubanczyk
2
@ Kubanczyk Hab mich! :)
jgoldschrafe