Hallo zusammen!
Ich beschäftige mich gerade mit Mailservern und bin bei meinen ersten Versuchen mit dem Dovecot. Dazu verwende ich momentan eine lokale, gebridgte VM mit einem 14.04 Server, die ich nach jedem fehlgeschlagenen Konfigurationsversuch zurücksetze (auf "frisch geupdatetes System ohne alles").
Ich habe bereits mit den diversen Authentifizierungsmöglichkeiten herumgespielt, mein Problem beginnt aber offenbar schon vorher:
Versuche ich, mich per Thunderbird (38.3.0 auf Windows 7, IMAP mit SSL/TLS) zum Server zu verbinden, passiert clientseitig nix außer der Meldung "Thunderbird konnte keine Einstellungen für Ihr E-Mail-Konto finden". Im syslog des Servers erscheint folgendes:
imap-login: Disconnected (no auth attempts in 0 secs): user=<>, rip=192.168.0.104, lip=192.168.0.40, TLS: SSL_Read() failed: error:14094418:SSL routines:SSL3_READ_BYTES:tlsv1 alert unknown ca: SSL alert number 48, session=<yA4hOzUlbwDAqABo>
"Unknown CA", "No auth attempts" und leerer User lässt mich darauf schließen, dass der TB schon vor dem eigentlichen Login-Vorgang abbricht, da ihm die CA des (selbstsignierten) Zertifikats nicht passt bzw. unbekannt ist.
Mir ist bewusst, dass selbstsignierte Zertifikate (oder solche, die für die entsprechende Domain ungültig sind) Sicherheitsmeldungen hervorrufen, zu denen man dann eine Ausnahme hinzufügen kann. Soweit komme ich hier aber gar nicht, d.h. der Thunderbird lehnt die Verbindung offenbar von Anfang an ab, ohne mich zu fragen, ob ich das unvertraute, potentiell unsichere Zertifikat tatsächlich nutzen möchte.
Alle Dovecot-Configs sind auf ihren initialen Standardwerten, außer folgenden:
In der /etc/dovecot/conf.d/10-ssl.conf habe ich folgendes gesetzt/geändert:
ssl_cert = </pfad/zum/zertifikat/dateiname.pem ssl_key = </pfad/zum/key/dateiname.pem ssl = required
und später testweise zusätzlich explizit
ssl_require_crl = no ssl_verify_client_cert = no
Im ersten Versuch habe ich bei der Dovecot-Installation ein selbstsigniertes Zertifikat erzeugen lassen (ist in der 10-ssl.conf dann als /etc/dovecot/dovecot.pem eingetragen und existiert im Dateisystem im angegebenen Verzeichnis auch).
Zweiter Versuch:
sudo make-ssl-cert generate-default-snakeoil
Die resultierenden /etc/ssl/certs/ssl-cert-snakeoil.pem und /etc/ssl/private/ssl-cert-snakeoil.key entsprechend als ssl_cert und ssl_key in die conf eingetragen - keine Änderung, immer noch "unknown CA".
Dritter Versuch:
openssl req -new -x509 -days 3650 -nodes -out /etc/ssl/certs/dovecot.pem -keyout /etc/ssl/private/dovecot.pem
Sämtliche Abfragen ("Location" etc.) habe ich leer gelassen, nur den CommonName habe ich auf den Hostname des Servers gesetzt. Nach wie vor das gleiche Problem.
Alle diese Zertifikate lassen sich übrigens im Apache nutzen - zwar natürlich mit entsprechender, üblicher "Dieser Verbindung wird nicht vertraut"-Meldung im Browser, aber hat man die einmal abgenickt, kommt eine HTTPS-Verbindung zustande.
Frage: Was geschieht hier?
Mit meinen beschränkten Kenntnissen im Bereich SSL/TLS und einigem Googlen glaube ich erkannt zu haben, wo das Problem liegt:
Normalerweise weiß der Client, wer ein Zertifikat unterschrieben hat - "Guten Tag, mein Name ist Meier. Herr Müller kann Ihnen sagen, dass ich vertrauenswürdig bin. Bitte vertrauen Sie mir!" Nun wird nachgeschaut, ob denn der Herr Müller offiziell zur Gruppe der vertrauenswürdigen Personen gehört - tut er es nicht, gibts eine Warnung, die Herren Müller und Meier können hier aber als vertrauenswürdige Ausnahme hinzugefügt werden.
In meinem Fall scheint es aber eher "Guten Tag, mein Name ist Meier. Bitte vertrauen Sie mir!" zu sein, also ohne jegliche Information über eine CA, so dass der Thunderbird jegliche verschlüsselte Kommunikation von Grund auf ablehnt.
Diverse Quellen im Internet sprechen davon, man sollte das Root-(und/oder ein Intermediate-)Zertifikat mit in das eigentliche Zertifikat packen ("Chain"). Aber wie (einfach mit cat >> ?) und vor allem: welche(s), bzw. wie lauten die Dateinamen dieser Zertifikate?
Oder liegt das Problem an einer anderen Stelle - wird zusätzlich evtl. noch ein DNS benötigt, der den Hostnamen auflöst?