SSL, Apache2 und VirtualHosts
 Marc Reichelt
 Marc Reichelt
    
    
      - webserver
 nicht angemeldet
 nicht angemeldetHallo an alle,
ich habe meinen Server gestern neu aufgesetzt und möchte nun SSL einrichten - für eine bestimmte Subdomain (ssl.example.net).
Alle anderen Domains (other-example.tld etc.) sollen nicht auf SSL reagieren, da das Zertifikat nur für *.example.net ausgelegt ist.
Nun habe ich folgende Befehle angewandt:
  
# Natürlich muss Apache sowohl Port 80 als auch 443 abhören.  
Listen 80  
Listen 443  
  
# einige Befehle, um SSL zu konfigurieren und zu laden (sind wie ich vermute an dieser Stelle irrelevant, da SSL bereits funktioniert)  
  
# nun geht's an die VirtualHosts: alle Anfragen auf Port 80 werden standardmäßig abgelehnt, und nur für die konfigurierten Hosts erlaubt  
NameVirtualHost *:80  
<VirtualHost *:80>  
  ServerName localhost  
  # Deny from all etc. etc.  
</VirtualHost>  
  
<VirtualHost *:80>  
  ServerName example1.org  
  # Konfiguration  
</VirtualHost>  
  
# Hier ist der gewünschte SSL Host  
<VirtualHost *:443>  
  ServerName ssl.example.net  
  # Konfiguration  
  # SSL Konfiguration  
</VirtualHost>  
  
<VirtualHost *:80>  
  ServerName example2.org  
  # Konfiguration  
</VirtualHost>  
Wenn ich nun auf https://ssl.example.net/ zugreife, funktioniert alles wie gewünscht. Wenn ich nun aber auf https://example2.org/ oder https://example1.org zugreife, erscheint der gleiche Inhalt.
Wie kann ich das vermeiden, sprich: Nur für ganz bestimmte Hosts SSL freischalten?
Grüße
Marc Reichelt || http://www.marcreichelt.de/
echo $begrüßung;
Wenn ich nun auf https://ssl.example.net/ zugreife, funktioniert alles wie gewünscht. Wenn ich nun aber auf https://example2.org/ oder https://example1.org zugreife, erscheint der gleiche Inhalt.
Wie kann ich das vermeiden, sprich: Nur für ganz bestimmte Hosts SSL freischalten?
Der erste <VirtualHost>-Eintrag ist das Sammelbecken für alle was keinen eigenen <VirtualHost>-Eintrag hat. Es sei denn, ... die Dokumentation redet da irgendwas von _default_, ohne dafür ein Beispiel anzugeben.
NameVirtualHost *:80
Hast du auch eine Zeile NameVirtualHost *:443?
Wenn ja, warum schränkst du das nicht auf genau die gewünschte Adresse ein? Das wäre jedenfalls mein nächster Versuch.
echo "$verabschiedung $name";
Hi,
check mal den Link:
http://www.micressor.ch/content/wiki/index.php/Apache-SSL-Zertifikat_erstellen
Viele Gruesse,
Marcus
Hallo Marc,
ich habe meinen Server gestern neu aufgesetzt und möchte nun SSL einrichten - für eine bestimmte Subdomain (ssl.example.net).
Alle anderen Domains (other-example.tld etc.) sollen nicht auf SSL reagieren, da das Zertifikat nur für *.example.net ausgelegt ist.
ich will Dich ja nicht entmutigen, aber in der Dokumentation des apache 2.0 steht folgendes:
<zitat>
    Namensbasierte virtuelle Hosts können aufgrund der Natur des SSL-Protokolls
    nicht mit SSL-gesicherten Servern verwendet werden.
