SNI und subjectAlternateName

elias5000

Site Reliability Engineer
Hallo,

Ich habe ein kleines Problem mit meinem Apache 2.4.7 mit mod_gnutls.
Und zwar versuche ich VHosts mit SNI verschiedene Zertifikate benutzen zu lassen. Das funktioniert auch soweit ganz gut, wenn der ServerName des VHost mit dem CN des Zertifikats identisch ist.

Jedoch wird immer auf das Zertifikat des Default-VHost zurückgegriffen, wenn der ServerName des VHost zwar nicht mit dem CN übereinstimmt, aber in der Liste in subjectAlternateName vorkommt. Welches Zertifikat für den VHost konfiguriert ist, scheint dem Apache dabei völlig egal. Es scheint nur am CN zugeordnet zu werden.

Das Problem wird dadurch verschärft, dass ich Zertifikate von Start-SSL einsetzen will. Start-SSL stellt keine Zertifikate auf example.org aus sondern nur für Subdomains. Der Hinweis, dass das Zertifikat ja nicht nur für whatever.example.org gültig sei sondern auch immer für example.org hilft mir da leider wenig, da ich so die Domain nicht in den CN bekomme.

Jetzt meine Frage: Kann ich den Apache irgendwie dazu bringen, dass er:
- entweder die Namen in subjectAlternateName ebenfalls beachtet oder
- er einfach das Zertifikat nimmt, dass im VHost für den Hostnamen konfiguriert ist - und zwar unabhängig davon, was im Zertifikat selbst steht.
 
Last edited by a moderator:
Ich habe keine Erfahrung mit Apache 2.4 und mod_gnutls, kann Dir aber aus meiner Erfahrung mit Apache 2.2 und mod_ssl mit Gewissheit sagen, dass die Auswahl des Zertifikats bei SNI NICHT davon abhängt welche Daten im Zertifikat tatsächlich hinterlegt sind.

SNI funktioniert bei Apache so, dass aus dem TLS-Handshake (Client-Helo) das server_name Property extrahiert und mit den ServerName und ServerAlias Einträgen deiner vHosts verglichen wird. Der erste matchende ServerName oder ServerAlias aus Deinen vHosts greift dann. Das dann im Server-Helo gesendete Server-Certificate ist jenes, welches bei diesem vHost hinterlegt ist. Ob nun der CommonName bzw. ein SubjectAlternateName in diesem Zertifikat überhaupt mit dem Servername/ServerAlias des vHosts übereinstimmt wird nicht geprüft.

Deine Beobachtung kann somit eigentlich nicht zutreffen - ich vermute Deine vHosts sind nicht stimmig konfiguriert bzw. Du hast für SSL (ports.conf, Port 443) noch kein NameVirtualHost aktiviert.

Nachtrag: Ich setze auch mehrere unterschiedliche StartSSL Zertifikate auf einem Server mit einer IP-Adresse ein, kann Dein Problem mit Apache 2.2 und mod_ssl nicht bestätigen.
 
Last edited by a moderator:
Deine Beobachtung kann somit eigentlich nicht zutreffen - ich vermute Deine vHosts sind nicht stimmig konfiguriert bzw. Du hast für SSL (ports.conf, Port 443) noch kein NameVirtualHost aktiviert.

Das kenne ich auch nur so.
Auf das Default-Vhost-Zertifikat wird nur zurückgegriffen, wenn für den Vhost kein Zertifikat angegeben wurde bzw kein Eintrag für Port 443 existiert
 
