Inhaltsverzeichnis

Openssl

Mit dem Programm openssl kann man Zertifikate erstellen und verwalten.
Zertifikate werden für verschiedene Zwecke benötigt. Z. B. werden sie für das Versenden von E-Mails, beim surfen im Internet oder für VPN-Verbindungen verwendet. Aber auch andere kommunikative Plattformen nutzen sie.
Sie beinhalten div. Informationen über den Aussteller, wie z.B. Land, Provinz, Stadt, Firmenname, Abteilungsname, …
Wenn man z. B. auf Webseiten surft, welche mit TLS/SSL gesichert sind, also wenn man eine Seite mit „https“ aufruft, dann ist der Aufruf meist ohne Schwierigkeiten oder Meldungen möglich.
Oft wird man aber vom Browser gefragt, ob man wirklich auf dieser Seite surfen möchte, da diese nicht Vertrauenswürdig ist. Warum ist das so?

Jeder kann sich Zertifikate ausstellen und jeder kann somit eine TLS/SSL -Gesicherte Webseite mit seinem Zertifikat versehen.
Das heißt aber noch lange nicht dass man der vermeintlichen Verschlüsselung trauen kann. Damit ein Zertifikat z.B. vom Browser als sicher bzw. vertrauenswürdig angenommen wird, muss das Zertifikat von einer vertrauenswürdigen Zertifikatsstelle ausgestellt worden sein.
Mit openssl erstellte Zertifikate sind also vielleicht, in ihrer Funktion, korrekt ausgestellte Zertifikate, die vielleicht alle Informationen über den Aussteller beinhalten.
Da sie aber von der OpenSSL-CA (Certificate Authority → Zertifizierungsstelle) ausgestellt wurden, sind sie nicht sicher bzw. vertrauenswürdig.
Selbsterstellte Zertifikate sind also mit vorsicht zu genießen.

Installation

openssl ist in den Standardpaketquellen von Ubuntu vorhanden und kann somit einfach mit folgendem Befehl installiert werden.

apt-get install openssl

Vorbereitungen

Zunächst erstellt man die, evtl. nicht vorhandenen, Ordnerstruckturen.

mkdir -p /etc/ssl/demoCA/certs /etc/ssl/demoCA/crl /etc/ssl/demoCA/newcerts /etc/ssl/demoCA/private

Der Ornder „demoCA“ wurde hier nur gewählt, weil es standardmäßig eingestellt ist. Diesen kann man aber in der Datei /etc/ssl/openssl.cnf ändern.

Nun muss man noch, falls nötig, folgenden Dateien erstellen.

touch /etc/ssl/demoCA/index.txt
touch /etc/ssl/demoCA/serial
touch /etc/ssl/demoCA/crlnumber

In der /etc/ssl/demoCA/serial gibt man eine Seriennummer ein z. B. „01“.
In der /etc/ssl/demoCA/crlnumber gibt man eine Nummer ein z. B. „01“.

Ordnername Bezeichnung
demoCA openssl's Stammordner
demoCA/cacert.pem CA Zertifikat
demoCA/serial Ca Seriennummerndatei
demoCA/serial.old Ca Seriennummerndatei Backup
demoCA/index.txt CA Textdatenbankdatei
demoCA/index.txt.old CA Textdatenbankdatei Backup
demoCA/.rand CA random seed information
demoCA/certs Hier werden alle ausgestellten Zertifikate abgelegt.
demoCA/crl steht für certificate revocation list,
Hier werden alle abgelaufenen oder gesperrten Zertifikate abgelegt.
demoCa/crlnumber Eine Textdatei welche die als nächst zu verwendete Nummer für CRLs enthält.
demoCA/newcerts Hier werden alle Zertifikatsanfragen abgelegt.
demoCA/private Hier werden alle privaten Zertifikatsschlüssel abgelegt.
demoCA/private/cakey.pem CA privater Schlüssel

Wenn man viele Zertifikate erstellen möchte, dann bietet es sich an die Datei /etc/ssl/openssl.cnf anzupassen. Somit werden einige Fragen, welche beim Erstellen von Zertifikaten gestellt werden,
auf den jeweiligen Default-Wert gesetzt.

