Ich habe gerade mein Debian 7, Nginx 1.6.2, PHP 5.4.39 auf Debian 8, Nginx 1.6.2, PHP 5.6.9 aktualisiert.
Auf diesem Server läuft ein CRM, mit dem wir E-Mails über PHP, EspoCRM, gesendet haben, und das verwendet ZendFramwork2 E-Mail (Senden über Server 2 – Senden über Thunderbird funktioniert einwandfrei).
Das hat bis nach dem Upgrade einwandfrei funktioniert. Jetzt habe ich eine Fehlermeldung mit folgendem Inhalt:
500 unable to connect via tls
Eine kleine Suche hat also nichts zum CRM ergeben, sondern verweist eher auf das selbst signierte Zertifikat und/oder etwas im Stapel darüber (NGinx/PHP?).
Irgendeine Idee, wo ich mit der Suche anfangen soll? Auf meinem CRM-Server habe ich nichts in den Fehlerprotokollen (ich schätze, das wird vom CRM geschluckt).
Ich sehe auch nichts im Syslog oder Authlog des Maiml-Servers.
BEARBEITEN: Informationen hinzufügen:
phpinfo ()
Registered Stream Socket Transports tcp, udp, unix, udg, ssl, sslv3, tls, tlsv1.0, tlsv1.1, tlsv1.2
curl
SSL Yes
SSL Version OpenSSL/1.0.1k
imap
SSL Support enabled
openssl
OpenSSL support enabled OpenSSL
Library Version OpenSSL 1.0.1k 8 Jan 2015 OpenSSL Header Version
OpenSSL 1.0.1k 8 Jan 2015 Directive Local Value Master Value
openssl.cafile no value no value openssl.capath no value no value
Phar
OpenSSL support enabled
Ich habe die alte Konfigurationsdatei von Debian 7 verwendet (NGinx ist dieselbe Version – ich habe einen Backport auf D7 verwendet).
Server und Software:
Server A: Mailserver, Debian 6, Postfix, selbstsignierte Zertifikate
Server B: Debian 8, Nginx, PHP, EspoCRM – Ich habe TLS gewählt, da es in meinem Thunderbird auf meinem lokalen PC funktioniert und vor dem Upgrade von Debian 7 auf 8 funktioniert hat.
Lokaler PC: Kubuntu, Thunderbird, Mails können über TLS gesendet und empfangen werden.
Antwort1
So wie ich es verstehe, erlaubt PHP 5.6 nicht, selbstsignierte Zertifikate zu akzeptieren, zu validieren oder zu verarbeiten.
http://php.net/manual/en/migration56.openssl.php
Sie müssen die Überprüfung von Peer und Peer-Namen deaktivieren
$streamContext = stream_context_create([
'ssl' => [
'verify_peer' => false,
'verify_peer_name' => false
]
]);
Dies ist nicht trivial, wenn Sie versuchen, es innerhalb eines Pakets zu tun (was so beabsichtigt zu sein scheint), da Sie nicht einfach einige Flags in php.ini oder etwas ähnlich Einfaches festlegen können.
Antwort2
500, keine Verbindung über TLS möglich
Das hilft zwar nicht sehr dabei, das Problem zu identifizieren, aber es muss irgendwo im Code sein, den Sie vermutlich nicht pflegen. Deshalb sollte eine Änderung des Codes, damit er funktioniert, nur der letzte Ausweg sein.
Es wäre nützlich zu wissen, welche Aktion diesen Fehler auslöst.
Da der Mailserver die einzige Stelle in Ihrem Manifest ist, an der ein selbstsigniertes Zertifikat erwähnt wird, gehe ich davon aus, dass hier das Problem auftritt.
Sie müssen lediglich das selbstsignierte Zertifikat zu den anerkannten Zertifizierungsstellen auf dem Host hinzufügen, auf dem sich die Anwendung befindet. Unter der Annahme (wiederum), dass der MTA SMTPS verwendet:
openssl s_client -showcerts -connect servera.example.com:465 </dev/null
Gibt Ihnen die Zertifikatskette. Kopieren Sie die Ausgabe in (sagen wir) /etc/ssl/certs/lbutlr_local.crt
und führen Sie sie ausupdate-ca-certificates