Plesk, Qmail, xinetd und SSL – die Zweite
Im Februar hatte ich jede Menge Stress durch die Umstellung eines Mailservers auf xinetd, siehe Artikel. Mitte September lief dann das SSL-Zertifikat ab und ich musste ein neues generieren, was ich nach diesem Blogeintrag tat (Vielen Dank nochmal an dieser Stelle, hat mir viel Arbeit erspart!).
Leider genügt das für ein Setup mit SMTP über stunnel nicht, was ich dummerweise erst gestern beim erfolglosen Versuch des Versendens einer Mail über die Kiste bemerkte. Im stunnel-Log sah das so aus:
2009.11.08 19:47:53 LOG3[15442:3083773632]: SSL_CTX_use_certificate_chain_file: error:0906D06C:PEM routines:PEM_read_bio:no start line
Die Meldung weist auf ein fehlerhaft strukturiertes Zertifikat hin, und ein Vergleich mit dem (glücklicherweise gesicherten) alten zeigte die im neuen fehlenden DH-Parameter.
Diese stammten im alten Zertifikat von /var/qmail/control/dhparam512.pem, von wo aus ich sie dann einfach ans Ende des neuen Zertifikats anfügte - passt.
Bin mir noch nicht sicher, ob das nur ein Dirty Hack war oder sogar sauber...
Qmail-SMTP über xinetd mit SSL
Kürzlich verweigerte der Qmail-SMTPd auf dem von mir betreuten Mailserver den Dienst, was ich als Anlass nahm, gleich von inetd auf xinetd umzusteigen. Das ermöglichte dann den Einsatz von Spamdyke als ultimatives Bollwerk gegen unerwünsche Mails.
Extrem hilfreich dabei waren dieses HowTo und die Stunnel-Homepage. TLS lief out-of-the-box; die SSL-Realisierung war etwas tricky, daher hier meine funktionierende config für xinetd mit stunnel für SSL und eingebundenem Spamdyke:
service smtps
{
socket_type = stream
protocol = tcp
wait = no
disable = no
user = root
instances = 100
env = SMTPAUTH=1 END=1
server = /usr/bin/stunnel
server_args = -D 3 -o /var/log/stunnel.log -T -p /var/qmail/control/servercert.pem -l /var/qmail/bin/tcp-env -- smtps -Rt0 /var/qmail/bin/relaylock /usr/local/bin/spamdyke -f /etc/spamdyke.conf /var/qmail/bin/qmail-smtpd /var/qmail/bin/smtp_auth /var/qmail/bin/true /var/qmail/bin/cmd5checkpw /var/qmail/bin/true
}