WordPress und Cloudflare: ERR_SSL_PROTOCOL_ERROR

Nach der Umstellung auf Cloudflare und der Aktiv Schaltung des Dienstes, ist die Seite nicht mehr erreichbar.

ssl_error

Das liegt daran, dass das Zertifikat auf Seiten Cloudflares noch nicht erzeugt und registriert ist. Der Status im Crypto Reiter sollte “Authorizing Certificate” anzeigen.

ssl-authorisierung

Während dieser Zeit werden Fehlermeldungen ausgegeben, wenn man versucht die Seite via https:// aufzurufen.

registrierung

Nach der Registrierung sollte alles einwandfrei laufen und ein SSL Zertifikat von Cloudflare ausgeliefert werden. Im “Free-Modus” kann hier kein anderes Zertifikat wie eins von Let’s Encrypt durchgereicht und angewendet werden!

cert

Advertisements

WordPress und Cloudflare: Let's Encrypt Zertifikat nutzen

By Default nutzt der Let’s Encrypt client für die ACME Authentifizierung die DVSNI Methode. Das wird nicht funktionieren, wenn eine Domain Cloudflare aktiv hat, da alle SSL (TLS) Verbindungen an den Cloudflare Servern getrennt werden und der ACME Server niemals das Zertifikat sehen wird, dass der Ursprungsserver ausgestellt hat. Die alternativen Methoden zur Validierung wie DNS oder HTTP werden aber unterstützt.

Das heißt, dass man Cloudflare nicht abschalten muss, um Let’s Encrypt nutzen zu können.

Man muss folgendes Kommando absetzen, um dem Client mitzuteilen, dass er die Verifizierung via HTTP durchführen soll:

/opt/letsencrypt/letsencrypt-auto certonly --webroot --webroot-path /var/www/ --renew-by-default --email xxx@xxx.de --text --agree-tos -d tj-braun.de -d http://www.tj-braun.de -d cloud.tj-braun.de -d mail.tj-braun.de -d imap.tj-braun.de -d smtp.tj-braun.de

Die erfolgreiche Erstellung sieht ähnlich dem folgenden Output aus:

Saving debug log to /var/log/letsencrypt/letsencrypt.log
Starting new HTTPS connection (1): acme-v01.api.letsencrypt.org
Renewing an existing certificate
Performing the following challenges:
http-01 challenge for tj-braun.de
http-01 challenge for www.tj-braun.de
http-01 challenge for cloud.tj-braun.de
http-01 challenge for mail.tj-braun.de
http-01 challenge for imap.tj-braun.de
http-01 challenge for smtp.tj-braun.de
Using the webroot path /var/www for all unmatched domains.
Waiting for verification...
Cleaning up challenges
Generating key (2048 bits): /etc/letsencrypt/keys/0007_key-certbot.pem
Creating CSR: /etc/letsencrypt/csr/0007_csr-certbot.pem

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at
   /etc/letsencrypt/live/www.tj-braun.de/fullchain.pem. Your cert will
   expire on 2017-01-16. To obtain a new or tweaked version of this
   certificate in the future, simply run letsencrypt-auto again. To
   non-interactively renew *all* of your certificates, run
   "letsencrypt-auto renew"

WordPress und Cloudflare: Einrichtung

Cloudflare ist ein dezentral aufgestelltes Content Delivery Network (CDN) mit anhängigem DNS. Es fungiert als Reverse Proxy und wird vor die eigentlichen Webserver geschaltet. Dadurch kann es als Cache dienen, der die Inhalte schneller bereit stellen kann und die Webseite somit schneller machen kann. CDNs können aber auch bei DDoS Attacken helfen und die Last vom eigentlichen Server fern halten und bei kurzfristigen Downtimes helfen. Ein weiterer Vorteil ist, dass Cloudflare seit einiger Zeit die gecachten Webseiten im neuen HTTP/2-Protokoll ausliefert. Das bringt ebenfalls Geschwindigkeitsvorteile und Google scheint das neue Protokoll pushen zu wollen.

Einrichtung von Cloudflare

Zunächst muss man https://www.cloudflare.com aufrufen, sich dort registrieren und die URL der Webseite eingeben, die man verbinden möchte.

cloudflare-webseite-hinzufuegen

Anschließend werden die aktiven DNS Server der Domain gescannt. Das kann etwas dauern. Als Ergebnis erhält man eine Übersicht über die DNS-Zonen. Eine orange Wolke bedeutet, dass hier ein Caching über Cloudflare eingestellt ist und der Traffic über Cloudflare selbst läuft. Eine graue Wolke bedeutet, dass für diesen Host das Caching deaktiviert ist und Cloudflare lediglich den DNS Dienst übernimmt. Der Traffic wird also weiter über den eigenen Webserver laufen.

