Dieses HowTo beschreibt, wie man eine eigene root CA erstellen kann, um Serverdienste mit Zertifikaten zu betreiben. Außer Acht wird die Möglichkeit offizielle Zertifikate zu nutzen. Orientiert habe ich mich an diesem HowTo, welches sich wiederum auf ein anderes stützt.
Zu Beginn muß man openssl installieren. Meistens ist dieses Paket schon auf dem System.
apt-get install opensslNun muß man sich einen Speicherort der CA überlegen. Zur Einfachheit nutze ich das Home-Verzeichnis. Am Ende kann man dieses an eine andere sinnvollere Stelle kopieren. Es ist sehr wichtig immer die Dateirechte zu prüfen!
mkdir CA cd CA mkdir newcerts private
Im Verzeichnis CA werden
gespeichert.
Im Verzeichnis newcerts werden
gespeichert.
Im Verzeichnis private wird
gespeichert.
Nun erstellt man für die Zertifikate eine Datenbank:
echo '01' > serial touch index.txt
Um es etwas einfacher zu gestalten und nicht von der Fülle an Optionen zu ersticken, erstellen wir uns eine eigene Konfigurationsdatei:
# # OpenSSL configuration file. # # Establish working directory. dir = .
Die Erstellung eines Zertifikates benötigt eine Menge Einstellungen. Um diese nicht auf der Kommandozeile immer anzugeben, kann man diese in der openssl.cnf dauerhaft angeben.
Die Konfigurationsdatei ist in mehrere Abschnitte eingeteilt. Jeder Abschnitt wird zu unterschiedlichen Zeiten der Zertifikatserstellung gelesen und kann auf andere referenzieren. Ein Abschnitt wird durch [<beliebiger Name>] eingeleitet.
Zu Beginn, also nach der Angabe dir, benötigt man einen Abschnitt, der die Erstellung und einen der den Typ der Zertifikate regelt.
Dabei muß man einen Distinguished Name spezifizieren, der den Besitzer des Zertifikates identifiziert. Diese Angabe ist nicht direkt in der Konfigurationsdatei zu finden, sondern ergibt sich aus den Angaben, die bei der Erstellung bearbeitet werden. Das Console-Kommando wäre openssl req, daher heißt der Abschnitt req.
[ req ] default_bits = 1024 # Size of keys default_keyfile = key.pem # name of generated keys default_md = md5 # message digest algorithm string_mask = nombstr # permitted characters distinguished_name = req_distinguished_name [ req_distinguished_name ] # Variable name Prompt string #---------------------- ---------------------------------- 0.organizationName = Organization Name (company) organizationalUnitName = Organizational Unit Name (department, division) emailAddress = Email Address emailAddress_max = 40 localityName = Locality Name (city, district) stateOrProvinceName = State or Province Name (full name) countryName = Country Name (2 letter code) countryName_min = 2 countryName_max = 2 commonName = Common Name (hostname, IP, or your name) commonName_max = 64 # Default values for the above, for consistency and less typing. # Variable name Value #------------------------------ ------------------------------ 0.organizationName_default = The Sample Company localityName_default = Metropolis stateOrProvinceName_default = New York countryName_default = US [ v3_ca ] basicConstraints = CA:TRUE subjectKeyIdentifier = hash authorityKeyIdentifier = keyid:always,issuer:always
Als erstes erstellt man den Schlüssel für die CA:
-aes-256: Angabe des Verschlüsselungsalgorithmus.-out: Schreibe die Ausgabe in angegebene Datei.<Zahl>: Bit-Länge des Schlüssels (1024 kann ausreichen).
openssl genrsa -aes256 -out private/cakey.pem 2048
Die oben erstellten Standardeinstellungen müssen für die Generierung des Root Zertifikates auf der Kommandozeile überschrieben werden:
-new -x509: Erstellung eines selbst-signierten Zertifikates.-extensions v3_ca: Erstellung eines CA Zertifikates.-days 3650: Angabe der Lebensdauer.-keyout, -out: Schreibe die Ausgabe in angegebene Dateien.-config ./openssl.cnf: Unsere Konfigurationsdatei.
-key in -keyout abändern.
Mit dem angegeben Kommando wird nun das Zertifikat erstellt:
openssl req -new -x509 -extensions v3_ca -key private/cakey.pem \ -out cacert.pem -days 3650 -config ./openssl.cnf
cacert.pem soll später an alle Clients verteilt werden.cakey.pem darf für niemanden zugreifbar sein.Um Informationen über ein Zertifikat abzufragen, kann man folgende Kommandos ausführen:
openssl x509 -in cacert.pem -noout -text openssl x509 -in cacert.pem -noout -dates openssl x509 -in cacert.pem -noout -purpose
Nachdem nun das Root Zertifikat erstellt wurde, generieren wir ein paar Zertifikate, um diese einigen Diensten (HTTPS, SIMAP, SPOP, OPENVPN) zu geben.
Der Ablauf besteht aus
Als erstes muß ein weiterer Abschnitt hinzugefügt werden, der für die Erstellung der nicht-CA Zertifikate Definitionen liefert:
[ v3_req ] basicConstraints = CA:FALSE subjectKeyIdentifier = hash
Um auf der Kommandozeile obiges nicht immer eingeben zu müssen, fügt man im Abschnitt [req] hinter der Zeile distinguished_name = req_distinguished_name die folgende Zeile ein:
req_extensions = v3_req
Nun kann man den ersten Zertifikat request erstellen. Als Beispiel erstellen wir ein Zertifikat für den Mail-Server. Dabei gleichen die Eingaben deren des Root Zertifikates - außer drei Zeilen:
Organizational Unit: <a reminder of what the certificate is for> Email Address: <the postmaster> Common Name: <the server hostname>
Der Common Name muß der Servername (oder die IP-Adresse zu der er aufgelöst wird) sein. Wenn er nicht identisch ist, erhält der Client bei jedem Verbindungsaufbau eine Warnung die ihn fragt, ob der sich mit dem Server wirklich verbinden soll oder verweigert komplett die Verbindung.
openssl req -new -nodes -keyout private/mailserver_key.pem -out newcerts/mailserver_crs.pem \ -config ./openssl.cnf ... Organizational Unit Name (department, division): <Mail Server> Email Address: <postmaster@sample.com> Common Name (hostname, IP, or your name): <mail.sample.com>
Die entstandenen Dateien sollten aufbewahrt werden, damit mit ihn ein neues Zertifikat erstellt werden kann, wenn das Alte ablaufen sollte. Der private Schlüssel (key) ist natürlich für die Verschüsselung zuständig und muß sicher aufbewahrt werden.
Mit dem folgenden Befehl kann man prüfen, ob der request korrekt ist:
openssl req -in newcerts/mailserver_crs.pem -text -verify -noout
Wieder machen wir uns die Arbeit leichter, indem wir die Datei openssl.cnf erweitern. Man definiert die Optionen, die mit der CA in Zusammenhang stehen (z.B. Datenbank, CA Zertifikat, Privater Schlüssel…).
[ ca ] default_ca = CA_default [ CA_default ] serial = $dir/serial database = $dir/index.txt new_certs_dir = $dir/newcerts certificate = $dir/cacert.pem private_key = $dir/private/cakey.pem default_days = 365 default_md = md5 preserve = no email_in_dn = no nameopt = default_ca certopt = default_ca policy = policy_match [ policy_match ] countryName = match stateOrProvinceName = match organizationName = match organizationalUnitName = optional commonName = supplied emailAddress = optional
Um den request, den wir eben erstellt haben, zu signieren, muß folgende Kommando ausgeführt werden. Das Passwort nach dem gefragt wird, ist jenes des CA-Schlüssels:
openssl ca -out newcerts/mailserver_cert.pem -config ./openssl.cnf -infiles newcerts/mailserver_crs.pem
Abfragen mit y beantworten!
newcerts/mailserver_cert.pem und eine Kopie (<Erstellungsnummer>.pem) in newcerts/ angelegt.
Das Zertifikat kann man wiederum überprüfen:
openssl x509 -in newcerts/mailserver_cert.pem -noout -text -purpose | more
In der Datei steht eine lesbare und eine verarbeitete Version des Zertifikates. Die Lesbare kann man automatisch entfernen:
mv newcerts/mailserver_cert.pem tmp.pem openssl x509 -in tmp.pem -out newcerts/mailserver_cert.pem
: Ich habe nicht herausgefunden, ob man die lesbare Version aus Sicherheitsgründen entfernen sollte!
Es ist schwer das Dokument mit der Installation eines Zertifikates weiterzuführen, da viele Programme diese unterschiedlich handhaben. Für einige Programme habe ich die Installation in den entsprechenden HowTos beschrieben:
Dieses ist wichtig, damit die Clients nicht mehr unvertrauensvolle Zertifikate bemängeln. Dazu sendet man an jeden Client die Datei cacert.pem. Eine einfache Methode, das Zertifikat zu verteilen, ist die Möglichkeit, es über eine Webseite herunterzuladen (siehe Apache HowTo).
: Link zu apache Howto!
: Muß noch geschrieben werden!
Diskussion