Mit den CA-Zertifikaten aus dem ersten Teil des Artikels wollen wir jetzt Zertifikate für zwei Postfix-Server erzeugen, welche wir verschlüsselt miteinander “reden” lassen wollen. Beide Server stehen unter der Kontrolle des gleichen Administrators – es ist demzufolge ein einfaches, dort die jeweils passenden Zertifikate einzufügen.
Bei Mailservern, die unter der Kontrolle Dritter stehen ist es naturgemäss schwieriger, sich mit “selbstgemachten” Zertifikaten zu helfen, aber prinzipiell natürlich möglich.
Zertifikate erstellen
Jeder Mailserver erhält sein eigenes Zertifikat; beide Zertifikate werden mit dem Server-CA-Zertifikat unterschrieben. Der Ablauf ist immer wie folgt:
- Erstellen eines privaten Schlüssels (“openssl genrsa”)
- Erstellen eines Certificate Signing Requests (CSR, “openssl req”)
- Unterzeichnen des CSR mit dem CA-Zertifikate, womit das endgültige Zertifikat erstellt wird (“openssl ca”)
Die ersten beiden Schritte können unabhängig von der CA durchgeführt werden; in manchen Szenarien ist das sogar erwünscht oder notwendig (zum Beispiel wenn eine externe CA keinen Zugriff auf den privaten Schlüssel haben soll). In unserer Situation können wir alles im gleichen Kontext erledigen.
Wichtigstes funktionales Element eines Zertifikates für Mailserver ist das “CN”-Feld (Common Name). Da drin muss der Hostname stehen, mit welchem sich die Mailserver unterhalten (also zum Beispiel der Name, der im MX-Record steht, oder der HELO-String). Falls sich die Namen im MX-Record von denen im HELO-String unterscheiden oder mehrere Server mit unterschiedlichen Namen betrieben werden, sind jeweils unterschiedliche Zertifikate zu erstellen.
Normalerweise schützt man private Schlüssel mit einem Passwort (auch Passphrase genannt). Da wir in unserem Fall aber diese Schlüssel auf einem Server einsetzen wollen, der auch ohne Eingabe eines Passworts durch einen Administrator booten können soll, generieren wir private Schlüssel ohne Passphrase.
Einfaches SMTP/TLS Zertifikat
Zuerst der einfache Fall – ein Zertifikat für den Mailserver “mail.leisi.net”. Wie gehabt erstellen wir zuerst den privaten Schlüssel, erstellen dann den CSR und unterzeichnen diesen mit dem Server-CA-Zertifikat:
openssl genrsa -out srvcerts/mail.leisi.net.key.pem 2048
openssl req -config conf/srv.cnf -new -key srvcerts/mail.leisi.net.key.pem -out srvcerts/mail.leisi.net.csr.pem
openssl ca -config conf/srv.cnf -in srvcerts/mail.leisi.net.csr.pem -out srvcerts/mail.leisi.net.cert.pem
Die Angaben im CSR sind wie folgt:
Country [CH]:
Organization [leisi.net]:
Unit/Division [leisi.net]:
Common Name (eg, server1.example.com) []:mail.leisi.net
E-Mail []:postmaster@leisi.net
Anschauen kann man das Zertifikat wie gehabt mit
openssl x509 -in srvcerts/mail.leisi.net.cert.pem -noout -purpose
openssl x509 -in srvcerts/mail.leisi.net.cert.pem -text
Integration in Postfix
Einigermassen aktuelle Postfix-Versionen können “out-of-the-box” mit Zertifikaten umgehen. Es genügt, dem Mailserver die Zertifikate (das Maschinen-Zertifikat und das Server-CA-Zertifikat) und den privaten Schlüssel des eigenen Zertifikats bekannt zu machen und die Konfiguration entsprechend anzupassen. Die Dateien müssen wie folgt auf den Mailserver kopiert werden:
/etc/postfix/ssl/mail.leisi.net.*.pem
/etc/postfix/ssl/cacerts/srv.cert.pem
Die folgenden Einstellungen gelten für /etc/postfix/main.cf:
smtpd_tls_CAfile = /etc/postfix/ssl/cacerts/srv.cert.pem
smtpd_tls_CApath = /etc/postfix/ssl/cacerts/
smtpd_tls_cert_file = /etc/postfix/ssl/mail.leisi.net.cert.pem
smtpd_tls_key_file = /etc/postfix/ssl/mail.leisi.net.key.pem
smtpd_tls_loglevel = 1
smtpd_use_tls = Yes
smtpd_tls_received_header = yes
smtpd_tls_ask_ccert = yes
smtp_tls_CAfile = /etc/postfix/ssl/cacerts/srv.cert.pem
smtp_tls_CApath = /etc/postfix/ssl/cacerts/
smtp_tls_cert_file = /etc/postfix/ssl/mail.leisi.net.cert.pem
smtp_tls_key_file = /etc/postfix/ssl/mail.leisi.net.key.pem
smtp_tls_loglevel = 1
smtp_tls_note_starttls_offer = yes
smtp_use_tls = Yes
Nach einem Neustart (/etc/init.d/postfix restart) kennt dieser Mailserver (1) sein eigenes Zertifikat (inklusive privatem Schlüssel) und (2) das Zertifikat der CA, welches das Mailserver-Zertifikat ausgestellt hat.
Ein zweites und ein drittes Mailserver-Zertifikat
Der zweite Postfix läuft auf einem Client-Rechner. Dieser soll nun mit “mail.leisi.net” verschlüsselt kommunizieren können. Aus Sicherheitsgründen ist dieser Postfix nur auf Localhost zugänglich. Damit die Überprüfung der Zertifikate klappt, muss dieses Zertifikat daher im CN “localhost” haben. Beim Weiterreichen der Mails an “mail.leisi.net” macht der CN “localhost” aber wenig Sinn. Daher wird es ein zweites Zertifikat geben, welches im CN den von aussen ersichtlichen Hostnamen enthält (“marvin.net.astrum.ch”); die Maschine selbst heisst “asterix”. Wir erstellen deshalb die zwei Zertifikate wie folgt:
openssl genrsa -out srvcerts/asterix.key.pem 2048
openssl req -config conf/srv.cnf -new -key srvcerts/asterix.key.pem -out srvcerts/asterix.localhost.csr.pem
openssl ca -config conf/srv.cnf -in srvcerts/asterix.localhost.csr.pem -out srvcerts/asterix.localhost.cert.pem
openssl req -config conf/srv.cnf -new -key srvcerts/asterix.key.pem -out srvcerts/asterix.marvin.csr.pem
openssl ca -config conf/srv.cnf -in srvcerts/asterix.marvin.csr.pem -out srvcerts/asterix.marvin.cert.pem
Zu beachten ist, dass mit dem gleichen privaten Schlüssel zwei CSRs und zwei Zertifikate erstellt worden sind. Der Postfix erhält wiederum seine Dateien:
/etc/postfix/ssl/asterix.key.pem
/etc/postfix/ssl/asterix.localhost.cert.pem
/etc/postfix/ssl/asterix.marvin.cert.pem
/etc/postfix/ssl/cacerts/srv.cert.pem
Die Einstellungen in /etc/postfix/main.cf sind analog wie beim anderen Mailserver, aber mit angepassten Pfaden:
smtpd_tls_cert_file = /etc/postfix/ssl/asterix.localhost.cert.pem
smtpd_tls_key_file = /etc/postfix/ssl/asterix.key.pem
smtp_tls_cert_file = /etc/postfix/ssl/asterix.marvin.cert.pem
smtp_tls_key_file = /etc/postfix/ssl/asterix.key.pem
Wichtig: Wenn Zertifikate in ein Verzeichnis kopiert wurden, und dieses Verzeichnis insgesamt als Speicher für Zertifikate dient, muss man jeweils c_rehash <Verzeichnis> aufrufen, also zum Beispiel
c_rehash /etc/postfix/ssl/
Damit werden Symlinks erstellt; anhand dieser Struktur kann die SSL-Library die verschiedenen Zertifikate identifizieren. Anschliessend ist jeweils ein Neustart des Postfix notwendig.
Im Thunderbird kann man nun das Zertifikat für den “localhost” Mailserver einfügen (asterix.localhost.cert.pem) und ein Testmail sollte die folgenden Received:-Zeilen enthalten:
Received: from marvin.net.astrum.ch (marvin.net.astrum.ch [213.144.132.250])
(using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits))
(Client CN "marvin.net.astrum.ch", Issuer "leisi.net Server CA" (verified OK))
by mail.leisi.net (Postfix) with ESMTP id 5AEAC13588
for <matthias@leisi.net>; Sun, 13 Aug 2006 17:55:28 +0200 (CEST)
Received: from [127.0.0.1] (localhost [127.0.0.1])
(using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits))
(Client did not present a certificate)
by asterix.net.astrum.ch (Postfix) with ESMTP id 12F553728D
for <matthias@leisi.net>; Sun, 13 Aug 2006 17:55:28 +0200 (CEST)
Die obere Received:-Zeile beschreibt den Weg zwischen den beiden Mailservern — mail.leisi.net hat das Mail von marvin.net.astrum.ch erhalten, wobei letzterer sich mit einem verifizierten Zertifikat identifiziert hat. Die Verifikation ist gelungen, weil mail.leisi.net das Server-CA-Zertifikat hat, mit welchem das Zertifikat für marvin.net.astrum.ch ausgestellt wurde (unser srv.cert.pem).
Die untere Received:-Zeile beschreibt den Weg zwischen dem Thunderbird und dem lokalen Mailserver. Hier gibt es kein Client-Zertifikat, da Thunderbird das nicht beherrscht. Wir werden aber in einem späteren Teil des Artikels sehen, wie man mit Client-Zertifikaten in Thunderbird den Mail_inhalt_ verschlüsseln kann.
Einfügen von Zertifikaten Dritter
In der Postfix-Konfiguration haben wir einen Pfad für CA-Zertifikate angegeben:
smtp_tls_CApath = /etc/postfix/ssl/cacerts/
smtpd_tls_CApath = /etc/postfix/ssl/cacerts/
In diesen Pfad können wir Zertifikate von Dritten einfügen. Falls diese nicht im PEM-Format sondern im DER-Format vorliegen müssen wir sie zuerst umwandeln:
cd /etc/postfix/ssl/cacerts
openssl x509 -inform DER -in some.crt -outform PEM -out some.cert.pem
rm some.crt # Datei im DER-Format löschen
chown root:root * # Postfix beschwert sich, wenn die Dateien _nicht_ root gehören
c_rehash .
/etc/init.d/postfix/restart
Wenn die Gegenstelle den Mailserver ebenfalls für SMTP/TLS konfiguriert hat (und unser Server-CA-Zertifikat eingerichtet hat), werden sich die beiden Mailserver gegenseitig identifizieren und verschlüsseln.
Mit den folgenden Einstellungen kann man erzwingen, dass Mails von einer bestimmten Domain immer mit TLS eingeliefert werden müssen: Postfix Konfiguration In /etc/postfix/main.cf: smtpd_recipient_restrictions = [...] check_ccert_access hash:
Tracked: Aug 27, 21:35