Vor einiger Zeit bin ich in einem unserer Projekte über eine, für mich neue, Fehlermeldung gestolpert. Zuerst konnte ich nicht viel damit anfangen, da das System einige Tage zuvor noch fehlerfrei die Anfragen durchführte.
Error in the HTTP2 framing layer for "https://domain.example/hub"
Am System gab es keine Updates und auch die Anwendung wurde nicht verändert. Nach einiger Recherche bin ich dann über einen Bug in cURL selbst gestolpert, der offenbar auch in der cURL-Version 7.58.0 vorhanden ist. Es ist die aktuellste Version, die auf einem Ubuntu 18.04 über die Paketverwaltung installiert werden kann.
Der Fehler tritt im Zusammenspiel mit älteren cURL Versionen und Webseiten auf, die den HTTP/2 Layer nutzen.
Die dauerhafte Lösung war es, cURL manuell zu aktualisieren.
cURL aktualisieren
Die aktuelle cURL Version von https://curl.se/download.html herunterladen
wget http://curl.haxx.se/download/curl-7.75.0.tar.gz
Die Tools installieren, um das Release von cURL zu kompilieren
apt-get install libtool
apt-get install make
Dann den Source Code auspacken und die neue cURL Verison kompilieren
tar -xvf curl-7.75.0.tar.gz
cd curl-7.75.0 # das ist der Ordner in den das Archiv entpackt wurde
./buildconf
./configure --with-ssl
make
make install
Dann aktualisieren wir die System Dateien
mv /usr/bin/curl /usr/bin/curl.bak
cp /usr/local/bin/curl /usr/bin/curl
Wir sind fertig! Nun kann die aktuell installierte Version verifiziert werden
curl -Vv
curl 7.75.0 (x86_64-pc-linux-gnu) libcurl/7.75.0
Release-Date: 2021-02-03
Protocols: dict file ftp gopher http imap mqtt pop3 rtsp smtp telnet tftp
Features: alt-svc AsynchDNS IPv6 Largefile UnixSockets
Wenn cURL dabei im Rahmen einer PHP Anwendung genutzt wird, empfiehlt es sich, die betroffenen Dienste neu zu starten
service apache2 restart # falls apache im Einsatz ist
service php7.4-fpm restart # abhängig von der Version
Mögliche Fehlerquellen
Bei der erstmaligen Ausführung, wie die Prüfung der Version verrät, fehlt das Protokoll https, dadurch ist cURL nicht in der Lage mit solchen Verbindungen umzugehen. Ebenso können einige übliche Encodings nicht verarbeitet werden. Als Lösung werden weitere Pakete benötigt und die Kompilierung muss erneut erfolgen. Wenn lediglich das https-Protokoll fehlt, genügt es ein Paket zu installieren und erneut zu kompilieren
sudo apt install libssl-dev
cd curl-7.75.0 # das ist der Ordner in den das Archiv entpackt wurde
./buildconf
./configure --with-ssl
make
make install
Wenn auch weitere Encodings verarbeitet werden sollen, kompilieren wir ein weiteres Paket und fügen es als Option an die Konfiguration an
wget http://www.zlib.net/zlib-1.2.11.tar.gz
tar -xvf zlib-1.2.11.tar.gz
cd zlib-1.2.11/
./configure
make
make install
Im Anschluss kompilieren wir wie oben beschrieben erneut cURL, dieses Mal jedoch mit einem weiteren Parameter
./configure --with-ssl --with-zlib
Wenn alle Schritte fehlerfrei durchlaufen wurden, erscheinen bei der Überprüfung der Version eine ganze Reihe weiterer Protokolle
curl -Vv
curl 7.75.0 (x86_64-pc-linux-gnu) libcurl/7.75.0 OpenSSL/1.1.1 zlib/1.2.11
Release-Date: 2021-02-03
Protocols: dict file ftp ftps gopher gophers http https imap imaps mqtt pop3 pop3s rtsp smb smbs smtp smtps telnet tftp
Features: alt-svc AsynchDNS HTTPS-proxy IPv6 Largefile libz NTLM NTLM_WB SSL TLS-SRP UnixSockets