SSL-Zertifikat erstellen

21. Dezember 2014 oremilac Linux

Du willst einen Serverdienst aufsetzen, welcher verschlüsselte SSL oder TLS-Verbindungen (z.B. HTTPS, POP3S, IMAPS, LDAPS, SMTP mit TLS) anbietet?
Um eine mit SSL/TLS abgesicherte Verbindung anzubieten, benötigen wir 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 verlangt.
Unter Linux kann man mit Bordmitteln eine eigene CA aufsetzen und ein selbst Zertifikate erstellen und signieren.
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 trotz der Browserwarnung bedenkenlos akzeptieren.

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.

Zunächst legen wir in /root ein Verzeichnis an, in dem das Zertifikat gespeichert werden soll. Wir nehmen /root/ca:

cd /root
mkdir /ca
cd /ca

Das CA-Zertifikat wird nach cacert.pem geschrieben. Der folgende Befehl erzeugt einen Schlüssel für das Zertifikat mit einer Länge von 2048 Bit
(4096Bit ist nicht von allem zu verarbeiten):

openssl req -new -x509 -newkey rsa:2048 -keyout cakey.pem -out cacert.pem -days 3650

Generating a 2048 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 wir immer dann, wenn mit der CA neue Zertifikate ausgestellt werden sollen:

Enter PEM pass phrase: sicheres Passwort
Verifying - Enter PEM pass phrase: sicheres Passwort

Nun werden wir 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 wir ein Feld leerlassen wollen, so geben wir einen Punkt ein. Ansonsten wird der in eckigen Klammern stehende Standardwert 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) []:Berlin
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Heinz Mustermann AG
Organizational Unit Name (eg, section) []:.

Das Feld Common Name (CN) ist hier der offizielle Name der Zertifizierungsstelle. Für unsere eigene CA tragen wir unseren eigenen Namen ein:

Common Name (eg, YOUR name) []: Heinz Mustermann
Email Address []: heinz@mustermann.de

Wir erhalten zwei Dateien:

cacert.pem
cakey.pem

Die Rechte setzen wir so, dass die Schlüsseldatei nur für root lesbar ist:

chmod 600 cakey.pem

Mit dem folgenden Befehl prüfen wir, ob wir den Schlüssel mit der Passphrase wieder öffnen können:

openssl rsa -in cakey.pem -noout -text

Enter pass phrase for cakey.pem: sicheres Passwort
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:
    ...

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 256 verschlüsselt auf der Platte abgelegt wird. 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:

openssl genrsa -out serverkey.pem -aes256 2048 -days 3650

Generating RSA private key, 2048 bit long modulus
....+++
.......................................+++
e is 65537 (0x10001)
Enter pass phrase for serverkey.pem: unsicheres Passwort
Verifying - Enter pass phrase for serverkey.pem: unsicheres Passwort

Nun entfernen wir die Passphrase wieder, damit der Server z.B. die Internetseite ohne ein Passwort anzugeben anzeigen kann:

openssl rsa -in serverkey.pem -out serverkey.pem

Enter pass phrase for serverkey.pem: unsicheres Passwort
writing RSA key

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 sollte man genau so wie zuvor eingeben:

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) []:Berlin
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Heinz Mustermann 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.musterman.de verwendet, so muss der Common Name eben genau www.mustermann.de lauten. 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) []: Heinz Mustermann
Email Address []: heinz@mustermann.de

Weitere Optionen kann man einfach leer lassen:

A challenge password []:
An optional company name []:

Mittlerweile tummeln sich schon vier Dateien in unserem Verzeichnis:

cacert.pem
cakey.pem
req.pem
serverkey.pem

Einige Einstellungen müssen wir noch in der Datei /etc/ssl/openssl.cnf ändern, bevor wir signieren können. Öffne die Datei und passe folgende Zeilen in der Sektion [ CA_default ] an:

dir = .
new_certs_dir = $dir 
private_key = $dir/cakey.pem 
RANDFILE = $dir/.rand 
default_days = 3650

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 wir 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:

echo 01 > serial
touch index.txt

Unsere CA signiert nun das Zertifikat:

openssl ca -in req.pem -notext -out servercert.pem

Enter pass phrase for ./cakey.pem: sicheres Passwort

...

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

Wohin wir die Zertifikate installieren, hängt natürlich vom jeweiligen Serverdienst ab.
Was allen gemeinsam ist:
Wir 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 anderen sicheren Stelle.

One Response to “SSL-Zertifikat erstellen”


Schreibe einen Kommentar

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.

Powered by WordPress. Designed by elogi.