öffnen Tags

öffnen Kategorien

Vom WebReader vorlesen lassen

SSL-Certs erstellen und mit eigener CA signieren

06. Oct 2009, 19:54

Inhalt: Zertifizierungsstelle einrichten | Zertifikat erstellen | Apache mit SSL

Zurück zum spannenden Thema Verschlüsselung! Heute gibt's eine Anleitung wie man seine eigenen SSL-Zertifikate erstellt und damit die Kommunikation zwischen Server (hier Apache) und Client verschlüsselt.

Natürlich kommen wir um ein paar wenige Pakete nicht herum:

1
aptitude install openssl ca-certificates

Wir nutzen zum Erstellen und bearbeiten der Zertifikate das Perl-Script, welches mit dem Paket openssl geliefert wird. Wo sich dieses genau befindet ermittelt man am einfachsten mit einem locate:

1
2
3
4
5
abakus ~/ca-certs # locate CA.pl
/usr/lib/ssl/misc/CA.pl
/usr/share/doc/openssl/doc/apps/CA.pl.pod.gz
/usr/share/man/man1/CA.pl.1ssl.gz
abakus ~/ca-certs # ln -s /usr/lib/ssl/misc/CA.pl

Bei mir war es also in /usr/lib/ssl/misc/, ich habe es der Einfachheit halber in mein Arbeitsverzeichnis verlinkt.
Die globale Konfiguration kann man in der Datei /etc/ssl/openssl.cnf vornehmen, ich habe nur die default_bits im [ req ]-Bereich auf 4096 gesetzt und die Default-Attribute in [ req_distinguished_name ] Angepasst, damit werden Zertifikate standardmäßig 4096 Bits groß und die Zertifikats-Attribute werden schon mit sinnvollen Inhalten besetzt, so dass man die Default-Einträge beim erstellen mit einem Return einfach bestätigen kann. Bin nun mal recht Faul was solche Geschichten betrifft!

Zertifizierungsstelle einrichten top

Soviel zur Vorarbeit, jetzt geht's ans Eingemachte! Zu Beginn richten wir uns eine sogenannte Zertifizierungsstelle (Certificate Authority, kurz CA) ein, von der wir dann unsere Zertifikate herausgeben.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
abakus ~/ca-certs # ./CA.pl -newca
CA certificate filename (or enter to create)

Making CA certificate ...
Generating a 4096 bit RSA private key
.......................................................++
.....................................................................................................................................................................................................................................++
writing new private key to './demoCA/private/cakey.pem'
Enter PEM pass phrase:
Verifying - Enter PEM pass phrase:
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [DEFAULT_COUNTRY]:
State or Province Name (full name) [DEFAULT_STATE]:
Locality Name (eg, city) [DEFAULT_LN]:
Organization Name (eg, company) [DEFAULT_O]:
Organizational Unit Name (eg, section) [DEFAULT_OU]:
Common Name (eg, YOUR name) []:abakus
Email Address [DEFAULT_MAIL]:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
Using configuration from /usr/lib/ssl/openssl.cnf
Enter pass phrase for ./demoCA/private/cakey.pem:
Check that the request matches the signature
Signature ok
Certificate Details:
[...]
Certificate is to be certified until Aug 21 12:22:40 2012 GMT (1095 days)

Write out database with 1 new entries
Data Base Updated
abakus ~/ca-certs # l
total 12K
drwxr-xr-x 3 root root 4.0K 2009-08-22 14:15 .
drwxrwx--- 26 root root 4.0K 2009-08-22 14:21 ..
lrwxrwxrwx 1 root root 23 2009-08-22 14:14 CA.pl -> /usr/lib/ssl/misc/CA.pl
drwxr-xr-x 6 root root 4.0K 2009-08-22 14:22 demoCA
abakus ~/ca-certs #

In den hervorgehobenen Zeilen erwartet das Script eine Eingabe. Da es hier um Sicherheit geht wird natürlich als aller erstes ein Passwort in Zeile 9 und 10 festgelegt. Mit diesem authentifizieren wir uns dann als Inhaber der CA. Danach erstellen wir unser Root-Zertifikat (Zeile 19-31). Mit den Attributen, die abgefragt werden, identifizieren wir nun unsere Maschine, die DEFAULT's kommen aus der /etc/ssl/openssl.cnf und stimmen bei mir, kann ich also einfach bestätigen, ansonsten übergibt man einfach einen alternativen Wert. Den Common Name setzt man natürlich für jede Maschine anders, daher habe ich hier keinen Default-Wert, mein Rechner heisst abakus, also wird das Root-Zertifikat für abakus ausgestellt.
Das nächste Passwort sollte man nicht setzten (leer lassen), dieses benötigt man ansonsten um das Zertifikat benutzen zu können.
Jetzt wird das Zertifikat noch mit dem Passwort der CA bestätigt (dieses wurde als erstes abgefragt) und ggf. angelegt.
Ein Blick in das Verzeichnis zeigt einen neuen Ordner, in dem die Ordnerstruktur für die Zertifikate erstellt wurde.

