weidner/archives/2013/12/

Zertifikat für Dovecot anpassen

Vor kurzem hatte ich das Problem, dass ein Mailclient nicht das selbst signierte Zertifikat eines Dovecot Mailservers auf einem Debian-System akzeptieren wollte. Das Zertifikat, stellte sich heraus, hatte einen abweichenden CN gegenüber dem Servernamen, mit dem der Client den Mailserver kontaktierte. Das konnte ich mit

$ openssl x509 -in /etc/ssl/certs/dovecot.pem -text -noout | less

verifizieren.

Wie wird eigentlich dieses Zertifikat erzeugt?

Ich hatte den Server vor kurzer Zeit aufgesetzt und dabei war das Zertifikat automatisch angelegt worden. Auf blog.reidster.net fand ich einen Artikel, der mich auf die richtige Spur brachte und kurz und bündig beschreibt, wie man selbst signierte Zertifikate für Dovecot und Exim aktualisiert. Allerdings wollte ich kein abgelaufenes Zertifikat erneuern, sondern das vorhandene ändern. Also musste ich etwas tiefer in die Materie einsteigen.

Wie geht es nun genau?

Wenn ich dpkg-reconfigure dovecot-common aufrufe, ruft dieses seinerseits das Skript /var/lib/dpkg/info/dovecot-common.postinst mit dem Argument configure auf, woraufhin die Zeilen für die Erzeugung des Zertifikats aktiviert werden. Die relevanten Zeilen sind:

SSL_CERT="/etc/ssl/certs/dovecot.pem"
SSL_KEY="/etc/ssl/private/dovecot.pem"
FQDN=`hostname -f`
openssl req -new -x509 -days 365 -nodes \
       -out $SSL_CERT -keyout $SSL_KEY > /dev/null 2>&1 <<+
.
.
.
Dovecot mail server
$FQDN
$FQDN
root@$MAILNAME
+

Der CN des Zertifikats wird also der Variable $FQDN entnommen und diese wiederum wird mit hostname -f bestimmt.

Nun habe ich die Möglichkeit, diese Zeilen in ein eigenes Skript zu packen und die Variable $FQDN explizit anders zu benennen.

Oder ich modifiziere die Ausgabe von hostname -f. Mal sehen, was da geht. Die englische Handbuchseite von hostname sagt:

Technically: The FQDN is the name getaddrinfo(3) returns for the host name returned by gethostname(2). The DNS domain name is the part after the first dot

Bei Systemen mit mehreren IP-Adressen ist es problematisch, den Rechnernamen mit hostname zu bestimmen, aber dieser hatte nur eine. In /etc/nsswitch.conf war der Vorrang von /etc/hosts vor dem DNS eingestellt. Also reichte es, die Zeile mit der IP-Adresse des Servers in /etc/hosts anzupassen, die Einstellung mit hostname -f zu kontrollieren und dann konnte ich mit

# rm /etc/ssl/cert/dovecot.pem
# rm /etc/ssl/private/dovecot.pem
# dpkg-reconfigure dovecot-common

ein passendes Zertifikat erzeugen. Wenn in einem Jahr das Zertifikat abgelaufen ist, kann ich es auf diese Art auch wieder verlängern.

Posted 2013-12-21
Tags: