
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:
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
:
2
3
4
5
/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.
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
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:
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
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 ;-) ):
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
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:
2
3
4
5
6
7
8
9
10
11
12
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:
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):
2
abakus ~/ca-certs # cp webservername.newkey.pem /etc/apache2/ssl/
Nun wird der default-ssl
, die der Apache mitbringt, beigebracht wo die Zertifikate liegen:
2
3
4
5
6
# 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:
2
3
4
5
6
7
8
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!
Kategorien: Netzwerk Sicherheit Software