Hier wird beispielsweise nur der Traffic zu WordPress gecached. Der Rest nicht.

dns-cloudflare

[fusion_alert type=”general” accent_color=”” background_color=”” border_size=”1px” icon=”” box_shadow=”no” hide_on_mobile=”small-visibility,medium-visibility,large-visibility” class=”” id=”” animation_type=”” animation_direction=”left” animation_speed=”0.3″ animation_offset=””]

Bei den DNS Einträgen ist es wichtig, dass auch wirklich alle Inhalte des bisherigen Providers auf den Cloudflare DNS übernommen werden. TXT Einträge wurden bei mir nicht von Beginn an übernommen und mussten händisch hinterlegt werden.

[/fusion_alert]

Anschließend wird der Plan ausgewählt. “Free” sollte für den Anfang ausreichen. Ein Upgrade ist während des Betriebs unterbrechungsfrei möglich.

DNS/Nameserver einrichten

Nach der Einrichtung muss man die eigene Domain auf Cloudflare umleiten.

Dieser Punkt ist ein Muss. Wer seine DNS-Einstellungen nicht verändern kann, der hat keine Chance, Cloudflare zu nutzen. Insbesondere User, die Webseite und Hosting beim gleichen Anbieter haben, können hier Probleme bekommen.

change-nameserver

Änderung anhand INWX

Da ich als Domainregistrar INWX nutze, wird die Umstellung hier an dem Beispiel erläutert.

Ein einfaches Abändern der DNS Server bzw. NS Records der Domain ist nicht möglich, da der SOA Eintrag fix auf den ersten DNS Server zeigt und es so zu Loops kommen kann und die Namensauflösung nicht mehr sauber funktioniert. Aus diesem Grund muss die komplette Domain auf einen externen DNS Server ausgelagert werden. Das ist in dem Fall Cloudflare.

Dazu ruft man die Domainliste auf, wählt die betroffene Domain und klickt in der Übersicht auf externe Nameserver. Dort werden dann die von Cloudflare vorgegebenen DNS Server hinterlegt.

externe-nameserver-inwx

Nachdem die Cloudflare-Nameserver eingetragen wurden, kann es bis zu 24 Stunden dauern, bis alles reibungslos funktioniert.

Die korrekten Einstellungen kann man auf Seiten wie mxtoolbox.com testen.

mxtoolbox-dns-check

Bis die DNS Einstellungen übernommen wurden wird auf der Cloudflare Seite der Pending Status ausgerufen.

cloudflare-web-performance-security

Status nach erfolgreicher Inbetriebnahme:

cloudflare-overview

Kontrolle der Auslieferung via Cloudflare

Trotz des “Active” Status kann es sein, dass die Webseite immer noch über den eigentlichen Webserver ausgeliefert wird. Das passiert immer dann, wenn der Cache-Header “no-store, no-chache” ausliefert. Dadurch erhält Cloudflare die Anweisung, dass die Webseite nicht im Cache abgelegt werden darf und muss jeden Aufruf wieder auf den Webserver weiterleiten. Dadurch kann keine Geschwindigkeitsoptimierung erfolgen.

Kontrolliert werden kann der Cache-Header z.B. durch den Befehl curl -I https://www.tj-braun.de

curl

Hat man diese Header Definition (WordPress setzt sie bspw.) gibt es dennoch eine Lösung: Cloudflare Page Rules. Das sind Regeln (von denen man in der Free-Version 3 definieren kann), die dafür sorgen, dass die Webseiten dennoch gespeichert und ausgeliefert werden.

Dafür unter dem Tab “Page Rules” zuerst das Pattern für die Webseite eintragen http://www.domain.tld/* und dann folgende Regel erstellen:

Custom Caching: Cache everything

Sometimes cache headers are set on the server-side or by a CMS solution like WordPress. If you choose to Cache Everything, CloudFlare will respect these headers unless you choose to overwrite them.

Edge cache expire TTL

To overwrite any default headers, choose a time from the drop-down menu. This is the refetch time for when CloudFlare checks the origin server for a new resource.

 

cache

Damit der Admin Bereich nicht gecached wird, wird eine zweite Regel erstellt.

Pattern: http://www.domain.tld/wp-*
Custom caching: Bypass cache

[fusion_alert type=”general” accent_color=”” background_color=”” border_size=”1px” icon=”” box_shadow=”no” hide_on_mobile=”small-visibility,medium-visibility,large-visibility” class=”” id=”” animation_type=”” animation_direction=”left” animation_speed=”0.3″ animation_offset=””]

Die Einstellung des Admin Bereichs muss VOR der allgemeinen Definition stehen, damit der Admin Bereich auch wirklich nicht gecached wird.

[/fusion_alert]

Letsencrypt Python Update failed – InsecurePlatformWarning, Bus Error