Zertifikat erstellen top

Als Inhaber einer Zertifizierungsstelle können wir nun unser erstes eigenes Zertifikat herausgeben. Dies geschieht mit dem selben Perl-Script:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
abakus ~/ca-certs # ./CA.pl -newreq-nodes
Generating a 4096 bit RSA private key
...........++
.....................................++
writing new private key to 'newkey.pem'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [DEFAULT_COUNTRY]:
State or Province Name (full name) [DEFAULT_STATE]:
Locality Name (eg, city) [DEFAULT_LN]:
Organization Name (eg, company) [DEFAULT_O]:
Organizational Unit Name (eg, section) [DEFAULT_OU]:
Common Name (eg, YOUR name) []:webservername
Email Address [DEFAULT_MAIL]:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
Request is in newreq.pem, private key is in newkey.pem
abakus ~/ca-certs # l
total 20K
drwxr-xr-x 3 root root 4.0K 2009-08-22 14:28 .
drwxrwx--- 26 root root 4.0K 2009-08-22 14:24 ..
lrwxrwxrwx 1 root root 23 2009-08-22 14:14 CA.pl -> /usr/lib/ssl/misc/CA.pl
drwxr-xr-x 6 root root 4.0K 2009-08-22 14:22 demoCA
-rw-r--r-- 1 root root 3.2K 2009-08-22 14:28 newkey.pem
-rw-r--r-- 1 root root 1.8K 2009-08-22 14:28 newreq.pem
abakus ~/ca-certs #

Damit haben wir einen Antrag für ein Zertifikat erstellt. Die Fragen sollten natürlich wieder ordnungsgemäß beantwortet werden, ein Challenge-Passwort sollte man auch hier nicht vergeben, sonst müsste der Apache immer ein Passwort angeben wenn er das Zertifikat benutzen will.

Diesen Antrag schicken wir nun zur Zertifizierungsstelle (wir selbst, gleicher Ordner) und lassen den Antrag unterschrieben (wir Fachleute nennen das signieren ;-) ):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
abakus ~/ca-certs # ./CA.pl -sign
Using configuration from /usr/lib/ssl/openssl.cnf
Enter pass phrase for ./demoCA/private/cakey.pem:
Check that the request matches the signature
Signature ok
Certificate Details:
[...]

Certificate is to be certified until Aug 22 12:31:47 2010 GMT (365 days)
Sign the certificate? [y/n]:y


1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated
Signed certificate is in newcert.pem
abakus ~/ca-certs # l
total 28K
drwxr-xr-x 3 root root 4.0K 2009-08-22 14:31 .
drwxrwx--- 26 root root 4.0K 2009-08-22 14:24 ..
lrwxrwxrwx 1 root root 23 2009-08-22 14:14 CA.pl -> /usr/lib/ssl/misc/CA.pl
drwxr-xr-x 6 root root 4.0K 2009-08-22 14:31 demoCA
-rw-r--r-- 1 root root 7.3K 2009-08-22 14:31 newcert.pem
-rw-r--r-- 1 root root 3.2K 2009-08-22 14:28 newkey.pem
-rw-r--r-- 1 root root 1.8K 2009-08-22 14:28 newreq.pem
abakus ~/ca-certs #

Zum signieren, wer hätte es gedacht, brauchen wir wieder das Passwort der CA. Danach werden nochmal alle Details des Zertifikates angezeigt, welche man sich genaustens anschauen sollte! Ein Zertifikat später zu widerrufen ist auch nicht ganz trivial, erklär ich vielleicht das nächste Mal.
Sind alle Angaben korrekt wird noch eine Sicherheitsabfrage mit y bestätigt und wir haben ein vollwertiges Zertifikat!

Was sind denn das nun für Dateien in dem Ordner?
Ok, gehen wir mal durch:

  • CA.pl ist das Script, welches uns die Arbeit mit den Zertifikaten erleichtert (aus dem Paket openssl)
  • In demoCA liegt unsere Zertifizierungsstelle, der Ordner heißt so von Haus aus, man kann den Namen ändern indem man die Variable $CATOP aus dem Perl-Script anpasst.
  • In newcert.pem liegt das brandneue Zertifikat
  • newkey.pem ist unser private Key zu dem Zertifikat, dass dieser nicht herausgegeben werden darf sollte sich von selbst verstehen!
  • newreq.pem ist der Zertifikatsantrag, der von der CA unterschrieben wurde

