[Postfixbuch-users] TLS Server certificate could not be verified

Christian Anton mail at christiananton.de
Mo Jul 31 20:39:25 CEST 2006


Ralf Hildebrandt <Ralf.Hildebrandt at charite.de> schrieb am Mon, Jul 31, 2006 at 03:21:19PM +0200:
> * Christian Anton <mail at christiananton.de>:
> 
> > Jul 30 17:41:07 servfibbs postfix/smtp[27749]: certificate
> > verification failed for mail.gentix.de: num=19:self signed
> > certificate in certificate chain
> 
> Da fehlt wohl noch ein Certificate für die CA.
> Beim DFN sinds zwei die man importieren muss, bevor man erfolgreich
> verifizieren kann, vielleicht ists hier auch eine Chain.

Hallo Ralf,

vielen Dank für Deine - wie immer kurze aber exakt den punkt
treffende - Antwort. Tatsächlich hatte ich die ganze Thematik noch
nicht ganz verstanden. Ich möchte hier noch einmal zusammenfassen
und von Euch ein ACK oder NACK haben, ob ich nun kapiert habe, wie's
funktioniert. Außerdem werde ich noch einige kleine Fragen hier
schreiben.

Der nachfolgende Text ist mit Absicht sehr lang, da ich ihn nun als
eine Art Howto aufgezogen habe für Leute, die das gleiche Problem
haben wie ich und einfach nicht so recht verstanden haben, wie das
ganze funktioniert. Ich würde diesen Text, wenn Ihr ihn fachlich
korrekt findet, irgendwo im cacert-Wiki und auch sonst gern noch
irgendwo unterbringen.

Ich bitte Euch deshalb um Diskussion und Korrektur!



Verifizierung von x509-Zertifikaten:

Um die Echtheit eines x509-Zertifikates zu ermitteln, muss der Server
zusätzlich zu dem Server-Zertifikat das so genannte Root- Zertifikat
mitschicken, mit welchem das Server-Zertifikat signiert wurde, damit der
Client es mit der Datanbank seiner vorinstallierten Root- Zertifikate
vergleichen kann um die Echtheit der Identität des Besitzers des
Zertifikates der Gegenseite zu bestätigen.

Handelt es sich beim Zertifikat um ein "chained" Zertifikat, also eines,
das ein Root- Zertifikat hat, welches wieder ein Rootzertifikat hat,
welches dann auch ein "offizielles" ist, also eins dass der Client
bereits in seiner Datenbank hat, dann muss der Server nicht nur das
Rootzertifikat und das Serverzertifikat ausliefern, sondern auch noch
dieses "Zwischenzertifikat" welches auf der Clientseite dann den Baum
darstellt. Auf "Echtheit" geprüft wird wieder das Rootzertifikat, dem
der Client vertrauen muss. Um dem Client diese chained certificates zu
übermitteln, hängt man Rootzertifikat und Zwischenzertifikat einfach
in eine Datei aneinander und gibt dieses File dann auf Serverseite als
CA-Certifikat an, der Client weiß dann, was damit zu tun ist.


Postfix und die Root-Zertifikate:

Ich gehe davon aus, dass Postfix die in openssl als offiziell und
vertrauenswürdig anerkannten Root-Zertifikate (verisign etc.) beim
kompilieren (besser gesagt wahrscheinlich beim Linken gegen openssl)
übernimmt und mit einkompiliert. Deshalb ist in binär vertriebenen
Versionen von Postfix (Debian-Paket) das Root-Zertifikat von cacert
nicht als vertrauenswürdig eingestuft, bei einem selbstkompilierten
Postfix unter Gentoo jedoch, wo openssl gleich mit dem cacert.org
Rootzertifikat ausgeliefert wird, ist deshalb auch im Postfix dieses
Rootzertifikat bleich als vertrauenswürdig eingestuft. Liege ich
hierbei richtig? Wenn nicht, woher kennt Postfix denn sonst die
Zertifikate von verisign und Co?

Möchte man, dass Postfix einer weiteren CA vertraut, die zur
kompilierzeit nicht als vertrauenswürdig eingestuft war - z.
B. bei Benutzung einer firmeninternen CA oder cacert.org
(siehe obigen Absatz), dann muss man dieses Rootzertifikat mit der
Option *smtp_tls_CAfile* angeben. 

Werden mehrere solche CAs hinzugefügt, können diese in einem
Verzeichnis abgelegt werden, welches dann mit der Option
*smtp_tls_CApath* in der main.cf angegeben wird.

Die Option *smtpd_tls_CAfile* (man beachte das "d") macht hingegen etwas
völlig anderes, sie gibt die Datei an, mit der das Serverzertifikat des
Postfix-Servers (smtpd_tls_cert_file) signiert ist. Ist das signierende
Zertifikat ein "Zwischenzertifikat", welches wiederum von einem
übergeordneten Zertifikat signiert ist, dann werden diese beiden
Zertifikate in einem File aneinandergehängt und hier angegeben, wir
sprechen in diesem Fall von "chained certificates".


Root-Zertifikate bei cacert.org:

Wenn man bei cacert.org ein Serverzertifikat erstellt, kann man
wählen, ob man ein Class1- oder Class2- Zertifikat haben möchte. Die
Unterscheidung der beiden Typen hat mit der Art der Verifizierung
des Inhabers des Zertifikats zu tun:

Class1: keine Prüfung, nur E-Mail-Adresse

Class2: Vorlage schriftlicher Dokumente

Class3: persönliche Prüfung, Ausweisvorlage

bei CAcert.org sind die Class3-Zertifikate allerdings nicht direkt
durch die CA (Rootzertifikat: http://www.cacert.org/cacert.crt)
signiert, sondern durch ein so genanntes "Zwischenzertifikat"
(http://www.cacert.org/class3.crt), welches wiederum durch das
Rootzertifikat signiert ist.

Daher gibt man in Postfix als signierende CA (smtpd_tls_CAfile) eine
Datei an, die beide diese Zertifikate aneinandergehängt enthält.

Auf der Clientseite, die das Serverzertifikat des Servers
verifizieren soll, muss nur das cacert.org Rootzertifikat als
vertrauenswürdig anerkannt werden (smtp_tls_CAfile). Wenn zur
Linkzeit von Postfix allerdings openssl schon mit dem cacert.org
Rootzertifikat ausgeliefert wurde, braucht das Rootzertifikat von
cacert.org nicht mehr angegeben zu werden.




Vielen Dank fürs Lesen bis hierher, und jetzt bitte schlagt mich,
korrigiert und meint... was das Zeug hält.



Fibbs



Mehr Informationen über die Mailingliste Postfixbuch-users