apache virtual hosts mit ssl unter linux

Es wird immer wichtiger, dass man Daten nicht einfach so durchs Netz schickt, sondern die Daten verschlüsselt transportiert. Die Lösung ist ein apache, mit ssl und verschiedenen virtuellen hosts. Meine Grundidee ist folgende: schnell und einfach https://<dienstname>:<port> zu implementieren. Dazu braucht es natürlich erstmal eine funktionierende apache Installation. Aber das erkläre ich hier sicher nicht! Und wir gehen noch davon aus, dass wir nicht den Standard Port 443 nehmen wollen, sondern einen beliebigen. Das Ziel ist ja mehrere Seiten/ Dienste zu erstellen.

Zuerst kümmern wir uns um die Zertifikate:

  • sucht euch einen beliebigen Ort, z.B. /tmp/test um dort die Zertifikate zu erstellen und erstmal zu speichern
  • und los gehts:
    $ sudo openssl genrsa -des3 -out <name>-ssl-cert-private.key 1024
    

    ihr müsst nichts eingeben, außer dem Passwort und das natürlich gut merken!

  • ok, dann nehmen wir den erstellten Key und erstellen ein ‘certificate request’:
    $ sudo openssl req -new -key <name>-ssl-cert-private.key -out <name>-ssl-cert-file.pem
    
  • und jetzt erstellen wir noch das selbst-signierte Zertifikat:
    $ sudo openssl x509 -req -days 365 -in <name>-ssl-cert-file.pem -signkey <name>-ssl-cert-private.key -out <name>-ssl-server.crt
    
  • jetzt müssen die Zertifikate an den richtigen Ort kopiert werden:
    $ sudo cp <name>-ssl-server.crt /etc/ssl/certs
    
    $ sudo cp <name>-ssl-cert-private.key /etc/ssl/private
    

Das wars auch schon fürs Erste.

Apache Konfiguration

  • ssl Modul aktivieren:
    $ sudo a2enmod ssl
  • jetzt müssen die Ports, auf denen der apache lauschen soll konfiguriert werden, dazu in /etc/apache2/ports.conf den Port 443, den wir nicht wollen auskommentieren und die gewünschten Ports hinzufügen:
    #nur ein Auszug der Datei
    <IfModule mod_ssl.c>
        #Listen 443
        Listen 2000
        Listen 3000
        #und mehr.... oder weniger
    </IfModule>
    
  • und jetzt kopieren wir die default-ssl Seite (Konfigurationsdatei), die wir gleich als virtuellen Host nutzen wollen:
    $ sudo cp default-ssl <name>-ssl
    
  • jetzt geht heißt es die Datei richtig zu konfigurieren, hier ein Auszug wie eure Datei aussehen könnte. Beachtet die Kommentare:
    <IfModule mod_ssl.c>
    #nicht vergessen!
    NameVirtualHost *:3000
    
    <VirtualHost *:3000>       #port auch hier nicht vergessen
    	ServerAdmin webmaster@localhost
    
    	DocumentRoot /var/www/<name>-ssl   #den Pfad anpassen
    	<Directory />
    		Options FollowSymLinks
    		AllowOverride None
    	</Directory>
    	<Directory /var/www/<name>-ssl>   #den Pfad anpassen
    		Options -Indexes FollowSymLinks MultiViews
    		AllowOverride None
    		Order allow,deny
    		allow from all
    	</Directory>
    
    	ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
    	<Directory "/usr/lib/cgi-bin">
    		AllowOverride None
    		Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch
    		Order allow,deny
    		Allow from all
    	</Directory>
    
    	ErrorLog /var/log/apache2/error.log
    	LogLevel warn
    
    	CustomLog /var/log/apache2/ssl_access.log combined
    
    	#   SSL Engine Switch:
    	#   Enable/Disable SSL for this virtual host.
    	SSLEngine on
    
            #
            ##  HIER SIND UNSERE ERSTELLTEN ZERTIFIKATE!!!
            #
            SSLCertificateFile    /etc/ssl/certs/<name>-ssl-server.crt
            SSLCertificateKeyFile /etc/ssl/private/<name>-ssl-cert-private.key
    
    	<FilesMatch "\.(cgi|shtml|phtml|php)$">
    		SSLOptions +StdEnvVars
    	</FilesMatch>
    	<Directory /usr/lib/cgi-bin>
    		SSLOptions +StdEnvVars
    	</Directory>
    
    	BrowserMatch ".*MSIE.*" \
    		nokeepalive ssl-unclean-shutdown \
    		downgrade-1.0 force-response-1.0
    
    </VirtualHost>
    </IfModule>
    
  • Jetzt die Datei speichern und dann:
    $ sudo a2ensite jk-ssl
    

    jetzt den apache neu starten; ihr müsst jetzt natürlich die Passwörter für die Zertifikate eingeben

    $ sudo /etc/init.d/apache2 restart
    
  • wenn ihr nur kleine Konfigurationseinstellungen macht, reicht es auch die apache Konfiguration neu zu laden:
    $ sudo /etc/init.d/apache2 reload
    

Ihr habt es geschafft, auf geht’s nach https://<ip|dns>:<port> und alles müsste funktionieren. Eine kleine Anmerkung noch, wenn ihr alle Seiten/ Dienste unter ‘/var/www’ speichert und die default Seite aktiviert ist, solltet ihr in dieser sicherheitshalber ‘-Indexes’ statt Indexes eingeben. Dies ist eig. nicht nötig, aber solltet ihr mal die index.html (in der It works! steht) versehentlich löschen, da ihr denkt, ach die Datei brauche ich ja wirklich nicht. Dann kann man durch einen Aufruf im Browser auch auf eure eig. https basierten Dienste per http zugreifen.

Have fun

Tags: , ,

Leave a Reply