Apache 2, virtual hosts, ssl klappt nicht zusammen?

Alles, was den Apache betrifft, kann hier besprochen werden.

Apache 2, virtual hosts, ssl klappt nicht zusammen?

Postby rowitech » 02. November 2006 20:11

Hallo,

ich habe einen Apache 2, in den ich rund 30 virtual hosts gepackt habe (also alles eigene Domains auf letztlich einer IP). Das klappt soweit gut, aber nun würde ich gern SSL (HTTPS) nutzen, doch erst wenn ich alle virtual hosts aus der Config raushole, klappt es. Kann es sein, dass der Apache Probleme mit dieser Konstellation hat? Habe ich da ein dickes Announcement übersehen?

Gruß
Rolf
rowitech
 
Posts: 10
Joined: 02. November 2006 19:47

Postby Ol'man » 06. November 2006 17:19

Hallo Rolf,

SSL und (Name-)VirtualHosts (d. h. auf derselben IP- und Port-Nr.) beißen sich prinzipbedingt. Das liegt an der Schichtung der Request-Handler innerhalb des Servers: dort, wo Apache (zwecks Zuweisung an den zuständigen vHost) den Host-Header des HTTP-1.1-Requests auswerten müsste, ist noch alles verschlüsselt. Die SSL-Entschlüsselung entsprechend weiter "nach oben" zu verlagern, widerspräche grundlegenden Sicherheitsaspekten von SSL (man bekäme ein Einfallstor für Cross-Site-Attacken).

Die SSL-vHosts müssen jeweils auf eigenen Port-Nrn. liegen; damit das für die Clients komfortabel bleibt, behilft man sich mit Redirects von Port 80 auf die SSL-Ports:

Listen 1.2.3.4:80
NameVirtualHost 1.2.3.4:80
<VirtualHost 1.2.3.4:80>
ServerName host1.domain.com
ServerAlias host1
RedirectMatch ^/(.*) https://host1.domain.com:1443/$1
</VirtualHost>

<VirtualHost 1.2.3.4:80>
ServerName host2.domain.com
ServerAlias host2
RedirectMatch ^/(.*) https://host2.domain.com:2443/$1
</VirtualHost>

Listen 1.2.3.4:1443
<VirtualHost 1.2.3.4:1443>
ServerName host1.domain.com
SSLEngine On
...
</VirtualHost>

Listen 1.2.3.4:2443
<VirtualHost 1.2.3.4:2443>
ServerName host2.domain.com
SSLEngine On
...
</VirtualHost>

HTH

Ol'man
Ol'man
 
Posts: 21
Joined: 06. November 2006 17:03

Postby rowitech » 06. November 2006 20:23

Hallo Ol'man,

wow, ausführliche Antwort auf meine doch sehr dürftigen Zeilen. Danke Dir!
Ich glaube, mein Problem ist wohl etwas simpler, als Deine Annahme. Nichtsdestotrotz finde ich die Lösung, die Umleitung von Port 80 auf 443 zu machen, ziemlich interessant. Ich brauche im Prinzip aber "nur" ganz normales HTTPS auf Port 443, während HTTP weiterhin auf Port 80 läuft.

Ich nutze den Apache 2 und habe in sites-enabled zwei Dateien, die ich auch offensichtlich korrekt eingebunden habe. Es gibt eine Datei für HTTP und eine für HTTPS.

HTTP:
Code: Select all
NameVirtualHost 88.1.2.3

<VirtualHost www.example.net>
DocumentRoot /var/www/www.example.net
ServerName www.example.net
</VirtualHost>

<VirtualHost lara.example.net>
DocumentRoot /var/www/lara.example.net
ServerName lara.example.net
</VirtualHost>


HTTPS:

Code: Select all
NameVirtualHost *:443
<VirtualHost *:443>
# SSL (START)
SSLEngine on
SSLCertificateFile /etc/apache2/ssl/lara.crt
SSLCertificateKeyFile /etc/apache2/ssl/lara.key

SSLProtocol all
SSLCipherSuite HIGH:MEDIUM
# SSL (ENDE)
</VirtualHost>



Dass ich beim NameVirtualHost einmal eine IP und einmal keine geschrieben habe, lag an den Fehlern beim Starten des Apache.
So, nehmen wir mal diese beiden Dateien. Wenn ich aus der Datei "HTTP" alle Virtualhosts rauslösche, so dass nur die erste Zeile stehenbleibt, dann klappt alles mit https. Es muss also ein Problem in den Virtualhosts sein, die ich dort eingetragen habe.

