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.
Wir benötigen für die Zertifikaterstellung auf alle Fälle das Paket openssl, daß sich mit
aptitude -y install openssl
installieren läßt.
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/
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
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 []:.
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:
......
#
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 mit Let's Encrypt vermeiden.