CA erstellen

Damit man Zertifikate selbst signieren kann, benötigt man eine CA.
Diese erstellt man sich, indem zunächst der private Schlüssel und danach das daraus resultierende Zertifikat für die CA erstellt wird.

openssl req -new -x509 -days 3650 -extensions v3_ca -keyout /etc/ssl/demoCA/private/<CANAME>Key.pem -out /etc/ssl/demoCA/<CANAME>Cert.pem

CA Vertrauensstellung

Damit unsere neue CA auch von Ubuntu vertraut wird, muss man noch das /etc/ssl/certs/ca-certificates.crt erneuern.
Dazu kopiert man das neu erstellte CA-Zertifikat nach /usr/share/ca-certificates/extra/.
Wichtig ist dabei, dass es die Dateiendung .crt erhält.

mkdir /usr/share/ca-certificates/extra
cp /etc/ssl/demoCA/<CANAME>Cert.pem /usr/share/ca-certificates/extra/<CANAME>Cert.crt
dpkg-reconfigure ca-certificates
update-ca-certificates

Zertifikate erstellen

Das Erstellen von Zertifikaten erfolgt immer gleich. Man erstellt sich einen privaten Schlüssel und fragt mit diesem bei der CA ein Zertifikat an.
Die CA stellt dann das Zertifikat, welches von ihr selbst mit ihrem eigenen privaten Schlüssel signiert wird, aus.

Privaten Schlüssel erstellen

Man erstellt sich einen Privaten Schlüssel, welcher für das Signieren oder zum Verschlüsseln verwendet werden kann.
In diesem Beispiel ist der RSA Schlüssel 2048 Bit lang und wird mit AES256 verschlüsselt. Das Ausgabeformat ist „.pem“

openssl genrsa -aes256 -out /etc/ssl/demoCA/private/<USER_ODER_HOST>Key.pem 2048

Benötigt man einen DSA Schlüssel, welcher nur zum Signieren verwendet werden kann, dann müssen dafür zunächst Parameter dafür erstellt werden.

openssl dsaparam -out /etc/ssl/demoCA/private/<USER_ODER_HOST>DsaParam.pem 2048

Nun kann der Schlüssel generiert werden.

openssl gendsa -aes256 -out /etc/ssl/demoCA/private/<USER_ODER_HOST>Key.pem /etc/ssl/demoCA/private/<USER_ODER_HOST>DsaParam.pem

WICHTIG: Private Schlüssel sollten unbedingt gut behütet werden. Daher setzt man am Besten auch die Rechte folgendermaßen.

chown root.root <PFAD_ZUM_PRIV_KEY>
chmod 400 <PFAD_ZUM_PRIV_KEY>

Zertifikatsanfrage erstellen

Mit dem neuen privaten Schlüssel stellt man bei der CA eine Anfrage für ein neues Zertifikat.
Hier wieder im „.pem“ Ausgabeformat, da der private Schlüssel in diesem Format erstellt wurde.

openssl req -new -key /etc/ssl/demoCA/private/<USER_ODER_HOST>Key.pem -out /etc/ssl/demoCA/newcerts/<USER_ODER_HOST>Req.csr

Die Abfragen bei der Erstellung des Anfrage sollten hier je nach Zweck (für Host oder User) gewählt werden.

selbstsigniertes Zertifikat erstellen

Nun sendet man die „.csr“ Datei an die CA die die Anfrage signieren soll. Wenn man eine eigene CA hat, dann kann diese die Anfrage signieren.
Hiermit signiert die CA ein neues, x.509 basiertes, Zertifikat im „.pem“ Format, welches 1095 Tage (3 Jahre) gültig ist.

openssl x509 -CA /etc/ssl/demoCA/<CANAME>Cert.pem -CAkey /etc/ssl/demoCA/private/<CANAME>Key.pem -CAserial /etc/ssl/demoCA/serial -in /etc/ssl/demoCA/newcerts/<USER_ODER_HOST>Req.csr -req -out /etc/ssl/demoCA/certs/<USER_ODER_HOST>Cert.pem -days 1095

