Apache SNI namevhosts leiten immer zum ersten VirtualHost-Eintrag

7

Apache scheint alle https-Anforderungen an die erste <VirtualHost *:443>weiterzuleiten, unabhängig von der SNI-Übereinstimmung in den Feldern ServerName / ServerAlias.

Apache wird mit der SNI
Server-Version erstellt: Apache / 2.2.22 (Ubuntu)
Server erstellt: 8. März 2013 15:53:13
OpenSSL 1.0.1 14. März 2012

error.log meldet:

Init: Name-based SSL virtual hosts only work for clients with TLS server name indication support (RFC 4366)

Was darauf hindeutet, dass SNI gemäß http://wiki.apache.org/httpd/NameBasedSSLVHostsWithSNI funktioniert (Wie können Sie feststellen, ob Ihr Apache-Build SNI unterstützt?)

SSL_TLS_SNIscheint entsprechend eingestellt zu sein, wenn dies über HTTPS angefordert wird (verifiziert mit phpinfo())

Aufbau:

<IfModule mod_ssl.c>
    # If you add NameVirtualHost *:443 here, you will also have to change
    # the VirtualHost statement in /etc/apache2/sites-available/default-ssl
    # to <VirtualHost *:443>
    # Server Name Indication for SSL named virtual hosts is currently not
    # supported by MSIE on Windows XP.
    NameVirtualHost *:443
    Listen 443
</IfModule>

#<VirtualHost *:443>
#       <Location />
#               Order allow,deny
#               Deny from all
#       </Location>
#</VirtualHost>

<VirtualHost *:443>
        SSLEngine on
        ServerAdmin webmaster@localhost
        ServerName server.com
        ServerAlias server.com
        DocumentRoot /web/default
        ErrorLog ${APACHE_LOG_DIR}/error.log

        # Possible values include: debug, info, notice, warn, error, crit,
        # alert, emerg.
        LogLevel warn

        CustomLog ${APACHE_LOG_DIR}/access.log combined

        SSLCertificateFile /path/server.com.crt
        SSLCertificateKeyFile /path/server.com.key
</VirtualHost>
<VirtualHost *:443>
        SSLEngine on
        ServerAdmin webmaster@localhost
        ServerName alias.com
        ServerAlias alias.com
        DocumentRoot /web/default
        ErrorLog ${APACHE_LOG_DIR}/error.log

        # Possible values include: debug, info, notice, warn, error, crit,
        # alert, emerg.
        LogLevel warn

        CustomLog ${APACHE_LOG_DIR}/access.log combined

        SSLCertificateFile /path/alias.com.crt
        SSLCertificateKeyFile /path/alias.com.key
</VirtualHost>

Sowohl https://server.com als auch https://alias.com versuchen, das Zertifikat (und den Inhalt, wenn Sie die Zertifikatswarnung ignorieren) von server.com bereitzustellen

Eine ähnliche Konfiguration funktioniert gut mit HTTP: 80 (nur die Änderung ist SSLEngine aktiviert und die Zertifikat- / Schlüsselpfade)

Wenn ich den ersten virtuellen Host auskommentiere (Einschränkung des HTTPS-Zugriffs auf definierte Sites), wird immer ein SSL-Fehler angezeigt (auch wenn es sich um eine definierte Site handelt).

Vielen Dank

EDIT:
Zusätzliche Flags

SSLProtocol all
SSLCipherSuite HIGH:MEDIUM
SSLStrictSNIVHostCheck on
SSLVerifyClient none
SSLProxyEngine off

SSLStrictSNIVHostCheck on Daher sollte es sowieso nur SNI-fähige Browser unterstützen

apache2ctl -S Ausgabe:

*:443                  is a NameVirtualHost
         default server server.com (/etc/apache2/sites-enabled/000-default:22)
         port 443 namevhost server.com (/etc/apache2/sites-enabled/000-default:22)
         port 443 namevhost alias.com (/etc/apache2/sites-enabled/000-default:39)
         port 443 namevhost other.com (/etc/apache2/sites-enabled/other:22)
Arcyqwerty
quelle
Das glaube ich nicht. Es sieht so aus, als ob SNI zumindest in dieser Umgebung möglich ist und soweit ich das beurteilen kann, ist es korrekt konfiguriert.
Falcon Momot

Antworten:

4

Aktualisieren

Aus irgendeinem seltsamen Grund scheint sich das Problem von selbst gelöst zu haben.
Vielleicht ist es eine Art seltsamen Caching Problem oder etwas (obwohl ich habe apache2ctl stop/start/restartund sudo service apache2 stop/start/restart/reloaded viele Male und habe Tests lokal auf dem Server als auch mit mehreren verschiedenen Maschinen durchgeführt).

Nehmen Sie diese Frage gerne auf oder lassen Sie sie offen, wenn sie als Referenz dient.
Vielen Dank für all die Hilfe Jungs!

