Mit OpenSSL und CAcert ein X.509-Zertifikat für verschiedene Anwendungen erstellen

Um im Internet einen Serverdienst aufsetzen, der verschlüsselte SSL- oder TLS-Verbindungen anbietet (z.B. HTTPS, POP3S, IMAPS, LDAPS, SMTP mit TLS), benötigt man ein Serverzertifikat. Dieses muß zuvor von einer Zertifizierungsstelle (Certification Authority oder kurz CA) signiert werden.

Dabei ist offizielles Serverzertifikat, das von einer offiziellen Stelle signiert ist, nicht umsonst zu haben. Hier werden gerne jährliche Gebühren in Höhe von mehreren hundert Euro fällig.

Dagegen kann man unter Linux eine eigene CA aufsetzen und ein selbst Zertifikate erstellen respektive signieren. Das ist ein Vorgang von wenigen Minuten, der hier präsentiert werden soll.

Der einzige Unterschied zu einem von einer kostenpflichtigen Stelle signierten Zertifikat ist, dass der Client (eMail-Agent, Browser, etc.) eine Warnung ausgeben wird, dass er die CA nicht kennt. Der Benutzer muss dann einmal bestätigen und kann das Zertifikat trotzdem akzeptieren.Dennoch kann man sich bei CAcert kostenlos registrieren lassen und mit der entsprechenden Anzahl von Vertrauenspunkten seine Zertifikate signieren lassen.
Inzwischen akzeptieren die gängigen Browser auch CAcert.

Installation von OpenSSL

Wir benötigen für die Zertifikaterstellung auf alle Fälle das Paket openssl, daß sich mit

aptitude -y install openssl

installieren läßt.

Die Zertifkate erstellen

Verzeichnisse erstellen

mkdir /etc/ssl-cacert/
mkdir /etc/ssl-cacert/apache/
mkdir /etc/ssl-cacert/lighttpd/
mkdir /etc/ssl-cacert/mail/
mkdir /etc/ssl-cacert/proftpd/
mkdir /etc/ssl-cacert/ldap/

OpenSSL Config erstellen

Wenn man mehrere Zertifikate zu erstellen hat, ist es sinnvoll die Daten, die immer die Gleichen bleiben, in einer Datei abzulegen und dann mit der Option -config Pfad aufzurufen.

vi /etc/ssl/openssl.cnf

RANDFILE               = $ENV::HOME/.rnd

[ req ]
default_bits = 2048
default_keyfile = keyfile.pem
distinguished_name = req_distinguished_name
attributes = req_attributes
prompt = no
output_password =

[ req_distinguished_name ]
C = DE
ST = BUNDESLAND
L = STADT
O = IRGENDWAS
OU = IRGENDWAS
CN = DOMAIN.TLD <- SEHR Wichtig
emailAddress = webmaster@DOMAIN.TLD

[ req_attributes ]
challengePassword = keine Eingabe

Generieren des privaten Schlüssels

Zunächst wird ein "Private Key" zu generiert. Das SSL-Zertifikat ist nur zusammen mit genau diesem Key gültig. Geht der Private Key verloren, dann wird das Zertifikat unbrauchbar, weil es diesen Private Key zur Entschlüsselung benötigt. Der Private Key kann auch nicht aus dem Zertifikat generiert oder sonstwie wiederhergestellt werden. Ergo sollte man den Private Key an sicherer Stelle als Backup ablegen.

Der Private Key kann auch noch zusätzlich mit einem Passwort geschützt werden, was aber dazu führt, dass man den Webserver nicht ohne Eingabe dieses Passwortes im SSL-Modus starten kann.

Als Schlüssellänge sollten 2048 oder 4096 Bit genutzt werden.

 

# openssl genrsa -out /etc/ssl/certs/apache_server.key 4096

Hier als Alternative, wenn man doch einen verschlüsselten Private Key und den Mehraufwand beim Apache Server bevorzugt:

# openssl genrsa -des3 -out /etc/ssl/certs/apache_server.key 4096

Certificate Signing Request (CSR) anlegen

Der CSR enthält die Firmeninformationen, Domainname, eMail-Adresse etc. Diese Datei wird an die Zertifizierungsstelle gesendet, um das Zertifikat (CRT) zu erhalten. Alternativ kann man sich aus dem CSR auch ein self-signed CRT generieren.

Wichtig ist die Angabe der Verschlüsselung - hier muss SHA256 verwendet werden. Der Default von SHA1 ist mittlerweile zu unsicher geworden.

Der gewünschte Domainname wird im Feld "Common Name (eg, server FQDN)" angegeben. Ansonsten funktioniert im Apache-Server das SSL-Zertifikat nicht mehr, weil der Server das Zertifikat nicht der URL zu ordnen kann.

