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
Kategorien: Allgemein