Sollte das automatische Update von Letsencrypt fehlschlagen und folgende Fehler auswerfen…

...
Installing Python packages...
Had a problem while installing Python packages:
Collecting argparse==1.4.0 (from -r /tmp/tmp.LNMYALuybJ/letsencrypt-auto-requirements.txt (line 5))
/root/.local/share/letsencrypt/local/lib/python2.7/site-packages/pip/_vendor/requests/packages/urllib3/util/ssl_.py:315: SNIMissingWarning: An HTTPS request has been made, but the SNI (Subject Name Indication) extension to TLS is not available on this platform. This may cause the server to present an incorrect TLS certificate, which can cause validation failures. For more information, see https://urllib3.readthedocs.org/en/latest/security.html#snimissingwarning.
  SNIMissingWarning
/root/.local/share/letsencrypt/local/lib/python2.7/site-packages/pip/_vendor/requests/packages/urllib3/util/ssl_.py:120: InsecurePlatformWarning: A true SSLContext object is not available. This prevents urllib3 from configuring SSL appropriately and may cause certain SSL connections to fail. For more information, see https://urllib3.readthedocs.org/en/latest/security.html#insecureplatformwarning.
  InsecurePlatformWarning
  Downloading argparse-1.4.0-py2.py3-none-any.whl
Collecting pycparser==2.14 (from -r /tmp/tmp.LNMYALuybJ/letsencrypt-auto-requirements.txt (line 11))
  Downloading pycparser-2.14.tar.gz (223kB)
Collecting cffi==1.4.2 (from -r /tmp/tmp.LNMYALuybJ/letsencrypt-auto-requirements.txt (line 14))
  Downloading cffi-1.4.2.tar.gz (365kB)
    Complete output from command python setup.py egg_info:
    x86_64-linux-gnu-gcc: internal compiler error: Bus error (program as)
    Please submit a full bug report,
    with preprocessed source if appropriate.
    See <file:///usr/share/doc/gcc-4.8/README.Bugs> for instructions.
    x86_64-linux-gnu-gcc: internal compiler error: Bus error (program as)
    Please submit a full bug report,
    with preprocessed source if appropriate.
    See <file:///usr/share/doc/gcc-4.8/README.Bugs> for instructions.

        No working compiler found, or bogus compiler options
        passed to the compiler from Python's distutils module.
        See the error messages above.
        (If they are about -mno-fused-madd and you are on OS/X 10.8,
        see http://stackoverflow.com/questions/22313407/ .)

    ----------------------------------------
Command "python setup.py egg_info" failed with error code 1 in /tmp/pip-build-EQlFQP/cffi
/root/.local/share/letsencrypt/local/lib/python2.7/site-packages/pip/_vendor/requests/packages/urllib3/util/ssl_.py:120: InsecurePlatformWarning: A true SSLContext object is not available. This prevents urllib3 from configuring SSL appropriately and may cause certain SSL connections to fail. For more information, see https://urllib3.readthedocs.org/en/latest/security.html#insecureplatformwarning.
  InsecurePlatformWarning

…sollte man sich die Logdatei genauer anschauen /root/.pip/pip.log

...
 Using version 1.6.0 (newest of versions: 1.6.0, 1.5.2, 1.5.1, 1.5.0, 1.4.2, 1.4.1)
  Downloading from URL https://pypi.python.org/packages/b6/98/11feff87072e2e640fb8320712b781eccdef05d588618915236b32289d5a/cffi-1.6.0.tar.gz#md5=2fae9160991afefb20ff0fbde3b14faf (from https://pypi.python.org/simple/cffi/)
  Running setup.py (path:/tmp/pip_build_root/cffi/setup.py) egg_info for package cffi
    x86_64-linux-gnu-gcc: internal compiler error: Bus error (program as)
    Please submit a full bug report,
    with preprocessed source if appropriate.
    See <file:///usr/share/doc/gcc-4.8/README.Bugs> for instructions.
    x86_64-linux-gnu-gcc: internal compiler error: Bus error (program as)
    Please submit a full bug report,
    with preprocessed source if appropriate.
    See <file:///usr/share/doc/gcc-4.8/README.Bugs> for instructions.

        No working compiler found, or bogus compiler options
        passed to the compiler from Python's distutils module.
        See the error messages above.
        (If they are about -mno-fused-madd and you are on OS/X 10.8,
        see http://stackoverflow.com/questions/22313407/ .)
    Complete output from command python setup.py egg_info:
    x86_64-linux-gnu-gcc: internal compiler error: Bus error (program as)
...

GCC scheint zum Kompilieren das Binary “as” zu nutzen, welches hier einen Fehler zu haben scheint.
Dies ist im Paket “binutils” enthalten und sollte via

apt-get install --reinstall binutils

neuinstalliert werden.

Installing Python packages...
Installation succeeded.