Die Angabe des Bundesstaates und die Stadt ist für die Erstellung eines offiziellen Zertifikats meistens erforderlich. Felder, die nicht benötigt werden, können durch die Eingabe eines Punktes "." oder durch RETURN ausgelassen werden. Ausserdem kann die Dauer des Zertifikates mit festgelegt werden.

# openssl req -new -days 365 -key server.key -out server.csr -sha256

Konsolen-Ausgabe:

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]:Baden-Wuerttemberg
Locality Name (eg, city) []:Stuttgart
Organization Name (eg, company) [Internet Widgits Pty Ltd]:IT-LINUXMAKER ANDREAS GUENTHER
Organizational Unit Name (eg, section) []:
Common Name (e.g. server FQDN or YOUR name) []:www.it-linuxmaker.com
Email Address []:info@it-linuxmaker.com

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:.
An optional company name []:.

Überprüfen des Certificate Signing Request (CSR)

Mit folgendem Befehl lässt sich nachprüfen, ob die Angaben im CSR alle korrekt sind.

# openssl req -noout -text -in linuxmaker.com.csr

Konsolen-Ausgabe:


Certificate Request:
    Data:
        Version: 0 (0x0)
        Subject: C=DE, ST=Baden-Wuerttemberg, L=Stuttgart, O=IT-LINUXMAKER Andreas Guenther, CN=www.linuxmaker.com/emailAddress=info@it-linuxmaker.com
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (4096 bit)
                Modulus:
                    00:dc:7b:36:0b:82:9d:89:d8:7a:4c:23:f8:4f:fc:
                    1d:ae:e1:0f:50:11:40:46:96:60:de:82:9b:f2:4a:
                    dc:db:f3:e9:ee:5d:f1:6d:4c:89:6f:bc:b0:04:8b:
                    22:4c:1f:32:2b:89:63:5c:2a:92:e8:0e:d7:fa:ca:
                    ......
#

Self-signed Certificate erstellen

Für Websites oder HTML-Plattformen, bei denen die Verschlüssleung im Vordergrund stehen und weniger die öffentliche Präsenz, reicht es vollkommen aus, mit folgendem Befehl das Zertifikat selber zu signieren. Hier wird ein Zertifkat für 1 Jahr generiert.

# openssl x509 -req -days 365 -in linuxmaker.com.csr -signkey server.key -out linuxmaker.com.crt

Signature ok
subject=/C=DE/ST=Baden-Wuerttemberg/L=Stuttgart/O=IT-LINUXMAKER Andreas Guenther/CN=www.linuxmaker.com/emailAddress=info@it-linuxmaker.com
Getting Private key
#

Für öffentliche Websites ist das eher störend, weil die Webbrowser die Signatur nicht kennen. Deshalb zeigen sie die Warnung an, wie "Dieser Verbindung wird nicht vertraut", "Es besteht ein Problem mit dem Sicherheitszertifikat der Webseite" oder "Sicherheithinweis: Das Sicherheitszertifikat wurde von einer Firma ausgestellt, ...". Das lässt sich vermeiden, indem man die Zertikate bei freien Zertifizierungsstellen wie CAcert oder StartCom Ltd. kostenlos für ein Jahr signieren lässt.

CAcert Zertifikat beantragen

Einen Account bei CAcert erstellen und die entsprechende Domain, unter "Domains->Hinzufügen", eintragen. Nachdem die Domain hinzugefügt wurde, kann nun das Server Zertifikat beantragt werden. Dazu geht man in "Server Zertifikate->Neu" und kopiert den Inhalt aus /etc/ssl/certs/apache_server.csr in das Textfeld.

cat /etc/ssl/certs/linuxmaker.com.csr

-----BEGIN CERTIFICATE REQUEST-----
.
.
-----END CERTIFICATE REQUEST----- 

Nach ein paar Sekunden wird das CAcert Zertifikat angezeigt:

-----BEGIN CERTIFICATE------
.
.
-----END CERTIFICATE-----

Nun eine neue Datei mit den Namen apache_server.crt erstellen und das Zertifikat von CAcert dort hinein kopieren:

vi /etc/ssl/certs/linuxmaker.com.crt

 

Überprüfen lässt sich das fertige Zertifikat im Internet dann mit dem Webportal Qualys SSL LABS.

Anwendung in Programmen

Apache-SSL

Nun die Zertifikate und Schlüssel in das /etc/ssl-cacert/apache Verzeichnis kopieren:

cp /etc/ssl/certs/apache_server.key /etc/ssl-cacert/apache/
cp /etc/ssl/certs/apache_server.csr /etc/ssl-cacert/apache/
cp /etc/ssl/certs/apache_server.crt /etc/ssl-cacert/apache/
cp /etc/ssl/certs/apache_private.key.decrypted /etc/ssl-cacert/apache/