Dann habe ich die Dokumentation also schon richtig gelesen, dass die VHost-Config entscheidet und das anhand des ServerName bzw. der ServerAliases entschieden wird.
https://wiki.apache.org/httpd/NameBasedSSLVHostsWithSNI said:
Whichever VirtualHost is selected on the preceding basis will have its SSL configuration used to continue the handshake. Notably, the contents of the certificates are not used in any comparison.
Allerdings funktionieren die VHosts wie erwartet (würde ja sonst auch den default-VHost ansprechen) und NameVirtualHost ist auch an.
apache2ctl -S gibt folgende Ausgabe:
Code:
*:443                  is a NameVirtualHost
         default server e5k.de (/etc/apache2/sites-enabled/010-e5k.de.conf:6)
         port 443 namevhost e5k.de (/etc/apache2/sites-enabled/010-e5k.de.conf:6)
                 alias [url]www.e5k.de[/url]
                 alias e5k.de.web.test.e5k.de
         port 443 namevhost orga.example.de (/etc/apache2/sites-enabled/010-orga.example.de.conf:9)
                 alias [url]www.orga.example.de[/url]
                 alias orga.example.de.web.test.e5k.de
         port 443 namevhost pma.web.e5k.de (/etc/apache2/sites-enabled/010-phpmyadmin.conf:12)
                 alias pma.web.vpn.e5k.de
                 alias pma.web.test.e5k.de
         port 443 namevhost example.de (/etc/apache2/sites-enabled/010-example.de.conf:6)
                 alias [url]www.example.de[/url]
                 alias example.de.web.test.e5k.de
         port 443 namevhost stats.e5k.de (/etc/apache2/sites-enabled/010-stats.e5k.de.conf:6)
                 alias [url]www.stats.e5k.de[/url]
                 alias stats.e5k.de.web.test.e5k.de
Für orga.example.de bekomme ich auch das richtige Zertifikat angezeigt (orga.example.de im CN) aber für example.de bekomme ich das Zerifikat des default-VHost angezeigt. stats.e5k.de funktioniert auch wie erwartet (stats.e5k.de im CN).
Wenn ich example.de über den Alias www.example.de (identisch mit dem CN des Zertifikats) aufrufe, dann bekomme ich das richtige Zertifikat präsentiert.

Das Verhalten passt also irgendwie nicht zur Dokumentation. :-S Wenn ich example.de aufrufe, müsste auch das richtige Zertifikat genommen werden, da nur ein VHost darauf passt. Ich bekomme aber das Zertifikat des Default-VHost...

Edit: Mir ist gerade aufgefallen, dass ich doch noch nicht mit mod_ssl getestet hatte. Ich hatte das nur angefangen aber dann war es zu spät geworden. Ich werde das also noch testen.
 
Last edited by a moderator:
Deine Konfiguration scheint nicht zu stimmen.
Schaue Dir bitte einmal die config von default und von example.de an.

die richtige Seite bekommst du aber angezeigt?
 
Last edited by a moderator:
Deine Konfiguration scheint nicht zu stimmen.
Schaue Dir bitte einmal die config von default und von example.de an.

Das müsste soweit ok sein. Beide basieren auf diesen Templates:
VHost skeleton:
Code:
<VirtualHost *:80>
  Include /etc/apache2/sites/<%= @hostname %>.inc.conf

<% if @enforce_ssl -%>
  RewriteEngine On
  RewriteCond %{HTTPS} !=on
  RewriteRule ^(.*) https://%{SERVER_NAME}$1 [R,L]
<% end -%>
</VirtualHost>

<VirtualHost *:443>
  Include /etc/apache2/sites/<%= @hostname %>.inc.conf

  GnuTLSEnable on
  GnuTLSPriorities NORMAL
  GnuTLSCertificateFile /etc/apache2/sites/<%= @hostname %>.cer
  GnuTLSKeyFile /etc/apache2/sites/<%= @hostname %>.key
</VirtualHost>

Include mit der VHost-Config:
Code:
### Server names ###########################################
  ServerName <%= @hostname %>
  ServerAlias www.<%= @hostname %>
  ServerAlias <%= @hostname %>.web.test.e5k.de
  ServerAdmin webmaster@e5k.de

### Web config #############################################
  DocumentRoot /var/www/<%= @hostname %>
  DirectoryIndex index.php index.html

  <Directory /var/www/<%= @hostname %>>
    Options -Indexes
    AllowOverride All
  </Directory>

  php_admin_value   open_basedir    "/var/www/<%= @hostname %>"

### Output compression #####################################
  SetOutputFilter DEFLATE
  SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png)$ no-gzip dont-vary
  SetEnvIfNoCase Request_URI \.(?:exe|t?gz|zip|gz2|sit|rar)$ no-gzip dont-vary

die richtige Seite bekommst du aber angezeigt?
Ja.
 
Nach ersten Tests des mod_ssl-Ports meiner Config auf der Entwicklungsumgebung scheint es an mod_gnutls zu liegen.

Update: Mit mod_ssl funktioniert es definitiv so wie erwartet. Anders als mit mod_gnutls. Ich nehme daher an, dass es an mod_gnutls lag.
 
Last edited by a moderator:
Back
Top