Wenn ein Plugin-Update mit folgender Meldung abbricht: „Download failed. cURL error 28: Connection timed out after 10001 milliseconds“, oder wenn eine Lizenzprüfung bzw. ein Zahlungsmodul den Fehler „cURL error 60: SSL certificate problem: unable to get local issuer certificate“ protokolliert, hat WordPress versucht, einen anderen Server zu erreichen, was jedoch fehlgeschlagen ist. Beide Meldungen stammen von cURL, jener Programmbibliothek, mit der PHP Webanfragen versendet.
- Der Fehler 28 ist immer ein Zeitüberschreitung: Irgendwo auf dem Weg hat eine Komponente nicht geantwortet, bevor das Zeitlimit abgelaufen ist.
- Der Fehler 60 bedeutet, dass die Verbindung hergestellt wurde, das Zertifikat des Remote-Servers jedoch nicht überprüft werden konnte.
Aus dem weiteren Text der Meldung geht hervor, wo die Anfrage ins Stocken geraten ist und wer für die Behebung zuständig ist: Sie selbst, unser Support oder der externe Dienstleister.
1. Notieren Sie sich die genaue Fehlermeldung
Der Fehler wird auf der Seite „Plugins“ oder unter „WordPress-Dashboard › Updates“, im Protokoll des jeweiligen Plugins oder auf der Seite „Tools › Website-Zustand“ angezeigt. Dort erscheint beispielsweise folgende Meldung: „WordPress.org konnte nicht erreicht werden“, darunter der cURL-Fehler und die IP-Adresse. Notieren Sie sich die Fehlernummer, den Text hinter der Nummer sowie die Adresse, die die Website aufrufen wollte.
2. Wiederholen Sie die Anfrage in WordPress
Das cPanel-Terminal (Gruppe „Erweitert“) oder SSH verwendet dasselbe PHP und WordPress wie die Website. Im Verzeichnis der Website:
cd ~/public_html
wp eval '$r = wp_remote_get( "https://api.wordpress.org/core/version-check/1.7/" ); echo is_wp_error( $r ) ? $r->get_error_message() : wp_remote_retrieve_response_code( $r ), PHP_EOL;'
Bei einer einwandfrei funktionierenden Website lautet die Antwort „200“. Anstelle von „WordPress.org“ können Sie auch die Adresse des Lizenzservers des Plugins oder des Zahlungsanbieters eingeben. Jeder Statuscode, sei es „401“ oder „404“, bedeutet, dass die Netzwerkverbindung funktioniert und der Remote-Server geantwortet hat. Die Grundlagen von WP-CLI werden im Artikel zur Verwendung von WP-CLI beschrieben.
3. Wiederholen Sie den Vorgang mit curl und messen Sie dabei die Zeit
Dies läuft unabhängig von WordPress und trennt somit die WordPress-Konfiguration vom Netzwerk:
curl -sS -o /dev/null --max-time 10 -w 'dns=%{time_namelookup} kapcsolat=%{time_connect} tls=%{time_appconnect} elso_bajt=%{time_starttransfer} ip=%{remote_ip} kod=%{http_code}\n' https://api.wordpress.org/core/version-check/1.7/
Auf unserem Test-Hosting (aWh-cPanel-Server):
dns=0.000184 kapcsolat=0.082131 tls=0.169085 elso_bajt=0.252814 ip=2620:109:b00a::4206:2afb kod=200
Alle Werte geben die seit dem Start verstrichenen Sekunden an. Im Falle eines Fehlers gibt curl eine Fehlermeldung aus; die Tabelle zeigt, an welcher Stelle der Fehler aufgetreten ist:
| curl gibt Folgendes aus | Wo liegt das Problem? | Wer korrigiert das? |
|---|---|---|
curl: (28) Resolving timed out oder curl: (6) Could not resolve host |
Namensauflösung (DNS) | aWh-Support |
curl: (7) Failed to connect … Connection refused (sofort) |
Der ausgehende Port ist gesperrt | aWh-Support |
curl: (28) Connection timed out |
Firewall oder Netzwerkroute | aWh-Support |
curl: (28) Operation timed out … with 0 bytes received |
Der Remote-Server antwortet nicht rechtzeitig | der Remote-Anbieter |
curl: (60) SSL certificate problem: … |
Zertifikatsprüfung | Siehe Schritt 5 |
4. Wenn curl funktioniert, WordPress jedoch nicht
Zwei „wp-config.php“-Konstanten können ausgehende Anfragen blockieren, noch bevor diese gestartet werden:
wp config get WP_HTTP_BLOCK_EXTERNAL
wp config get WP_ACCESSIBLE_HOSTS
wp config get WP_PROXY_HOST
Die übliche Antwort auf alle drei Fragen lautet, dass die Konstante nicht angegeben ist. Wenn „WP_HTTP_BLOCK_EXTERNAL“ aktiviert ist, kann WordPress nur auf die eigene Website und auf die in der Liste „WP_ACCESSIBLE_HOSTS“ aufgeführten Adressen zugreifen; in diesem Fall lautet die Meldung „User has blocked requests through HTTP“. Fügen Sie die erforderlichen Adressen durch Kommas getrennt ein (* als Platzhalter):
wp config set WP_ACCESSIBLE_HOSTS 'api.wordpress.org,*.wordpress.org,api.szolgaltato.hu'
Ein nicht mehr vorhandener Proxy-Server (WP_PROXY_HOST) verursacht dieselbe Zeitüberschreitung; falls Sie keinen Proxy verwenden, löschen Sie bitte: wp config delete WP_PROXY_HOST.
5. Fehler 60: Zertifikat
Der Text nach „SSL-Zertifikat-Problem:“ nennt den Grund:
- „unable to get local issuer certificate“: Das Zertifikatsverzeichnis erkennt den Aussteller nicht oder der Remote-Server übermittelt das Zwischenzertifikat nicht.
- „Zertifikat ist abgelaufen“: Das Zertifikat des Remote-Servers ist abgelaufen; der Anbieter muss es erneuern.
- „Selbstsigniertes Zertifikat in der Zertifikatskette“: Ein Gerät (z. B. ein Filter-Proxy) entschlüsselt die Verbindung auf dem Weg der Anfrage.
WordPress verwendet für seine eigenen Anfragen sein eigenes Zertifikatsbundle (wp-includes/certificates/ca-bundle.crt), das bei einer WordPress-Aktualisierung ebenfalls aktualisiert wird. Sollte Ihre WordPress-Version veraltet sein, aktualisieren Sie diese bitte zunächst. Überprüfen Sie anschließend, welche Daten der Remote-Server übermittelt:
echo | openssl s_client -connect api.szolgaltato.hu:443 -servername api.szolgaltato.hu -showcerts 2>/dev/null | grep -E '^ *[0-9] s:|^ *i:'
Eine korrekte Zertifikatskette besteht aus mindestens zwei Elementen (dem Serverzertifikat und dem Zwischenzertifikat). Wenn nur die Zeile „0“ angezeigt wird, fehlt das Zwischenzertifikat auf dem Remote-Server; dies muss vom Anbieter behoben werden. Schreiben Sie ihm dazu unter Angabe der Befehlsausgabe. Zu den Zwischenzertifikaten gibt es einen separaten Artikel.
6. Die ausgehenden Ports
Auf unseren cPanel-Hosting-Servern können Websites über die Standardports (HTTP 80, HTTPS 443) ungehindert auf andere Server zugreifen; auf unserem Test-Hosting reagierte WordPress.org problemlos auf IPv6-Anfragen. Verwendet ein Dienst einen nicht standardmäßigen Port (z. B. https://api.szolgaltato.hu:8443), wird die Verbindung von der Firewall sofort abgelehnt (cURL error 7) oder es kommt zu einer Zeitüberschreitung (cURL error 28). Wenden Sie sich in diesem Fall bitte an unseren Support: Senden Sie uns die Ausgabe von Schritt 3 sowie die Adresse des Dienstes einschließlich des Ports, und wir prüfen, ob eine Freigabe möglich ist.
Bitte wenden Sie sich ebenfalls an uns, wenn die Namensauflösung ins Stocken gerät oder wenn der Fehler nur gelegentlich auftritt (beispielsweise bei jeder zehnten Anfrage). Führen Sie den Befehl aus Schritt 3 zehnmal hintereinander aus und teilen Sie uns mit, welcher Wert dabei abweicht.
7. Langsamer Remote-Dienst: Erhöhen Sie lediglich das Zeitlimit
Wenn die Werte für „kapcsolat“ und „tls“ schnell sind, die Antwort jedoch „Operation timed out … with 0 bytes received“ lautet, ist der Remote-Server langsam. Überprüfen Sie zunächst die Statusseite des Anbieters. Sollte die Verzögerung anhalten, können Sie das Zeitlimit für eine einzelne Adresse mithilfe eines „must-use“-Plugins erhöhen (wp-content/mu-plugins/szolgaltato-idokorlat.php):
<?php
/**
* Plugin Name: Hosszabb időkorlát egy lassú API-hoz
*/
add_filter( 'http_request_args', function ( $args, $url ) {
if ( 'api.szolgaltato.hu' === wp_parse_url( $url, PHP_URL_HOST ) ) {
$args['timeout'] = 15;
}
return $args;
}, 10, 2 );
Halten Sie sich an die 15-Sekunden-Regel: Solange eine Anfrage aussteht, belegt sie einen PHP-Prozess, und wenn eine Seite auf diese Anfrage wartet, muss auch der Besucher warten.
Überprüfung
Wiederholen Sie Schritt 2 für jede Adresse, die einen Fehler zurückgegeben hat; jede davon sollte einen Statuscode zurückgeben, keinen cURL-Fehler. Anschließend folgt der eigene Test von „Website Health“:
wp eval 'require_once ABSPATH . "wp-admin/includes/class-wp-site-health.php"; $r = WP_Site_Health::get_instance()->get_test_dotorg_communication(); echo $r["label"], PHP_EOL;'
Die erwartete Antwort lautet: „Die Verbindung zu WordPress.org konnte hergestellt werden“. Versuchen Sie anschließend erneut, das Update auf der Seite „Control Panel › Updates“ durchzuführen.
Was Sie nicht tun sollten
- Deaktivieren Sie die Prüfung des Zertifikats nicht (
sslverify=falseoder den Filterhttps_ssl_verify). Die Fehlermeldung verschwindet zwar, doch jeder, der sich in den Verbindungsweg einschaltet, kann im Namen des Update-Servers oder des Zahlungssystems antworten. - Erhöhen Sie nicht alle Zeitlimits auf 60 Sekunden. Dies behebt zwar keine fehlerhafte Namensauflösung oder gesperrte Ports, kann jedoch dazu führen, dass jede Seite, die einen externen Dienst aufruft, um diesen Wert langsamer wird.