Ich hatte auch mal probiert, einen HTTPS-Eintrag in die HTTP-Datei zu schreiben (ans Ende), aber auch das mag mein Apache nicht so recht. Nur wenn ich die unverschlüsselten Seiten komplett rausnehme, klappt es.
Wahrscheinlich ist es nur ein winziger Eintrag, aber ich hänge hier bestimmt schon seit 6 Wochen.

Gruß
Rolf
rowitech
 
Posts: 10
Joined: 02. November 2006 19:47

Postby Ol'man » 07. November 2006 03:21

rowitech wrote:Ich glaube, mein Problem ist wohl etwas simpler, als Deine Annahme.


Mmh, ja. Eine gute Fehlerbeschreibung ist manchmal schon die halbe Reparatur :-)

Schreib doch mal, was Apache so für Fehlermeldungen (..\bin\httpd -S) beim Start ausspuckt.

Dann probier doch mal "SSLEngine Off" oder besser: alles SSL-bezogene ab "LoadModule ssl_module..." auskommentieren, und schau, ob "http://lara.example.net:443/" (ohne SSL/https) ansprechbar ist.

Und verwende doch mal "NameVirtualHost 88.1.2.3:443" und "<VirtualHost 88.1.2.3:443>" (anstelle von "*" für "alle IPs"), und schau, was passiert.
Ol'man
 
Posts: 21
Joined: 06. November 2006 17:03

Postby rowitech » 07. November 2006 09:06

Hallo,

stimmt, auf Port 443 kommt ganz normales http!
Hilft das schon weiter?

Gruß
Rolf
rowitech
 
Posts: 10
Joined: 02. November 2006 19:47

Postby Ol'man » 07. November 2006 13:50

rowitech wrote:stimmt, auf Port 443 kommt ganz normales http!

Dann liegt's wohl am SSL-Setup.
(meintest Du, http auf 443 "klappt" nach Abschalten von mod_ssl oder schon mit Deiner Default-Conf?)

Jetzt wäre es vielleicht hilfreich,
a) die betreffende error.log und
b) http://localhost/server-info (mod_info schon aktiviert?)
zu konsultieren.
Ol'man
 
Posts: 21
Joined: 06. November 2006 17:03

Postby rowitech » 07. November 2006 14:04

Hi Ol'man,

ich bin derzeit nicht am Linux-Rechner, daher kann ich jetzt nur offline was dazu sagen. Mit der von mir geschickten config kann ich ohne Änderungen auf http://lara.example.net:443 gehen, also völlig Plain-HTTP. Es wäre also alles ok, wenn dann SSL eingeschaltet wäre. Nehme ich die normalen virtual hosts raus, ändere also nichts an der HTTPS-Datei, klappt auch SSL. Ganz komisch. Offenbar hat meine SSL-Konfig keine Lust auf die virtual hosts in der "normalen" Konfig.

Gruß
Rolf
rowitech
 
Posts: 10
Joined: 02. November 2006 19:47

Postby rowitech » 08. November 2006 22:25

So, ich habe heute mal viel gebaut, probiert und ... bin nicht wirklich weitergekommen.

error.log:
Code: Select all
[Wed Nov 08 21:46:15 2006] [notice] Apache/2.0.54 (Debian GNU/Linux) PHP/4.3.10-16 mod_ssl/2.0.54 OpenSSL/0.9.7e configured -- resuming normal operations


Und bei apache2 -S kommt das:
Code: Select all
VirtualHost configuration:
88.1.2.3:*         is a NameVirtualHost
         default server www.example.net (/etc/apache2/sites-enabled/001-alle:16)
         port * namevhost www.example.net (/etc/apache2/sites-enabled/001-alle:16)
         port * namevhost mail.example.net (/etc/apache2/sites-enabled/001-alle:21)
         port * namevhost lara.example.net (/etc/apache2/sites-enabled/001-alle:26)
         port * namevhost kunden.example.net (/etc/apache2/sites-enabled/001-alle:31)
wildcard NameVirtualHosts and _default_ servers:
*:443                  is a NameVirtualHost
         default server mail.example.net (/etc/apache2/sites-enabled/alle-ssl:13)
         port 443 namevhost mail.example.net (/etc/apache2/sites-enabled/alle-ssl:13)
Syntax OK


