tobias.kochs-online.net

STARTTLS failed

| 0 comments

In den letzten Tagen habe ich viel Zeit damit verbracht meinem Webmail-Client Roundcube beizubringen E-Mails per SMTP zu versenden. Obwohl der SMTP-Server korrekt eingetragen war und auch die Anmeldeinformationen stimmten, erschien beim Versand immer nur die Fehlermeldung

SMTP Fehler (220): Die Authentisierung ist fehlgeschlagen.

Auch das Fehlerprotokoll war nicht viel aussagekräftiger:

ERROR: STARTTLS failed ()
ERROR: Invalid response code received from server (-1)
ERROR: Invalid response code received from server (-1)
SMTP Error: Authentication failure: STARTTLS failed (Code: ) in [...]/program/lib/Roundcube/rcube.php on line 1708

Dem Protokoll lässt sich zwar noch entnehmen, dass keine verschlüsselte Verbindung hergestellt werden kann – das war’s dann aber auch. Und so vielfältig wie die Ursachen dafür sein können, so vielfältig fallen auch die Ergebnisse einer Internetsuche zu diesem Thema aus. Also habe ich mich gezwungenermaßen selber schrittweise durch den Quelltext gearbeitet.

Roundcube nutzt (in Version 1.1) für den Versand über SMTP das PEAR-Modul Net_SMTP, das seinerseits wiederum Net_Socket verwendet, das für verschlüsselte Verbindungen auf die PHP Extension OpenSSL aufsetzt. Ungeschickterweise werden beim Versuch eine verschlüsselte Verbindung aufzubauen in der Funktion Net_Socket->enableCrypto()  alle OpenSSL-Fehlermeldungen durch den Fehler-Kontroll-Operator @ unterdrückt:

return @stream_socket_enable_crypto($this->fp, $enabled, $type);

Entfernt man das @ vor dem Befehl, so taucht plötzlich auch eine sinnvolle Fehlermeldung im Protokoll auf:

PHP Warning:  stream_socket_enable_crypto(): Peer certificate CN=`smtp.example.com' did not match expected CN=`123.45.67.89' in [...]/program/lib/Net/Socket.php on line 646

In meinem konkreten Fall lag der Fehler also darin begründet, dass der Vergleich zwischen dem im Zertifikat verwendeten Common Name (dem Hostname des SMTP-Servers) und dem erwarteten Common Name (der IP) fehlschlug. Abhilfe lässt sich durch einen entsprechenden Parameter in der Roundcube-Konfiguration schaffen, der den erwarteten Common Name setzt:

$config['smtp_conn_options'] = array(
  'ssl' => array(
    'peer_name' => 'smtp.example.com',
  ),
);

Für andere Probleme (YMMV) hilft ein Blick auf die SSL-Kontext-Optionen für PHP.

Author: Tobias

Hallo, ich bin Tobias. Meine Leidenschaft gilt alten Autos. Je ausgefallener desto besser. Im Alltag schwöre ich auf meinen treuen ’88 Volvo 745 und im Laufe der Zeit sammelten sich daneben in der Garage noch ein ’79 AMC Pacer, ein ’70 Chrysler 300 Hurst, ein ’90 Toyota Sera und ein ’94 Mazda 121 Ginza.
Wenn ich gerade nicht an den Autos herumschraube, lasse ich den Nerd raushängen und schreibe hier irgendwas zu Online- und IT-Themen, Filmen oder Musik.
Ihr findet mich auch .

Leave a Reply

Required fields are marked *.