Mit Zertifikaten arbeiten

Zertifikate auf Konsole ausgeben

Mit folgendem Befehl kann man sich den Inhalt eines Requests ausgeben lassen.

openssl req -text -noout -in <PFAD_ZU_REQUEST>

Hiermit kann man sich den Inhalt eines Zertifikats ausgeben lassen.

openssl x509 -text -noout -in <PFAD_ZU_ZERTIFIKAT>

Bei pkcs12 Zertifikaten verwendet man diesen Befehl zur ausgabe.

openssl pkcs12 -info -in <PFAD_ZU_ZERTIFIKAT>.pfx | openssl x509 -noout -text

Zertifikat verifizieren

Mit folgendem Befehl kann man Requests Verifizieren lassen.

openssl req -verify -noout -in <PFAD_ZU_ZERTIFIKAT_ODER_REQUEST>

Hiermit kann man ein selbstsigniertes Zertifikat überprüfen.

openssl verify -issuer_checks -CAfile <PFAD_ZU_CA-ZERTIFIKAT> <PFAD_ZU_ZERTIFIKAT>

oder

openssl verify <PFAD_ZU_ZERTIFIKAT>

Übereinstimmung zum privaten Schlüssel

Möchte man feststellen ob die Zertifikatsanfrage bzw. das ausgestellte Zertifikat zum privaten Schlüssel passen, dann führt man folgendes aus.

openssl rsa -noout -modulus -in <PFAD_ZUM_PRIV_KEY> > <KEY_AUSGABEDATEI>
openssl req -noout -modulus -in <PFAD_ZU_REQUEST> > <REQ_AUSGABEDATEI>
openssl x509 -noout -modulus -in <PFAD_ZU_ZERTIFIKAT> > <ZERT_AUSGABEDATEI>

Die Ausgabedateien müssen nun verglichen werden. Idealerweise weisen dann diese keinen Unterschied auf.

Fingerprint ausgeben

Mit folgendem Befehl kann man den Fingerabdruck eines Zertifikats ausgeben.

openssl x509 -fingerprint -noout -md5 -in <PFAD_ZU_ZERTIFIKAT>

Man kann hier den Algorithmus (md5) durch einen anderen ersetzen (z.B: sha1).

Zertifikatformat ändern

Mit diesem Befehl kann man das Format eines Zertifikats ändern. Als Beispiel hier von „PEM“ nach „DER“.

openssl crl -in <PFAD_ZU_QUELLZERTIFIKAT> -outform der -out <PFAD_ZU_ZIELZERTIFIKAT>

Private Key aus PKCS12 Zerifikat extrahieren

Wenn man nur ein PKCS12 Zertifikat mit dem integrieren priv. Schlüssel hat, und man diesen Key weiterverwenden möchte,
muss dieser extrahiert werden.
Mit diesen Befehlen trennt man das PKCS12 Zertifikat in ein x509 Zertifikat und den RSA priv. Schlüssel auf.

Passphrase aus priv. Key extrahieren

Manchmal benötigt man einen privaten Schlüssel ohne Passphrase. Diese kann extrahiert werden.

openssl rsa -in <KEYNAME_MIT_PASSPHRASE> -out <KEYNAME_OHNE_PASSPHRASE>

Zertifikate sperren

Um ein Zertifikat zu sperren, benötigt man sog. CRLs (Certificate Revocation Lists).
Eine CRL erstellt man sich wie folgt.

openssl ca -gencrl -cert /etc/ssl/demoCA/<CANAME>Cert.pem -keyfile /etc/ssl/demoCA/private/<CANAME>Key.pem -out demoCA/crl.pem

Verfahren: Zertifikate sperren

Möchte man ein Zertifikat sperren, dann führt man u.g. Befehl aus. Dabei wird das Zertifikat in
der demoCA/index.txt als gesperrt aufgeführt.