Die Subdomain mail hab ich auch aus der HTTP (Port 80) datei rausgeholt, ist aber das gleiche Phänomen: SSL geht nicht, auf Port 443 lauscht nur der normale HTTP.

Wenn ich in der HTTPS-Datei (SSL) statt einem Stern (*) die IP angebe, kommt das:
Code: Select all
[Wed Nov 08 22:23:03 2006] [error] VirtualHost 88.1.2.3:443 -- mixing * ports and non-* ports with a NameVirtualHost address is not supported, proceeding with undefined results


Ich finde aber keinen Host mit "*" mehr...

Ich weiss nicht mehr weiter... Kann man die Debug-Ausgaben nicht weiter erhöhen?

Localhost anzusprechen ist da eher schwer, aber lynx sagt, dass server-info nicht existiert, das mod_info ist offenbar nicht installiert/initialisiert.

Gruß
Rolf
rowitech
 
Posts: 10
Joined: 02. November 2006 19:47

Postby Ol'man » 10. November 2006 11:20

Ich weiss nicht mehr weiter... Kann man die Debug-Ausgaben nicht weiter erhöhen?


Schreib irgendwo in der Nähe Deiner "ErrorLog <path-to>/error.log"-Anweisung "LogLevel debug" hin.
Siehe auch hier.

Localhost anzusprechen ist da eher schwer, aber lynx sagt, dass server-info nicht existiert, das mod_info ist offenbar nicht installiert/initialisiert.


Auch das ist doch leicht:

LoadModule info_module modules/mod_info.so

Listen 127.0.0.1:80
ServerName 127.0.0.1:80

# mach' diesen Server '127.0.0.1' zum Default-Server, d. h. vor der ersten 'VirtualHost'-Direktive, und alle "Produktionsserver" zu VirtualHosts

<VirtualHost 127.0.0.1:80>
ServerName localhost:80

<Location /server-info>
SetHandler server-info
Order Deny,allow
Deny from All
Allow from 127
</Location>

</VirtualHost>

Wenn Du die obige '<Location>...'-Direktive auch beim Defaultserver und nicht innerhalb des localhost-VirtualHosts hinschreibst, dann verfügt auch jeder Produktionsserver über diese URI '/server-info'. Schreib dann hinter 'Allow from 127' noch Deine Remote-IP, und Du kannst die Seite "von zu Hause aus" lesen (besser ist allerdings, noch eine Authentifikation zu basteln).

(schau, ob diese Anweisungen nicht schon - evtl. auskommentiert - irgendwo in Deiner httpd.conf oder in deren Includes stehen)

