SSL, Apache2 und VirtualHosts
Marc Reichelt
- webserver
Hallo 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/