Die Aufgabe: in Apache bei verschiedenen vhosts verschiedene SSL-Zertifikate fuer die Verschluesselung definieren.
Das Problem: mit mod_ssl laesst sich das ganze nicht so einfach realisieren.
Die Ursache: vhosts basieren auf Basis von HTTP-Headers, SSL liegt ein Layer darunter. Die Verbindung wird gesichert bevor HTTP gesprochen wird. Der Server kann bei Verbindungsaufbau nicht wissen welchen vhost er danach bedienen soll, deswegen kann er das richtiger Zertifikat nicht auswaehlen.
Die Loesung: mod_gnutls
HowTo: das ganze unter Debian Lenny
Ich gehe an dieser Stelle davon aus, dass man bereits SSL-Zertifikate generiert hat (blubs).
Als naechstes ist es nun wichtig das Modul zu installieren, anzupassen und zu aktivieren:
aptitude install libapache2-mod-gnutls |
aptitude install libapache2-mod-gnutls
Danach die /etc/apache2/mods-available/gnutls.conf anpassen:
<IfModule mod_gnutls.c>
GnuTLSCache dbm /var/cache/apache2/gnutls_cache
AddType application/x-x509-ca-cert .crt
AddType application/x-pkcs7-crl .crl
GnuTLSCacheTimeout 300
NameVirtualHost *:443
</IfModule> |
<IfModule mod_gnutls.c>
GnuTLSCache dbm /var/cache/apache2/gnutls_cache
AddType application/x-x509-ca-cert .crt
AddType application/x-pkcs7-crl .crl
GnuTLSCacheTimeout 300
NameVirtualHost *:443
</IfModule>
und das Modul aktivieren:
Nun noch die Zeile:
zu der /etc/apache2/ports.conf hinzufuegen und dabei darauf achten, dass die Zeile vor der „Listen 80“ steht, da es sonst in der /var/log/apache2/error.log zu den folgenden Zeilen kommen kann:
[Sun Dec 05 14:37:06 2010] [error] [client ::1] GnuTLS: Handshake Failed (-8) 'A record packet with illegal version was received.' |
[Sun Dec 05 14:37:06 2010] [error] [client ::1] GnuTLS: Handshake Failed (-8) 'A record packet with illegal version was received.'
Nun koennen die vhosts entsprechend eingerichtet werden. Hier ein generisches Beispiel fuer einen vhost:
<VirtualHost *:443>
ServerAdmin webmaster@example.net
ServerName www.example.net
ServerAlias example.net
DocumentRoot /var/www/example.net/
<Directory /var/www/example.net/>
Options +Indexes
</Directory>
GnuTLSEnable on
GnuTLSCertificateFile /etc/ssl/myCA/private/www.example.net-key-cert.pem
GnuTLSKeyFile /etc/ssl/myCA/private/www.example.net-key-cert.pem
GnuTLSPriorities SECURE:!MD5
CustomLog /var/log/apache2/example.net-access.log combined
</VirtualHost> |
<VirtualHost *:443>
ServerAdmin webmaster@example.net
ServerName www.example.net
ServerAlias example.net
DocumentRoot /var/www/example.net/
<Directory /var/www/example.net/>
Options +Indexes
</Directory>
GnuTLSEnable on
GnuTLSCertificateFile /etc/ssl/myCA/private/www.example.net-key-cert.pem
GnuTLSKeyFile /etc/ssl/myCA/private/www.example.net-key-cert.pem
GnuTLSPriorities SECURE:!MD5
CustomLog /var/log/apache2/example.net-access.log combined
</VirtualHost>
Nach einem Neustart von Apache2 kann nun per https auf den gewuenschten vhost zugegriffen werden, viel Spass beim Einrichten des zweiten und freien wenns klappt!