Server SSL-Zertifikate Erstellen

Aus A-Enterprise

Wechseln zu: Navigation, Suche

Anleitung um Server-Zertifikate zu Erstellen

Autor: Don.K am 27.10.2006

Aufgabe: SSL verschlüsselter Internet Server aufsetzen (z.B. https).


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 deinem Sytem deshalb bereits installiert. Wenn nicht, muss das Paket openssl nach installiert werden. Benötigt wird aus diesem Paket das shell command openssl.

2. Erstellen der CA

Lege zunächst ein Verzeichnis an, in dem das Zertifikat abgelegt werden soll. Ich nehme in diesem Beispiel /root/crt:

root@linux# mkdir /root/crt
root@linux# cd /root/crt

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. Eeine Idee für eine Passphrase! Hier gibt es genug. Diese Passphrase benötigen wir immer dann, wenn mit der CA neue Zertifikate aussgestellt werden sollen:

Enter PEM pass phrase: meine-passphrase
Verifying - Enter PEM pass phrase: meine-passphrase

Nun werde ich 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 die Schweiz ist CH. Wenn du ein Feld leer lassen möchtest, so gebe einen Punkt ein. Ansonsten wird der in eckigen Klammern stehende Default wert übernommen:

Country Name (2 letter code) [GR]: CH
State or Province Name (full name) [Some-State]:.
Locality Name (eg, city) []:Zurich
Organization Name (eg, company) [Internet Widgits Pty Ltd]: Company Ltd.
Organizational Unit Name (eg, section) []:.

In das Feld Common Name (CN): kannst du dein Name eintragen:

Common Name (eg, YOUR name) []: Max
Email Address []: max @ gmx.net

Fertig. Folgende zwei Dateien sind entstanden:

root@linux# ll
-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 die Rechte so gesetzt werden, dass die Schlüsseldatei nur für root lesbar ist:

root@linux# chmod 600 cakey.pem

Es kann nun ausprobiert werden, ob der Schlüssel mit der Passphrase wieder zu öffnen ist:

root@linux# openssl rsa -in cakey.pem -noout -text
Enter pass phrase for cakey.pem: meine-passphrase
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.

root@linux# openssl genrsa -out serverkey.pem -aes128 2048 -days 365
Generating RSA private key, 2048 bit long modulus
....+++
.......................................+++
key is 65537 (0x10001)
Enter pass phrase for serverkey.pem: 1234
Verifying - Enter pass phrase for serverkey.pem: 1234

So. Nun entfernen wir die Passphrase wieder. Warum? Der Serverdienst (Apache, Cyrus, etc.) muss schließlich in der Lage sein, den Schlüssel ohne Zutun zu lesen.

root@linux# openssl rsa -in serverkey.pem -out serverkey.pem
Enter pass phrase for serverkey.pem: 1234
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 ggf. 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) [GR]: CH
State or Province Name (full name) [Some-State]:.
Locality Name (eg, city) []: Zurich
Organization Name (eg, company) [Internet Widgits Pty Ltd]: Company Ltd.
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.company.com verwendet, so muss der Common Name eben genau www.company.com heissen. 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.company.com
Email Address []: max @ gmx.net

Weitere Optionen kann man einfach leer lassen:

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

Mittlerweile sind schon vier Dateien in unserem Verzeichnis:

root@linux# ll
-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. Öffne diese Datei und passe die folgende Zeilen in der Sektion [ CA_default ] an:

vi /etc/ssl/openssl.cnf: ev. vi /usr/share/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 wir wie in diesem Beispiel die Lebensdauer z.B. auf 10 Jahre heraufsetzen.

stateOrProvinceName     = optional

Jetzt noch zwei 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: meine-passphrase
...
Certificate is to be certified until Jun 18 11:42:16 2017 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 wir die Zertifikate installieren, hängt natürlich vom jeweiligen Serverdienst ab. Was allen gemeinsam ist: benötigt werden 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.

Persönliche Werkzeuge