</zitat>
Ich habe allerdings an meinen Testservern noch nie mit SSL herumgespielt :-)
Freundliche Grüße
Vinzenz
Hallo Vinzenz,
<zitat>
Namensbasierte virtuelle Hosts können aufgrund der Natur des SSL-Protokolls
nicht mit SSL-gesicherten Servern verwendet werden.
</zitat>
Nun ja, das ist nicht ganz korrekt, denn gesichert werden können sie (ich habe es bei meinem aktuellen Server ja auch mit https://ssl.example.net/ geschafft). Allerdings verstehe ich jetzt wieder, welches Problem hier auftritt: Der Hostname ist nicht bekannt, wenn eine mit SSL verschlüsselte Seite aufgerufen wird.
Ich habe nun folgende Einträge in meine Datei /etc/apache2/sites-available/default hinzugefügt:
NameVirtualHost *:443  
<VirtualHost _default_:443>  
        ServerAdmin webmaster@localhost  
        ServerName  localhost:443  
  
        DocumentRoot /var/www/  
        <Directory />  
                Options FollowSymLinks  
                AllowOverride None  
        </Directory>  
        <Directory /var/www/>  
                Options Indexes FollowSymLinks MultiViews  
                AllowOverride None  
                Order allow,deny  
                deny from all  
        </Directory>  
  
        ErrorLog /var/log/apache2/error.log  
        LogLevel warn  
        CustomLog /var/log/apache2/access.log combined  
  
        SSLEngine On  
        SSLCertificateFile /etc/ssl/certs/server.crt  
        SSLCertificateKeyFile /etc/ssl/private/server.key  
        SSLCertificateChainFile /etc/ssl/certs/cacert.crt  
  
        ServerSignature Off  
</VirtualHost>
So bekommen zwar alle Domains bei Aufruf mit https:// eine "Forbidden"-Seite, und das Zertifikat ist eventuell nicht für die Domains ausgelegt (wie jetzt beispielsweise auf https://marcreichelt.de/) - aber es ist in Ordnung. Nun kann ich in den anderen VirtualHosts einzeln SSL freischalten - was bereits bei einem Host funktioniert.
Die Konfiguration dafür sieht so aus:
# Host: ssl.example.org  
<VirtualHost *:443>  
    ServerName ssl.example.org:443  
    ServerAdmin admin@example.org  
  
    DocumentRoot "/var/www/example"  
    <Directory "/var/www/example">  
        Options -Indexes  
        AllowOverride All  
  
        Order allow,deny  
        Allow from All  
   </Directory>  
  
   SSLEngine On  
   SSLCertificateFile /etc/ssl/certs/server.crt  
   SSLCertificateKeyFile /etc/ssl/private/server.key  
   SSLCertificateChainFile /etc/ssl/certs/cacert.crt  
</VirtualHost>
Entscheidend ist dabei die Portangabe bei "ServerName ssl.example.org:443".
Um diese Erkenntnis zu erreichen war das Dokument VhostsApache sehr hilfreich (vor allem unten die Beispielkonfigurationen) - möge es für die Nachwelt auch hilfreich sein. :-)
Vielen Dank auch an dedlfx, der mich auf "_default_" gebracht hat, und an Vinzenz, der mich an das "chicken and egg"-Problem von SSL erinnert hat.
Grüße
Marc Reichelt || http://www.marcreichelt.de/
Hallo Marc,
Vielen Dank auch an dedlfx, der mich auf "_default_" gebracht hat, und an Vinzenz, der mich an das "chicken and egg"-Problem von SSL erinnert hat.
Dazu möchte ich nur auf eine Bemerkung von mir verweisen.
Viele Grüße,
Christian
Hi,
Natürlich muss Apache sowohl Port 80 als auch 443 abhören.
Ist das so natürlich, daß ein Apache zur Lösung Deines Problems auf 80 und 443 horchen muß?
Lösungsansatz:
Laß einen Apache nur auf Port 80 horchen.
Und einen zweiten Apache nur auf Port 443.
Im ersten definierst Du alle virtual hosts, im zweiten nur den für ssl.
cu,
Andreas
Hallo MudGuard,
Natürlich muss Apache sowohl Port 80 als auch 443 abhören.
Ist das so natürlich, daß ein Apache zur Lösung Deines Problems auf 80 und 443 horchen muß?
Lösungsansatz:
Laß einen Apache nur auf Port 80 horchen.
Und einen zweiten Apache nur auf Port 443.Im ersten definierst Du alle virtual hosts, im zweiten nur den für ssl.
Auch, wenn zwei Apache-Server laufen, gelangen Anfragen auf $host:443 immer an den Server, der Port 443 belauscht. Und dieser Server kann nicht an Hand des Hostnamens entscheiden, ob er diesen verweigern soll - es sei denn, ein Host hat eine andere IP-Adresse.
Und weil sich somit für mich nichts ändert, lasse ich lieber einen Apache-Server laufen.
Immerhin wird innerhalb der erfolgten SSL-Verschlüsselung der vom Browser angefragte Hostname mit übertragen, sodass ich dann entsprechende Inhalte ("403 Forbidden") ausliefern kann.
Grüße
Marc Reichelt || http://www.marcreichelt.de/