Eigenes SSL Zertifikat erstellen und Server einrichten
05. Februar 2011
Idee
Ich wollte mal ein wenig mit SSL spielen. Dafür habe ich mir eine Mini-Website erstellt, die aus drei Seiten besteht. Eine dieser Seiten sollte per HTTPS zugänglich sein. Dafür brauchte ich ein Zertifikat. Wie man dies erzeugt und den Webserver einrichtet, das soll nachfolgend erklärt werden. Achso, die "normalen" Seiten sollen per www.ssltest.ger erreichbar sein, die SSL-gesicherte Seite per ssl.ssltest.ger.
Ausgangsbasis
Ich nutze OpenSuSE Linux 10.3 mit Apache 2.2.4 sowie OpenSSL 0.9.8e.
Der Pfad zu meinem Testprogramm:
Virtuelle IPs anlegen
Wie wir weiter unten noch sehen werden, werden zwei IPs bzw. zwei virtuelle Hosts (mit jeweils einer IP) verwendet. Da ich aber (wie wohl die meisten von Euch) nur über einen Server (mit nur einer Netwerkkarte) verfüge, müssen wir so genannte virtuelle IP-Adressen anlegen. Dies ist aber nicht sonderlich schwierig. Wir geben dazu einfach nur nacheinander Folgendes auf der Kommandozeile ein (die Zeichen \> stellen den Kommando-Prompt dar):
Das Ergebnis kann man sich per ifconfig ansehen. Es müssten jetzt zwei neue Einträge eth0:1 und eth0:2 angezeigt werden.
Hinweis: diese virtuellen Geräte sind jedoch nicht von Dauer und müssen nach einem Neustart des Systems wieder neu angelegt werden.
Zertifikat erstellen
Nun wollen wir aber das Zertifikat erstellen. Dazu bedienen wir uns des Skripts gensslcert. Dabei habe ich einige Parameter übergeben, z.B. den Bezeichner "ssltest" für den so genannten Common-Name Parameter. Wichtig ist aber die Angabe des voll qualifizierten Domainnamens "ssl.ssltest.ger" (Parameter -n), da das Zertifikat exact für diese Domain erstellt wird. Lässt man die/einge Parameter weg, so werden die Default-Einstellungen übernommen.
Nachdem das Skript (hoffentlich) Fehlerfrei durchgelaufen ist, findet Ihr folgende Dateien im Verzeichnis /etc/apache2/:
Nun wird auch der Vorteil der Verwendung des Common-Name Parameters deutlich, da Ihr sofort Eure erstellten Dateien erkennen könnt (am Präfix "ssltest-").
Virtuelle Hosts anlegen
Im Verzeichnis /etc/apache2/vhosts.d/ kopieren wir die Datei vhost-ssl.template nach ssltest.conf. Danach öffnen wir diese Datei und bearbeiten sie wie folgt (beachte: es werden nur die Änderungen angezeigt):
Wir Ihr seht, wurden hier die (oben) angelegten virtuellen IPs sowie die Namen der erzeugten Zertifikate-Dateien eingetragen.
Achtung: Ihr müsst den DocumentRoot- und den Directory-Eintrag entsprechend Euren Gegebenheiten anpassen.
Die hier angelegten virtuellen Hosts sind so genannte IP-based virtual hosts. D.h., wir können für jede Website eine eigene IP vergeben und genau dies brauchen wir ja für unseren SSL-Test.
Fast fertig
Abschliessend gibt es noch ein paar kleine Handgriffe zu tun. Wir müssen die Datei /etc/hosts um folgende Einträge ergänzen:
Ihr müsst dabei <Mein Hostname> entsprechend ersetzen.
Nun sollte noch das SSL-Flag für den Apache gesetzt werden (falls noch nicht geschehen). Dies erledigt man per:
Zu guter letzt machen wir dem Apache unsere Änderungen bekannt:
Fertig
Nun könnt Ihr Euer "ssltest" Programm erstellen und im Browser per "http://www.ssltest.ger" bzw. die SSL-Seite per "https://ssl.ssltest.ger" aufrufen.
Wie immer bin ich für Vorschläge, Korrekturen usw. dankbar.
Ich wollte mal ein wenig mit SSL spielen. Dafür habe ich mir eine Mini-Website erstellt, die aus drei Seiten besteht. Eine dieser Seiten sollte per HTTPS zugänglich sein. Dafür brauchte ich ein Zertifikat. Wie man dies erzeugt und den Webserver einrichtet, das soll nachfolgend erklärt werden. Achso, die "normalen" Seiten sollen per www.ssltest.ger erreichbar sein, die SSL-gesicherte Seite per ssl.ssltest.ger.
Ausgangsbasis
Ich nutze OpenSuSE Linux 10.3 mit Apache 2.2.4 sowie OpenSSL 0.9.8e.
Der Pfad zu meinem Testprogramm:
daten
|-- myonics
|-- web
|-- research
|-- SSL2
|-- www
|-- index.html
|-- yes_ssl.html
|-- no_ssl.html
Virtuelle IPs anlegen
Wie wir weiter unten noch sehen werden, werden zwei IPs bzw. zwei virtuelle Hosts (mit jeweils einer IP) verwendet. Da ich aber (wie wohl die meisten von Euch) nur über einen Server (mit nur einer Netwerkkarte) verfüge, müssen wir so genannte virtuelle IP-Adressen anlegen. Dies ist aber nicht sonderlich schwierig. Wir geben dazu einfach nur nacheinander Folgendes auf der Kommandozeile ein (die Zeichen \> stellen den Kommando-Prompt dar):
\> ifconfig eth0:1 192.168.2.103 netmask 255.255.255.0 broadcast 192.168.2.255 up
\> ifconfig eth0:2 192.168.2.104 netmask 255.255.255.0 broadcast 192.168.2.255 up
Das Ergebnis kann man sich per ifconfig ansehen. Es müssten jetzt zwei neue Einträge eth0:1 und eth0:2 angezeigt werden.
Hinweis: diese virtuellen Geräte sind jedoch nicht von Dauer und müssen nach einem Neustart des Systems wieder neu angelegt werden.
Zertifikat erstellen
Nun wollen wir aber das Zertifikat erstellen. Dazu bedienen wir uns des Skripts gensslcert. Dabei habe ich einige Parameter übergeben, z.B. den Bezeichner "ssltest" für den so genannten Common-Name Parameter. Wichtig ist aber die Angabe des voll qualifizierten Domainnamens "ssl.ssltest.ger" (Parameter -n), da das Zertifikat exact für diese Domain erstellt wird. Lässt man die/einge Parameter weg, so werden die Default-Einstellungen übernommen.
\> gensslcert -C "ssltest" -c DE -l Halle -o "Myonics" -n "ssl.ssltest.ger"
Nachdem das Skript (hoffentlich) Fehlerfrei durchgelaufen ist, findet Ihr folgende Dateien im Verzeichnis /etc/apache2/:
./ssl.crt/ssltest-ca.crt
./ssl.crt/ssltest-server.crt
./ssl.csr/ssltest-server.crt
./ssl.key/ssltest-ca.key
./ssl.key/ssltest-server.key
Nun wird auch der Vorteil der Verwendung des Common-Name Parameters deutlich, da Ihr sofort Eure erstellten Dateien erkennen könnt (am Präfix "ssltest-").
Virtuelle Hosts anlegen
Im Verzeichnis /etc/apache2/vhosts.d/ kopieren wir die Datei vhost-ssl.template nach ssltest.conf. Danach öffnen wir diese Datei und bearbeiten sie wie folgt (beachte: es werden nur die Änderungen angezeigt):
NameVirtualHost 192.168.2.103:80
NameVirtualHost 192.168.2.104:443
# --------------------------------------------------------------
# vhost für http (Port 80)
# --------------------------------------------------------------
<VirtualHost 192.168.2.103:80>
DocumentRoot /daten/myonics/web/research/SSL2/www
<Directory "/daten/myonics/web/research/SSL2/www">
...
</Directory>
</VirtualHost>
# --------------------------------------------------------------
# vhost für https (Port 443)
# --------------------------------------------------------------
<IfDefine SSL>
<IfDefine !NOSSL>
<VirtualHost 192.168.2.104:443>
DocumentRoot /daten/myonics/web/research/SSL2/www
SSLCertificateFile /etc/apache2/ssl.crt/ssltest-server.crt
SSLCertificateKeyFile /etc/apache2/ssl.key/ssltest-server.key
SSLCertificateChainFile /etc/apache2/ssl.crt/ssltest-ca.crt
...
</VirtualHost>
</IfDefine>
</IfDefine>
Wir Ihr seht, wurden hier die (oben) angelegten virtuellen IPs sowie die Namen der erzeugten Zertifikate-Dateien eingetragen.
Achtung: Ihr müsst den DocumentRoot- und den Directory-Eintrag entsprechend Euren Gegebenheiten anpassen.
Die hier angelegten virtuellen Hosts sind so genannte IP-based virtual hosts. D.h., wir können für jede Website eine eigene IP vergeben und genau dies brauchen wir ja für unseren SSL-Test.
Fast fertig
Abschliessend gibt es noch ein paar kleine Handgriffe zu tun. Wir müssen die Datei /etc/hosts um folgende Einträge ergänzen:
192.168.2.103 <Mein Hostname> www.ssltest.ger
192.168.2.104 <Mein Hostname> ssl.ssltest.ger
Ihr müsst dabei <Mein Hostname> entsprechend ersetzen.
Nun sollte noch das SSL-Flag für den Apache gesetzt werden (falls noch nicht geschehen). Dies erledigt man per:
a2enflag SSL
Zu guter letzt machen wir dem Apache unsere Änderungen bekannt:
\> apache2ctl stop
\> apache2ctl start
\> rcapache2 restart
Fertig
Nun könnt Ihr Euer "ssltest" Programm erstellen und im Browser per "http://www.ssltest.ger" bzw. die SSL-Seite per "https://ssl.ssltest.ger" aufrufen.
Wie immer bin ich für Vorschläge, Korrekturen usw. dankbar.
Es wurde noch kein Kommentar abgegeben. Bist Du der Erste?
HILFE
Code-Beispiele werden mit den BBCodes [code][/code] dargestellt.
Jedes Tag muss eine Zeile für sich allein haben, d.h der Beispiel-Code
muss wirklich ZWISCHEN den Tags stehen. Beispiel:
Alles was zwischen den beiden Tags [register] und [/register] eingetragen wird, ist nur für registrierte (und eingeloggte) User sichtbar.
[code] ACHTUNG! HIER UMBRUCH WICHTIG. TAG [code] MUSS ALLEIN STEHEN
#include <stdio.h>
int main( void ){
return 0;
} ACHTUNG! HIER UMBRUCH WICHTIG. NACHFOLGENDES TAG [/code] MUSS ALLEIN STEHEN
[/code]Alles was zwischen den beiden Tags [register] und [/register] eingetragen wird, ist nur für registrierte (und eingeloggte) User sichtbar.
Dein Name *
Deine Email
Deine Website
Vorschau