Fetchmail und das Server Zertifikat

Fetchmail holt von einem Server E-Mails ab und übergibt diese an z.B. postfix. Das ist eine praktische Variante einen internen Mailserver zu betreiben ohne das Sicherheitsrisiko von ausserhalb erreichbar zu sein.
Damit beim Abholen niemand mitliest wird die Verbindung per SSL gesichert.
Beispielkonfiguration:


poll pop.server.de uidl with proto POP3
  user "user@server.de" there with password "xyz" is localuser
  keep ssl sslfingerprint "A1:B2:C3:D4:E5:F6:18:29:3A:4B:5C:6D:7E:8F:91:A2"

Der MD5 Fingerprint kann sich auf dem Server ändern. Fetchmail korrigiert das nicht selbsttätig. Mit einem Skript lässt sich das beheben.


#! /bin/bash
# prueft, ob der md5 Fingerprint in der Datei fetchmailrc uebereinstimmt 
# mit dem Fingerprint auf dem Server
# Falls nein, dann wird versucht den neuen Fingerprint in der 
# fetchmailrc auszutauschen

FMRC=/etc/fetchmailrc
LOGFILE=/home/user/log/fingerprint.log
DATE=`date +%Y-%m-%d" "%H:%M:%S`
LOGMSG=$DATE
SUBJECT="Fingerprintpruefung Fetchmail"

#zuerst den aktuellen md5 Fingerprint aus der Datei holen
#Ich setze voraus, dass nicht mehrere unterschiedliche Fingerprints vorhanden sind
function get_fetchmailFingerprint
{
  while read line; do
    local fp=`echo "$line" | grep -oE '([A-F0-9]{2}:){15}[A-F0-9]{2}'`
    if [ "$fp" != "" ]; then
      break
    fi
  done < $FMRC
  echo $fp
}

FMFP=`get_fetchmailFingerprint`
if [ "$FMFP" = "" ]; then
  LOGMSG+=" Konnte den Fingerprint aus fetchmailrc nicht ermitteln. Kein Vergleich mit dem Server-Fingerprint"
  echo $LOGMSG >> $LOGFILE
  echo $LOGMSG | /bin/mail -s "$SUBJECT" "mail@admin.de"
  exit 1
fi

#Fingerprint vom Server holen (unnoetige Ausgaben verwerfen)
SERVERFP=`echo -n | openssl s_client -connect pop.server.de:995 2>/dev/null | openssl x509 -fingerprint -noout -md5 | cut -f2 -d'='`
if [ "$SERVERFP" = "" ]; then
  LOGMSG+=" Konnte den Fingerprint vom Server nicht ermitteln. Kein Vergleich mit dem Fetchmail-Fingerprint"
  echo $LOGMSG >> $LOGFILE
  echo $LOGMSG | /bin/mail -s "$SUBJECT" "mail@admin.de"
  exit 1
fi

LOGMSG+=" Server-Fingerprint: "$SERVERFP" - Fetchmail-Fingerprint: "$FMFP
if [ "$FMFP" = "$SERVERFP" ]; then
  LOGMSG+=" - stimmen ueberein."
  echo $LOGMSG >> $LOGFILE
  exit 0
fi

# An dieser Stelle sind die Fingerprints unterschiedlich -> in der Datei austauschen
# sed -i 's/A1:B1/A2:B2/g' fetchmailrc # ersetzt A1:B1 durch A2:B2 in allen Vorkommen
sed -i 's/"'$FMFP'"/"'$SERVERFP'"/g' $FMRC

# Kontrolle
FMFP=`get_fetchmailFingerprint`
if [ "$FMFP" != "$SERVERFP" ]; then
  LOGMSG+=" - FEHLER beim Rueckschreiben des Fingerprints. DRINGEND manuell erledigen!"
else
  # fetchmail muss die Konfigurationsaenderung mitgeteilt werden
  systemctl restart fetchmail
  LOGMSG+=" - Die Fingerprints wurden erneuert."
fi
echo $LOGMSG >> $LOGFILE
echo $LOGMSG | /bin/mail -s "$SUBJECT" "mail@admin.de"

exit 0

Mit einem Cronjob wird das Skript regelmäßig aufgerufen und es gibt keine lange Unterbrechung des E-Mail Eingangs.
Getestet auf openSUSE Linux 42.1