Dann ist mir aufgefallen, dass Du immer Hostnamen hinter VirtualHost verwendest - das ist zwar ok., setzt aber voraus, dass alle diese Hostnamen beim Serverstart auch DNS-auflösbar sein müssen, und zwar auf dieselbe IP-Nr. 88.1.2.3 (oder man trägt sie zumindest in /etc/hosts ein). IMHO ist es besser, hier die betreffende IP-Nr. hinzuschreiben, und übrigens lt. Apache-Doc (hab' ich auch erst vor kurzem gelesen) auch die PortNr., sowohl bei 'Listen', ggf. 'NameVirtualHost', 'ServerName' als auch 'VirtualHost', wie oben gezeigt!. Das macht die Sache ein wenig übersichtlicher.

Ol'man
Ol'man
 
Posts: 21
Joined: 06. November 2006 17:03

Postby rowitech » 16. November 2006 08:52

Hallo Ol'man,

ich glaube, ich bin jetzt etwas weiter. Interessanterweise hat das wohl was mit der /etc/hosts zu tun, denn wenn ich auf dem Testsserver (da hab ich das nachgestellt) alle Hostnamen auf 127.0.0.1 setze, klappt es, nutze ich verschiedene IPs (127.0.0.1 für localhost usw. und die 192.168.121.133 für meine virtualhosts v w x und y), dann kommen die bekannten Fehlermeldungen. Ein genaues Schema dafür habe ich aber noch nicht gefunden, denn auf dem Server im Wirkbetrieb kann ich schlecht die lokalen Auflösungen auf 127.0.0.1 laufen lassen, wenn der DNS dafür die echte IP ausspuckt (habs aber nicht getestet).
Heute ist einer der letzten Tage, wo ich das testen kann, ich hoffe sehr, dass ich heute zum Ziel komme.

Nochwas zu den Virtualhosts:
Wenn ich in <VirtualHost www.example.net:80> eingebe und dann <VirtualHost lara.example.net:80> für einen weiteren Virtualhost, dann verstehe ich das, auch oder gerade wenn die DNS-Einträge dazu auf die gleiche IP verweisen. Aber ich kann hier ja nicht die gleiche IP eintragen, dann habe ich ja kein Unterscheidungsmerkmal mehr. Oder übersehe ich da was?

Danke Dir nochmal für Deine Hilfe!

Gruß
Rolf
rowitech
 
Posts: 10
Joined: 02. November 2006 19:47

Postby Ol'man » 16. November 2006 11:39

rowitech wrote:ich glaube, ich bin jetzt etwas weiter. Interessanterweise hat das wohl was mit der /etc/hosts zu tun, denn wenn ich auf dem Testsserver (da hab ich das nachgestellt) alle Hostnamen auf 127.0.0.1 setze, klappt es, nutze ich verschiedene IPs (127.0.0.1 für localhost usw. und die 192.168.121.133 für meine virtualhosts v w x und y), dann kommen die bekannten Fehlermeldungen.


Ja, Du mußt Dir genauestens Klarheit darüber verschaffen, wie Dein Host die Namen auflöst. Eine Linux-Kiste muß z. B. nicht notwendigerweise der /etc/hosts Vorrang vor DNS geben. Und falls es evtl. ein Win2Kx-Server ist, dort hat der MS-TCP-Stack manchmal ganz eigene Vorstellungen davon, wie Namen aufgelöst werden (wichtig bei mehreren virtuellen IPs/multihomed-Betrieb): auf der Kiste selbst wird nämlich DNS für die Auflösung speziell des eigenen Hostnamen völlig ignoriert (hat mich auch schon einige Kopfschmerzen gekostet).

Benutze Ping, unter Linux besser dig. Und für Windows lohnt es sich, BIND-9.3 von isc.org zu holen und zumindest die mitgelieferten BIND-Tools (dig.exe, host.exe...) zu benutzen. Für eine Windows-Testkiste lohnt es sich darüberhinaus, auch den BIND-named zu installieren und die fraglichen Domains einzurichten, um sie lokal/autark per DNS bereitstellen zu können (BIND auf Win32 ist genau so problemlos wie unter *ix).

rowitech wrote:Nochwas zu den Virtualhosts:
Wenn ich in <VirtualHost www.example.net:80> eingebe und dann <VirtualHost lara.example.net:80> für einen weiteren Virtualhost, dann verstehe ich das, auch oder gerade wenn die DNS-Einträge dazu auf die gleiche IP verweisen. Aber ich kann hier ja nicht die gleiche IP eintragen, dann habe ich ja kein Unterscheidungsmerkmal mehr. Oder übersehe ich da was?


Für mehrere Hostnamen auf identischer IP gibt es 'NameVirtualHost'. Das setzt dann zwingend HTTP-1.1-Clients voraus (es wird der "host:"-Header vom HTTP-Request ausgewertet, den es bei HTTP 1.0 nicht gibt; wie ich schon mal schrieb, kann das aber mit SSL nicht funktionieren, ansonsten ist HTTP 1.1 bei den heutigen Browsern natürlich kein Problem mehr).

Bei 'VirtualHost' kann trotzdem immer eine IP eingetragen werden (steht dort nämlich ein Hostname, löst Apache den beim Start bzw. httpd.conf-Parsen einfach auf und verwendet intern fürderhin eh' die IP-Nr - und in Deinem Fall ist die ja dann jeweils identisch). Das Unterscheidungsmerkmal ist die 'ServerName'-Direktive.

Alles klar?

Ol'man

PS: Hast Du mal, wie ich ebenfalls schon schrieb, sowohl bei 'Listen', 'NameVirtualHost', 'ServerName' als auch 'VirtualHost' die jeweils zutreffende Portnr. drangehängt? Das "entflechtet" Dein Setup am effektivsten, denn wie Du es beschreibst, kann Apache da irgendwas nicht so recht automatisch auseinanderhalten ("proceeding with undefined results"). Evtl. liegt es nämlich daran, daß Deine 'NameVirtualHosts'-Direktive (wahrscheinlich ohne angehängtes ":80" ?!) auch den vom SSL-vHost belegten TCP-Socket mit erfaßt, und das wäre ja gerade nicht gewollt (so wie ich Dein Problem verstehe, wolltest Du doch 30 vHosts auf Port 80 und einen SSL-vHost einrichten).
Ol'man
 
Posts: 21
Joined: 06. November 2006 17:03

Success!

Postby rowitech » 16. November 2006 14:48

Hallo Ol'Man,

jetzt hab ich's wohl komplett verstanden und kaum macht man's richtig, funktioniert's auch! Allerdings bin ich davon ausgegangen, dass SSL mit NameVirtualHosts nicht funkltioniert, ich kann aber www.example.net und lara.example.net auch mit https://www.example.net und https://lara.example.net korrekt unterscheiden.

Sorry, wenn ich etwas langsam im verstehen war, dafür habe ich es ejtzt umso mehr verstanden, ich danke Dir für Deine Geduld!

Gruß
Rolf
(happy..)

P.S.: Der größte Hänger war die irrige Annahme, dass in der Virtualhost-Zeile die URL stehen musste, die aber bei ServerName wichtig ist.
rowitech
 
Posts: 10
Joined: 02. November 2006 19:47

Re: Success!

Postby Ol'man » 16. November 2006 18:00

rowitech wrote:bin ich davon ausgegangen, dass SSL mit NameVirtualHosts nicht funkltioniert


...hat ja keiner gesagt, daß wg. Vorhandensein von SSL 'NameVirtualHost' nicht verwendet werden darf - der "Gültigkeitsbereich" der Direktive muß halt auf die 'Listen'-Addresse 88.1.2.3:80 eingeschränkt werden.

ich kann aber www.example.net und lara.example.net auch mit https://www.example.net und https://lara.example.net korrekt unterscheiden.


Das wundert mich nun wieder - wie hast Du das hinbekommen (ohne Alternativ-Ports <> 443)?!

Hab' ich da was verpaßt, hast Du evtl. 'NameVirtualHost 88.1.2.3:443' drin und es funktioniert doch, im Gegensatz zu meiner Annahme (kann ja veraltetes Wissen sein)?
Ol'man
 
Posts: 21
Joined: 06. November 2006 17:03

Postby rowitech » 16. November 2006 18:25

Hallo,

ich hab's extra jetzt nochmal getestet und es klappt genauso wie bei unverschlüsselten URLs. Ich habe auch bei SSL jeweils <VirtualHost> gemacht und darin dann die SSL-Angaben zum Zertifikat (jeweils).
Ich habe es zwar nur mit 2 URLs ausprobiert, aber das reicht ja schon.
Der Apache ist der Apache 2 der LAMP Debian Distribution (2.0.54 auf 64bit-Plattform).

Gruß
Rolf
rowitech
 
Posts: 10
Joined: 02. November 2006 19:47

Postby Ol'man » 17. November 2006 09:42

rowitech wrote:Ich habe auch bei SSL jeweils <VirtualHost> gemacht und darin dann die SSL-Angaben zum Zertifikat (jeweils).


Schreib doch mal etwas genauer hin, wie Du es prinzipiell gemacht hast. Vielleicht so:

---8<---

# http://...

Listen 88.1.2.3:80
NameVirtualHost 88.1.2.3:80

<VirtualHost 88.1.2.3:80>
ServerName www.example.net:80
DocumentRoot /webstuff/www
...
</VirtualHost>

<VirtualHost 88.1.2.3:80>
ServerName lara.example.net:80
DocumentRoot /webstuff/lara
...
</VirtualHost>

# https://...

Listen 88.1.2.3:443
NameVirtualHost 88.1.2.3:443

<VirtualHost 88.1.2.3:443>
ServerName www.example.net:443
DocumentRoot /webstuff/ssl/www
SSLEngine on
SSLCertificateFile conf/ssl/www.crt
SSLCertificateKeyFile conf/ssl/www.key
...
</VirtualHost>

<VirtualHost 88.1.2.3:443>
ServerName lara.example.net:443
DocumentRoot /webstuff/ssl/lara
SSLEngine on
SSLCertificateFile conf/ssl/lara.crt
SSLCertificateKeyFile conf/ssl/lara.key
...
</VirtualHost>

--->8---

Oder wie?? Nach meinem möglicherweise veralteten Wissensstand sollte das nämlich gerade so nicht funktionieren. Mich interessiert das jetzt mal.

Beste Grüße

Ol'man
Ol'man
 
Posts: 21
Joined: 06. November 2006 17:03

Next

Return to Apache

Who is online

Users browsing this forum: No registered users and 2 guests