SSl Root-CA

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.

Vorbereitung

Zu Beginn muß man openssl installieren. Meistens ist dieses Paket schon auf dem System.

apt-get install openssl

Konsole

Nun 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

Konsole

Im Verzeichnis CA werden

  • das Certificat Authority (CA) Zertifikat
  • eine Datenbank aller von uns signierten Zertifikate
  • alle von uns generierten Schlüssel, requests und Zertifikate

gespeichert.

Im Verzeichnis newcerts werden

  • alle von uns signierten Zertifikate

gespeichert.

Im Verzeichnis private wird

  • der private Schlüssel unserer CA

gespeichert.

Verliere den privaten Schlüssel nicht! Ohne diesen, kann man nicht mehr signieren oder alte Zertifikate erneuern. Er darf niemals für andere zugänglich sein, da andernfalls andere sich für Euch ausgeben kann.

Nun erstellt man für die Zertifikate eine Datenbank:

echo '01' > serial
touch index.txt

Konsole

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 = .

openssl.cnf

Erstellen eines Root Zertifikates

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.

openssl.cnf

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

openssl.cnf -- Erweiterung

Um das Zertifikat zu schützen, muß man bei der Erstellung eine Passwort angeben, welches man bei dem Signieren erneut benötigt. Aus diesem Grund sollte es besonders sicher sein.

Root Zertifikat

Als erstes erstellt man den Schlüssel für die CA:

  1. -aes-256: Angabe des Verschlüsselungsalgorithmus.
  2. -out: Schreibe die Ausgabe in angegebene Datei.
  3. <Zahl>: Bit-Länge des Schlüssels (1024 kann ausreichen).

Wenn der Standardverschlüsselungsalgorithmus verwendet werden soll, dann kann man diesen Punkt überspringen.

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:

  1. -new -x509: Erstellung eines selbst-signierten Zertifikates.
  2. -extensions v3_ca: Erstellung eines CA Zertifikates.
  3. -days 3650: Angabe der Lebensdauer.
  4. -keyout, -out: Schreibe die Ausgabe in angegebene Dateien.
  5. -config ./openssl.cnf: Unsere Konfigurationsdatei.

Gültigkeitsdauer: Nachdem die Gültigkeit eines Root Zertifikates abgelaufen ist, verlieren auch alle signierten Zertifikate ihre Gültigkeit. Um diese wieder zu aktivieren, muß das Alte entfernt und mit einem Neuen erneut signiert werden. Das kann eine sehr umständliche Prozedur sein. Daher sollte man die Lebensdauer auf einen Wert setzen, der für die eigenen Zwecke hoch genug ist.

Sollte man den vorherigen Schritt übersprungen haben, muß man -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
  • Die Datei cacert.pem soll später an alle Clients verteilt werden.
  • Die Datei 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

Erstellen eines "Certificate Signing Request (CSR)" für Clients

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

  1. der Erstellung des privaten Schlüssels
  2. der Erstellung des Zertifikat requests
  3. des signieren des requests und der Erstellung des Zertifikates

openssl.cnf

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

openssl.cnf -- Erweiterung

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

openssl.cnf -- Abschnitt [req]

Erstellen des Zertifikates

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>

Konsole

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

Konsole

Signieren des Zertifikates

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…).

openssl.cnf

[ 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

openssl.cnf -- Erweiterung vor [req] einfügen

Signieren

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

Konsole

:!: Abfragen mit y beantworten!

Während des Prozesses wurde die Datenbank aktualisiert und das Zertifikat 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

Konsole

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

FIXME: Ich habe nicht herausgefunden, ob man die lesbare Version aus Sicherheitsgründen entfernen sollte!

Installation des Zertifikates und Schlüssels

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:

  • Apache
  • OpenVPN
  • Exim4

Verteilen / Veröffentlichen des CA Zertifikates

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).

FIXME: Link zu apache Howto!

Erneuern eines Zertifikates

FIXME: Muß noch geschrieben werden!

Diskussion

Geben Sie Ihren Kommentar ein (Wiki-Syntax ist zugelassen):
Wenn Sie die Buchstaben auf dem Bild nicht lesen können, laden Sie diese .wav Datei herunter, um sie vorgelesen zu bekommen.
computer/howtos/sslrootca_howto.txt · Zuletzt geändert: 2008/03/11 10:05 von corren
www.chimeric.de Creative Commons License Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0