openssl ca -cert /etc/ssl/demoCA/<CANAME>Cert.pem -keyfile /etc/ssl/demoCA/private/<CANAME>Key.pem -revoke /etc/ssl/demoCA/certs/<USER_ODER_HOST>Cert.pem

Die Einträge in der index.txt beginnen mit einem der folgenden Buchstaben R, V oder E.

Buchstabe Bezeichnung
R Revoked
V Valid
E Expired

Beim nächsten aktualisieren des CRL-Zertifikats wird diese dann übernommen und tatsächlich gesperrt.
Die Aktualisierung erfolgt standardmäßig nach 30 Tagen und kann in der openssl.cnf mit dem Parameter default_crl_days angepasst werden.
Wenn das Zertifikat sogar nach einigen Stunden gesperrt werden soll, dann fügt man dem o.g. Befehl den Parameter -crlhours <STUNDENZAHL> hinzu. Für Tage -crldays <TAGEZAHL>
Wenn man die CRL sofort aktualisieren möchte, dann erstellt man sich die CRL (siehe oben) erneut mit dem selben Namen.

CRL ausgeben

Ist ein Zertifikat gesperrt, können mit folgendem Befehl die gesperrten Seriennummern ausgegeben werden.

openssl crl -noout -text -CAfile self-signed-certificate.pem -in /etc/ssl/demoCA/crl.pem

Zertifikate entsperren

Sollte aus Versehen ein Zertifikat gesperrt werden, löscht man den entsprechenden Eintrag aus der index.txt, wartet auf die nächste Aktualisierung oder erstellt die CRL neu.

Zertifikatsbeispiele

Mit openssl lassen sich verschiedenste Befehle für verschiedene Anwendungszwecke zusammenstellen.
Hier sind nur einige beschrieben. Weiter Infos findet man im Internet auf diversen Seiten.

TLS/SSL

Zertifikat für TLS/SSL Verschlüsselung.

openssl genrsa 2048 -out /etc/ssl/demoCa/private/tlsKey.pem
chmod 400 /etc/ssl/demoCa/private/tlsKey.pem
openssl req -new -key /etc/ssl/demoCa/private/tlsKey.pem -out /etc/ssl/demoCA/newcerts/tlsKey.pem
openssl req -new -x509 -key /etc/ssl/demoCA/private/tlsKey.pem -out /etc/ssl/demoCA/certs/tlsCert.pem -days 1095

PKCS#12

PKCS#12 (Public Key Cryptography Standards) Zertifikate enthalten zu dem Zertifikat selbst noch den Privaten Schlüssel und sind daher Passwortgeschützt.
Infos findet man in der Wikipedia.
Wenn man ein PKCS#12 Zertifikat benötigt, dann kann man dies mit diesem Befehl machen.

openssl pkcs12 -export -in /etc/ssl/demoCA/certs/<USER_ODER_HOST>Cert.pem -inkey /etc/ssl/demoCA/private/<USER_ODER_HOST>Key.pem -out /etc/ssl/demoCA/certs/<USER_ODER_HOST>Cert.p12

PKCS12 Zertifikat Anzeigen

openssl pkcs12 -in /etc/ssl/demoCA/certs/<USER_ODER_HOST>Cert.p12 | openssl x509 -noout -text

PKCS12 nach x.509 pem konvertieren

privaten Schlüssel aus einer PFX-Datei in eine PEM-Datei extrahieren:

openssl pkcs12 -in filename.pfx -nocerts -out key.pem

Nur das Zertifikat exportieren:

openssl pkcs12 -in filename.pfx -clcerts -nokeys -out cert.pem

Entfernen des Kennworts aus dem extrahierten privaten Schlüssel:

openssl rsa -in key.pem -out server.key

HTTPS SSL testen

openssl s_client -showcerts -connect <HOSTNAME>:443

Danach mit CRTL+D rausgehen.

Mail TLS testen

openssl s_client -starttls smtp -connect <DNS_ODER_IP_DES_MAILSERVERS>:25

Danach mit „quit“ rausgehen.

Quellen:
OpenSSL-Howto
www.dfn-cert.de-Informationenen