Arcyqwerty
quelle
Es scheint, ich habe das gleiche Problem. Immer noch nicht gelöst. Ich warte schon> 12 Stunden. server.com und server.com funktionieren aber Probleme mit alias.com (obwohl alias.com bereits funktioniert) ??? @arcqwerty wie lange hat es gedauert, bis sich das Problem von selbst gelöst hatte?
NilsB
Wenn ich auf die Zeit zwischen Q + A zurückblicke, würde ich ungefähr 10 Stunden sagen?
Arcyqwerty
Ich habe meinen Server in diesem schlechten Zustand belassen und bin dann 5 Tage später zurückgekommen, und alles funktioniert einwandfrei. Der Apache-Server wurde jedoch neu gestartet (der Root-Prozess ist immer noch der ursprüngliche, aber die httpd-Gabeln wurden zurückgesetzt).
Mat M
1
Möglicherweise hat dies etwas mit dem Browser-Cache oder der Wiederverwendung offener Verbindungen zu tun.
Rudimeier
2
Es scheint, dass ein Neustart keine Auswirkungen auf geänderte SSL-Einstellungen hat. Sie müssen Apache stoppen und dann Apache erneut starten.
Kay Hidde
1

Ihre Konfiguration sieht in Ordnung aus. Die Direktive SSLEngine On wurde aufgenommen. Laut der Protokollnachricht scheint das Problem von der Clientseite zu kommen.

Nicht alle Clients unterstützen SNI, die meisten jedoch. Dies hängt davon ab, wie die SSL-Verhandlung erfolgt, vom System (funktioniert dann unter Win XP nicht) oder vom Browser (die Version muss aktuell genug sein). Sehen Sie sich die Liste der Browser mit Unterstützung von SNI an . Wenn Sie sicherstellen müssen, dass alle Clients Zugriff auf Ihre Websites erhalten, können Sie SNI aufgrund dieser alten Versionen (des Browsers oder des Systems) nicht verwenden. Sie benötigen eine IP pro Servername und verwenden VirtualHost $ IP_alias: 443 für Servername alias.com und VirtualHost $ IP_server: 443 für Servername server.com anstelle von VirtualHost *: 443 für beide.

philippe
quelle
Ich bin mir ziemlich sicher, dass mein Browser SNI korrekt sendet, da ich es in der Variablen SSL_TLS_SNI auf dem Server sehen kann. Ich habe alle neuesten Versionen von Chrome, Firefox und IE10 ausprobiert und keine funktioniert. Die Dinge sehen in Ordnung aus,
arcyqwerty
0

Beim ersten virtuellen Host wird eine Fehlermeldung SSLEngine onangezeigt, da Apache ohne die Anweisung eine HTTP-Antwort ohne SSL sendet. Wenn Sie diese Art von Funktionalität wünschen, müssten Sie eine andere Site (möglicherweise mit einem anderen Zertifikat, sofern Sie keine vorhandene Domain wiederverwenden) für Ihren Standard-vhost einrichten, selbst wenn Sie nur einen netten Fehler zurückgeben möchten.

Überprüfen Sie vielleicht, ob die Zertifikate tatsächlich unterschiedlich sind? Ihre Konfiguration erscheint korrekt.

Stellen Sie außerdem sicher, dass keine anderen VirtualHostAbschnitte Port 443 überwachen. Apache wählt den am besten passenden aus. Wenn also etwas spezifischer für die Adresse ist, über die die Verbindung hergestellt wurde, hat dieser Eintrag Vorrang. Ich denke jedoch nicht, dass dies Ihr Problem ist.

Darüber hinaus sehen Sie auf der Benutzerseite, was passieren würde, wenn der Client SNI in den meisten Fällen nicht unterstützen würde.

Falcon Momot
quelle
Ja, ich erwarte diesen Fehler auf dem ersten Host. Das einzige Verhalten, das ich dazu haben möchte, ist das Deaktivieren der Standardwebsite (die einzigen HTTPS-Sites, auf die zugegriffen werden kann, werden explizit von virtualhosts definiert). Auf jeden Fall scheinen die Dinge nicht zu funktionieren, selbst wenn sie kommentiert werden. Ich habe überprüft, ob die Zertifikate unterschiedlich sind (Anzeige mit openssl x509 -in cert.crt -text -noout), obwohl die Verwendung openssl s_client -showcerts -connect alias.com:443mir das server.com-Zertifikat zu geben scheint. Ich habe auch SSLStrictSNIVHostCheck onso sollte es auf Browser beschränken, die SNI unterstützen. Siehe bearbeiten für Site-Konfiguration
Arcyqwerty
Wenn ich den virtuellen Host von server.com auskommentiere, wird das richtige Zertifikat für alias.com übergeben, da es jetzt der erste vhost ist und auf Standard gesetzt ist
arcyqwerty