Super, jetzt sichern wir unsere Zertifikate indem wir sie einfach umbenennen. Machen wir das nicht, werden die Dateien mit dem nächsten Zertifikat einfach überschrieben, wollen wir aber vermeiden. Ich habe einen kleinen Workaround, lässt sich auch prima in ein Script packen:

1
2
3
4
5
6
7
8
9
10
11
12
abakus ~/ca-certs # NAME=webservername
abakus ~/ca-certs # for i in `ls new*.pem`; do mv -i $i ${NAME}"."$i; done
abakus ~/ca-certs # l
total 28K
drwxr-xr-x 3 root root 4.0K 2009-08-22 14:35 .
drwxrwx--- 26 root root 4.0K 2009-08-22 14:24 ..
lrwxrwxrwx 1 root root 23 2009-08-22 14:14 CA.pl -> /usr/lib/ssl/misc/CA.pl
drwxr-xr-x 6 root root 4.0K 2009-08-22 14:31 demoCA
-rw-r--r-- 1 root root 7.3K 2009-08-22 14:31 webservername.newcert.pem
-rw-r--r-- 1 root root 3.2K 2009-08-22 14:28 webservername.newkey.pem
-rw-r--r-- 1 root root 1.8K 2009-08-22 14:28 webservername.newreq.pem
abakus ~/ca-certs #


Apache mit SSL top

Nachdem das so gut geklappt hat, gibt es ein kleines Beispiel wie man dem Apachen beibringt das Zertifikat zu benutzen.

Ich habe mir mal ein Verzeichnis erstellt, wo ich das Zertifikat ablege:

1
abakus ~/ca-certs # mkdir /etc/apache2/ssl/

Man kann natürlich auch die vorhandene Ordnerstruktur in /etc/ssl/ nutzen. Nun werden das Zertifikat und der Key dort hin kopiert (den Zertifizierungsantrag braucht der Apache für gewöhnlich nicht):

1
2
abakus ~/ca-certs # cp webservername.newcert.pem /etc/apache2/ssl/
abakus ~/ca-certs # cp webservername.newkey.pem /etc/apache2/ssl/

Nun wird der default-ssl, die der Apache mitbringt, beigebracht wo die Zertifikate liegen:

1
2
3
4
5
6
abakus ~/ca-certs # vim /etc/apache2/sites-available/default-ssl
# SSL einschalten
SSLEngine on
# Pfade zum Zertifikat bekannt machen
SSLCertificateFile /etc/apache2/ssl/webservername.newcert.pem
SSLCertificateKeyFile /etc/apache2/ssl/webservername.newkey.pem

Jetzt laden wir noch das SSL-Modul und schalten die default-ssl ein:

1
2
3
4
5
6
7
8
abakus ~/ca-certs # a2enmod ssl
Enabling module ssl.
See /usr/share/doc/apache2.2-common/README.Debian.gz on how to configure SSL and create self-signed certificates.
Run '/etc/init.d/apache2 restart' to activate new configuration!
abakus ~/ca-certs # a2ensite default-ssl
Enabling site default-ssl.
Run '/etc/init.d/apache2 reload' to activate new configuration!
abakus ~/ca-certs # /etc/init.d/apache2 reload

Voila, wenn wir nun https://webservername/ aufrufen, wird die Verbindung korrekt verschlüsselt. Die üblichen Browser spucken noch eine Warnung aus, dass das Zertifikat selbst unterschrieben wurde (The certificate is not trusted because the issuer certificate is unknown.), diese können wir aber ignorieren. Wir bekommen sie nur weg, wenn wir das Zertifikat von einer vertrauenswürdigen CA signieren lassen, diese wollen aber meist eine ganze Stange Geld dafür.

Damit ist die Kommunikation mit dem Webserver halbwegs gesichert. Das Zertifikat funktioniert aber natürlich nicht nur im Apachen, man kann genauso die Kommunikation des LDAP's, der Backup-Software oder des FTP-Servers damit verschlüsseln. Ausprobieren!

Tags: Debian Kryptographie Netzwerk Security Software

Kategorien: Netzwerk Sicherheit Software

07. Oct 2009

Sicherheitslücke

Von: Ronny, 07:44:53

Du solltest noch erwähnen, dass ein selbstsigniertes Zertifikat eigentlich eine Sicherheitslücke ist und Man-In-The-Middle-Angriffe zulässt!
Wer schaut sich nämlich schon den Fingerprint eines Schlüssels genau an, wenn er mal wieder von einem selbstsignierten Zertifikat genervt wird?

07. Oct 2009

Re: Sicherheitslücke

Von: Martin, 21:09:07

Vielen Dank für den Hinweis, das ist natürlich ein großes Sicherheitsproblem! Jedoch betrifft es in erster Linie nicht den Administrator des Webservers, sondern seine Besucher.
Mir fällt zumindest keine sinnvolle Alternative ein, die diesen Missstand behebt :(

© 2009-2018 by Martin Scharm