30. April 2006
Ihr Anliegen
Sie wollen im Internet einen Serverdienst aufsetzen, welcher verschlüsselte SSL oder
TLS-Verbindungen anbietet (z.B. HTTPS, POP3S, IMAPS, LDAPS, SMTP mit TLS).
Die Schwierigkeit dabei
Um eine mit SSL/TLS abgesicherte Verbindung anzubieten, benötigen Sie ein Serverzertifikat.
Dieses muss von einer Zertifizierungsstelle (Certification Authority oder kurz CA) signiert sein.
Ein offizielles Serverzertifikat, welches von einer offiziellen Stelle
signiert ist, ist leider nicht kostenlos. Meist werden jährliche Gebühren in Höhe von
mehreren hundert Euro fällig.
Eine Mögliche Lösung
Unter Linux kann man mit Bordmitteln eine eigene CA aufsetzen und ein selbst Zertifikate
erstellen und signieren. Das ist ein Vorgang von wenigen Minuten. Alle Einzelheiten
beschreibt dieser Artikel.
Der einzige Unterschied zu einem von einer anerkannten Stelle signierten Zertifikat ist,
dass der Client (Emailprogramm, Browser, etc.) eine Warnung ausgeben wird, dass er die CA
nicht kennt. Der Benutzer muss dann einmal bestätigen und kann das Zertifikat trotzdem
akzeptieren.
Genaues Vorgehen
1. OpenSSL installieren
Für die Verwaltung der Zertifikate und im übrigen auch für die Verschlüsselung der Verbindungen
mit SSL und TLS kommt unter Linux fast immer OpenSSL zum Einsatz. Wahrscheinlich ist das
auf Ihrem Sytem deshalb bereits installiert. Wenn nicht, müssen Sie das Paket openssl
nachinstallieren. Sie benötigen aus diesem Paket den Kommandozeilenbefehl openssl.
2. Erstellen der CA
Legen Sie zunächst ein Verzeichnis an, in dem Sie das Zertifikat ablegen wollen.
Wir nehmen in unserem Beispiel /root/ca:
root@linux# mkdir /root/ca
root@linux# cd /root/ca
Die Gültigkeit setzen wir mit
10 Jahren bewusst sehr hoch an. Läuft die CA aus, so werden nämlich auch alle damit
signierten Serverzertifikate ungültig. Die CA enthält einen geheimen Schlüssel, welcher
automatisch erzeugt und in der Datei cakey.pem abgelegt wird. Das CA-Zertifikat
wird nach cacert.pem geschrieben. Der folgende Befehl erzeugt das Zertifikat:
root@linux# openssl req -new -x509 -keyout cakey.pem -out cacert.pem -days 3650
Generating a 1024 bit RSA private key
.++++++
............++++++
writing new private key to 'cakey.pem'
Wer den geheimen Schlüssel der CA kennt, kann damit beliebige Serverzertifikate signieren. Deshalb
wird diese Schlüsseldatei nicht im Klartext auf der Festplatte abgelegt, sondern mit einer
Passphrase verschlüsselt. Diese Passphrase benötigen Sie immer dann, wenn Sie mit der CA
neue Zertifikate ausstellen wollen:
Enter PEM pass phrase: wrzlprmpft
Verifying - Enter PEM pass phrase: wrzlprmpft
Nun werden Sie gebeten, Daten einzugeben, welche die CA identifizieren. Diese
werden dem Client angezeigt, wenn er aufgefordert wird, das Zertifikat zu akzeptieren
oder abzulehnen. Der Code für Deutschland ist DE. Wenn Sie ein Feld
leerlassen möchten, so geben Sie einen Punkt ein. Ansonsten wird der in
eckigen Klammern stehende Defaultwert eingetragen:
-----
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) [AU]: DE
State or Province Name (full name) [Some-State]:.
Locality Name (eg, city) []:Muenchen
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Hinz und Kunz AG
Organizational Unit Name (eg, section) []:.
In das Feld Common Name (CN): können Sie Ihren Namen eintragen:
Common Name (eg, YOUR name) []: Adam Hinz
Email Address []: adam@hinzag.eu
Fertig. Folgende zwei Dateien sind entstanden:
root@linux# ll
insgesamt 9
drwxr-xr-x 2 root root 112 2006-04-30 12:08 .
drwx------ 12 root root 600 2006-04-30 11:54 ..
-rw-r--r-- 1 root root 1212 2006-04-30 12:08 cacert.pem
-rw-r--r-- 1 root root 963 2006-04-30 12:08 cakey.pem
Vorsichtshalber sollten Sie die Rechte so setzen, dass die Schlüsseldatei nur für root lesbar
ist:
root@linux# chmod 600 cakey.pem
Sie können nun ausprobieren, ob sie den Schlüssel mit der Passphrase wieder öffnen können:
root@linux# openssl rsa -in cakey.pem -noout -text
Enter pass phrase for cakey.pem: wrzlprmpft
Private-Key: (1024 bit)
modulus:
00:d5:a5:37:51:e9:d9:fa:e3:97:e7:46:b2:88:1a:
b5:46:80:47:76:14:ae:2b:8b:3e:35:5c:ab:15:84:
53:d9:63:2e:7f:08:4b:ec:77:db:02:45:f8:c7:46:
58:cd:2d:f9:29:4d:96:3d:d8:6c:5d:9f:79:8a:04:
cf:b7:3a:89:da:a9:63:9f:44:b3:83:cf:0d:70:7d:
usw...
3. Schlüssel für das Serverzertifikat erzeugen
Nachdem wir nun eine eigene CA haben, kann diese nun endlich für unseren Server
ein Zertifikat herausgeben. Dazu erzeugen wir zunächst einen 2048 Bit langen
RSA Schlüssel, der mit AES 128 verschlüsselt auf der Platte abgelegt wird (ja wirklich,
auch hier wieder ein verschlüsselter Schlüssel). Die Passphrase
muss diesmal nicht sonderlich geheim sein, da wir sie ohnehin im Anschluss wieder
entfernen werden. OpenSSL lässt allerdings keine leere Phrase zu:
root@linux# openssl genrsa -out serverkey.pem -aes128 2048 -days 365
Generating RSA private key, 2048 bit long modulus
....+++
.......................................+++
e is 65537 (0x10001)
Enter pass phrase for serverkey.pem: jaja
Verifying - Enter pass phrase for serverkey.pem: jaja
So. Nun entfernen wir die Passphrase wieder. Warum? Der Serverdienst (Apache, Cyrus, etc.)
muss schließlich in der Lage sein, den Schlüssel ohne Ihr Zutun zu lesen. Oder wollen
Sie bei jedem Booten des Rechners ein Passwort eingeben müssen?
root@linux# openssl rsa -in serverkey.pem -out serverkey.pem
Enter pass phrase for serverkey.pem: jaja
writing RSA key
4. Certificate Signing Request erzeugen
Der nächste Schritt zum eigenen Zertifikat ist ein CSR. Dies muss dann nur noch von der CA
signiert werden. Hier sind wieder Angaben analog zum Erstellen der CA nötig, was oft
Verwirrung stiftet. Die allgemeinen Daten kann man ggfl. gleich wie oben eingeben:
root@linux# openssl req -new -key serverkey.pem -out req.pem -nodes
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) [AU]: DE
State or Province Name (full name) [Some-State]:.
Locality Name (eg, city) []:Muenchen
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Hinz und Kunz AG
Organizational Unit Name (eg, section) []:.
ACHTUNG, jetzt kommt das Wichtige: Beim Serverzertifikat ist der Common Name
von entscheidender Bedeutung. Hier muss der DNS-Name stehen, unter dem der Client den
Server anspricht! Wird das Zertifikat für eine HTTPS-Verbindung zu www.hinzag.eu verwendet,
so muss der Common Name eben genau www.hinzag.eu heißen. Anderfalls wird
der Browser das Zertifikat nicht akzeptieren, da er davon ausgehen muss, auf dem falschen
Server gelandet zu sein.
Common Name (eg, YOUR name) []: www.hinzag.eu
Email Address []: adam@hinzag.eu
Weitere Optionen kann man einfach leer lassen:
A challenge password []:
An optional company name []:
Mittlerweile tummeln sich schon vier Dateien in unserem Verzeichnis:
root@linux# ll
insgesamt 17
drwxr-xr-x 2 root root 168 2006-04-30 12:29 .
drwx------ 12 root root 600 2006-04-30 11:54 ..
-rw-r--r-- 1 root root 1212 2006-04-30 12:08 cacert.pem
-rw------- 1 root root 963 2006-04-30 12:08 cakey.pem
-rw-r--r-- 1 root root 1017 2006-04-30 12:29 req.pem
-rw-r--r-- 1 root root 1679 2006-04-30 12:21 serverkey.pem
5. OpenSSL-Konfiguration anpassen
Leider kann man bei OpenSSL nicht alle Daten als Kommandozeilenargumente
übergeben. Einige Einstellungen muss man lästigerweise in der Datei /etc/ssl/openssl.cnf
ändern, bevor man signieren kann. Öffnen Sie diese Datei und passen Sie folgende Zeilen
in der Sektion [ CA_default ] an:
/etc/ssl/openssl.cnf:
dir = . # Where everything is kept
new_certs_dir = $dir # default place for new certs
private_key = $dir/cakey.pem # The private key
RANDFILE = $dir/.rand # private random number file
default_days = 3650 # how long to certify for
Das Feld default_days ist auf 365 Tage voreingestellt und gibt die Gültigkeit
des Zertifikates an. Abgelaufene Zertifikate sind im Übrigen ein sehr häufiges
Problem. Wenn es soweit ist, kennt sich damit nämlich schon lange keiner mehr aus. Deswegen
können Sie wie im Beispiel angegeben die Lebensdauer z.B. auf 10 Jahre heraufsetzen.
Wenn Sie beim Serverzertifikat keinen Bundesstaat angegeben haben,
benötigen Sie noch folgende Änderung unter [ policy_match ]:
stateOrProvinceName = optional
Nun muss man noch einige Dateien anlegen:
root@linux# echo 01 > serial
root@linux# touch index.txt
6. Serverzertifikat signieren
Kommen wir zum feierlichen Abschluss: Unsere CA signiert nun das Zertifikat:
root@linux# openssl ca -in req.pem -notext -out servercert.pem
Enter pass phrase for ./cakey.pem: wrzlprmpft
...
Certificate is to be certified until Apr 27 10:45:36 2016 GMT (3650 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
7. Zertifikate installieren
Wohin sie die Zertifikate installieren, hängt natürlich vom jeweiligen Serverdienst
ab. Was allen gemeinsam ist: Sie benötigen nur die Dateien cacert.pem,
servercert.pem und serverkey.pem. Die Datei cakey.pem
wird nicht benötigt. Sie sollte am besten auch nicht auf dem Server liegen
sondern an einer sicheren Stelle auf einem anderen Rechner.
|