Block > Fruehjahrsputz 2
7 min (1434 Wörter, 9536 Zeichen)
Inhaltsverzeichnis
Im vorletzten Beitrag hatte ich es ja bereits durchblicken lassen, dass ich noch einiges machen wollte. Dieses einige habe ich nun erledigt und wollte es euch nicht vorenthalten 😊
Optimierungen #
SSL/TLS #
Dank Heartbleed hab ich mal ein neues Zertifikat gebaut. Dies ist nun
ein Wildcard-Zertifikat (so koennen nun auch
blafasel.yhaupenthal.org
und
test.yhaupenthal.org
verschluesselt werden), etwas groesserer
Schluessellaenge (4096 bit) und wieder bei CAcert .
Da ich es schon oefter gemacht habe, und immer vergesse, wie das geht, hier eine Anleitung. Dies richtet sich allerdings nur an Leute, die bei CAcert Zertifikate ausstellen koennen und lighttpd als Webserver einsetzen.
-
Dieses Script hier runterladen, mit dem ein Certificate Signing Request erstellt werden kann.
-
Das Script oeffnen und die Schluessellaenge vergroessern (in Zeile 111):
openssl req -batch -config $CONFIG -newkey rsa:4096 -out $HOME/${HOST}_csr.pem
-
Ausfuehren und bei den Abfragen folgende Daten angeben:
# --- 8< --- Short Hostname (ie. imap big_srv www2): yh FQDN/CommonName (ie. www.example.com) : yhaupenthal.org Type SubjectAltNames for the certificate, one per line. Enter a blank line to finish SubjectAltName: DNS:yhaupenthal.org SubjectAltName: DNS:*.yhaupenthal.org SubjectAltName: DNS: # --- >8 ---
-
CSR bei CAcert eingeben (als class3) und Zertifikat abspeichern (als
yh_server.pem
) -
Den privaten Schluessel und das Zertifikat mergen (Quelle ):
cat yh_privatekey.pem yh_server.pem > yh.pem
-
yh.pem
auf den Webserver hochladen und in/etc/lighttpd/certs/
ablegenUpdate (2014-06-02)
Ein “Chained Certificate”, bestehend aus dem class1- und class3-Zertifikat von CAcert basteln (Quelle ):
sudo cd /etc/lighttpd/certs sudo wget http://www.cacert.org/certs/root.crt sudo wget http://www.cacert.org/certs/class3.crt sudo cat root.crt class3.crt > cacert.pem
-
In der Konfigurationsdatei von
lighttpd
folgendes hinzufuegen:# --- 8< --- ssl.engine = "enable" ssl.pemfile = "/etc/lighttpd/certs/yh.pem" ssl.ca-file = "/etc/lighttpd/certs/cacert.pem" # --- >8 ---
-
Konfiguration auf Fehler testen (Quelle ):
sudo lighttpd -t -f /etc/lighttpd/lighttpd.conf
-
Und neustarten:
sudo systemctl restart lighttpd
Und da wir gerade schon dabei sind, hier eine Anleitung, wie lighttpd
beim SSL Server Test gut abschneidet (ich bekomme zwar ein
F , das liegt aber daran, dass sie CAcert nicht trauen, ansonsten
haette ich ein A+).
Dabei lasse ich nur noch bestimmte Protokolle und Cipher zu und
gewaehrleiste so auch Perfect Forward Secrecy (PFS) 😊
-
Erst deaktiviere ich unsichere Protokolle. Ich richte mich dabei an die Empfehlungen (siehe Punkt 2.2).
ssl.use-sslv2 = "disable" ssl.use-sslv3 = "disable"
-
Dann deaktiviere ich die Komprimierung von SSL/TLS (Empfehlung , Punkt 2.7):
ssl.use-compression = "disable"
-
Um sicherzustellen, dass die Verschluesselungsverfahren vom Server geordnet werden und nicht vom Client, aktiviere ich noch folgendes (obwohl es laut Wiki default ist, wenn eine Cipher-list uebergeben wird):
ssl.honor-cipher-order = "enable"
-
Zuletzt liste ich noch meine Cipher auf, die der Webserver verwenden soll (Quelle , aber ohne GCM und ECDSA):
ssl.cipher-list = "ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA"
Eine noch krassere Auswahl ist z.B. die hier, die von lighttpd selbst vorgeschlagen wird:
ssl.cipher-list = "aRSA+HIGH !3DES +kEDH +kRSA !kSRP !kPSK !SSLv3"
Update (2014-06-05)
Und aus Gruenden aktivieren wir dabei auch noch HTTP Strict Transport Security (HSTS). Dazu muss lediglich folgendes zur TLS-Konfiguration von Lighttpd hinzugefuegt werden (ggf. noch das Servermodul
mod_setenv
laden):setenv.add-response-header = ("Strict-Transport-Security" => "max-age=31536000; includeSubDomains")
Update (2015-05-21)
Gestern kam ja Logjam dazu, daher bin ich nochmal froh, direkt auf 4096 Bit ueberall gesetzt zu haben. Nichtsdestotrotz ist es trotzdem sinnvoll, noch Diffie-Hellman-Parameter extra zu generieren (Quelle ):
sudo openssl dhparam -out /etc/lighttpd/dhparams.pem 4096
Einbinden laesst sich das ganze dann wie folgt in der
lighttpd.conf
:ssl.dh-file = "/etc/lighttpd/dhparams.pem"
Weil wir es koennen und weil Lighttpd es mit sich bringt , setzen wir auch noch die “Elliptic-Curve Diffie-Hellman parameters” auf etwas hoeheres, vom Standard (
secp256r1
) abweichendes:ssl.ec-curve = "secp521r1"
Was alles unterstuetzt wird, zeigt folgender Befehl an:
openssl ecparam -list_curves
Neustart natuerlich nicht vergessen 😉
Der SSL Server Test kann dabei uebrigens auch durch Kommandozeilenprogramme durchgefuehrt werden: SSLScanner oder testssl.sh
SSL/TLS - Quellen #
PageSpeed Insights #
Dank PageSpeed Insights konnte ich einige Verbesserungen erzielen, fuer mobile Geraete wie auch fuer den Desktop.
Eine sinnvolle Methode war, die JavaScript- und CSS-Dateien zu entschlacken und zu minimieren:
- Erst habe ich mit CSSTidy alles optimiert, was zu optimieren war.
- Danach habe ich alle JS- und CSS-Dateien in jeweils einer Datei vereinigt und diese dann mit yuicompressor komprimiert.
Desweiteren werden nun einige Dateitypen vom Webserver komprimiert
ausgeliefert. Dazu kam folgendes in meine Lighttpd-Konfiguration
(vorher noch das Servermodul mod_compress
laden):
compress.allowed-encodings = ("bzip2", "gzip", "deflate")
compress.cache-dir = "/tmp/cache/"
compress.filetype = ("text/css", "text/javascript", "text/plain", "text/html", "text/xml", "application/javascript", "image/png", "application/rss+xml", "application/octet-stream", "application/x-javascript")
Quellen #
Leider meint Google immer noch, dass da noch was zu optimieren ist, aber ich glaube, das liegt am HTML-Code, der ist naemlicht nicht komprimiert. Und ich bin mir auch nicht so recht sicher, ob ich das will (Lesbarkeit und so …).
Per default folgendes als Response auf einen GET-Request zu senden, macht naemlich einiges kaputt:
setenv.add-response-header = ( "Content-Encoding" => "gzip" )
Naja, das muss ich mal noch weiter untersuchen. Im Moment reicht mir da aber die 99% bzw. 97% bei der Bewertung.
Noch ein Thema bei der Komprimierung waren die Bilder auf meiner Seite. Ich koennte die alle mal durch optipng oder aehnliches jagen, hab das aber noch nicht gemacht.
Ebenfalls im Zusammenhang mit dem schnelleren Laden von Websites
steht das Nachladen von Code, wie JavaScript oder CSS.
Dank Google hab ich nun die JavaScript-Datei ans Ende meiner Website
geschoben und lade sie asynchron nach:
<!-- --- 8< --- -->
<script async src="./js/js-min.js"></script>
</body>
</html>
Was mich nun neben der Komprimierung noch von 100% bei den Bewertungen abhaelt ist zum einen die optimale Groesse von Links oder Schaltflaechen auf Mobilgeraeten einhalten - was mir wirklich im Moment zu doof ist - und zum anderen, dass ich nur CSS-Code laden soll, der direkt gebraucht wird, weil alles unterm Bildschirmrand erstmal unsichtbar ist und nicht gebraucht wird (daher above the fold ). Auch das ist mir im Moment zu doof.
Update (2014-06-02)
Vorher hatte ich den CSS-Code erst ganz am Ende (nach</html>
) geladen, allerdings failt das in einigen
Browsern und mir selbst war der Sinn nicht ganz klar (hier Google
dazu ). Daher nun wieder
wie gewohnt im <head>
.
Webmaster-Tools #
Neben PageSpeed Insights hab ich mir auch mal die
Webmaster-Tools von Google angeguckt und konnte ein paar
Optimierungen vornehmen.
Dabei habe ich insbesondere mal eine ordentliche
Sitemap kreirt, denn meine jetzige ist eher fuer Menschen denn fuer
Maschinen gedacht 😉
Dabei habe ich mir erst ein kleines Script geschrieben, was mir alle Dateien, die meine Website ausmachen, in eine Datei ausspuckt:
# --- 8< ---
https://yhaupenthal.org/1198265694.htm
https://yhaupenthal.org/1198267875.htm
https://yhaupenthal.org/1198415538.htm
# --- >8 ---
Zusammen mit sitemap-generators und der folgenden Konfiguration spuckt das Script mir dann eine Sitemap-Datei aus.
<?xml version="1.0" encoding="UTF-8"?>
<site
base_url="https://yhaupenthal.org/"
store_into="/tmp/sitemap.xml"
verbose="1"
sitemap_type="web"
>
<urllist path="/tmp/urls.txt" encoding="UTF-8" />
</site>
Die Sitemap-Datei befindet sich nun hier: sitemap.xml.
Wichtig ist dabei noch, das auch den anderen Suchmaschinen mitzuteilen,
z.B. per robots.txt
:
# Have phun ...
User-agent: *
Disallow:
Sitemap: https://yhaupenthal.org/sitemap.xml
Und hier noch was fuer die Statistik:
--- 8< ---
Writing Sitemap file "/tmp/sitemap.xml" with 1677 URLs
Search engine notification is suppressed.
Count of file extensions on URLs:
1 .blend
1 .c4d
1 .cpp
1 .css
171 .fcgi
2 .gif
1 .gz
207 .htm
614 .jpg
1 .js
7 .pdf
645 .png
2 .psd
1 .sh
1 .stl
9 .svg
1 .tex
1 .thing
5 .txt
5 .xml
Number of errors: 0
Number of warnings: 0
GTmetrix #
GTmetrix nutzt PageSpeed und
YSlow und testet damit die
jeweilige Website.
Ich hatte beim ersten Versuch 99% bei PageSpeed und 95% bei YSlow.
Daraufhin habe ich im Header <meta charset="utf-8">
entfernt, da es
direkt vom Server beim HTTP Request mitgeschickt wird:
mimetype.assign = (
".htm" => "text/html; charset=utf-8"
)
Update (2014-06-05)
Die Aenderung habe ich nun wieder rueckgaengig gemacht (also wieder<meta charset="utf-8">
zum Header
hinzugefuegt), da einige Browser wie Firefox nicht ohne auskommen …
Nicht klar ist mir, was dieses CDN soll, ich will meine Dateien nicht von externen Quellen laden … Datenschutz und so …
Sonstiges #
-
Durch die Aktualisierung von Lightbox habe ich alle Bilderverlinkungen auf den neuesten Stand gebracht.
-
Den
<head>
meiner Website habe ich um eine Beschreibung, einige Keywords und “Author” erweitert:<meta name="description" content="Eine private Website ueber Veganismus, Open Source, Linux, Minimalismus oder ganz allgemein: mich." /> <meta name="keywords" content="Yannic Haupenthal, Linux, Veganismus, Minimalismus, Open Source, Reisen, Linkdump, Comics" /> <meta name="author" content="Yannic Haupenthal" />
-
Eine neue Schrift habe ich noch immer nicht gefunden. Es gibt zwar einiges zur Auswahl (z.B. bei Google oder der Open Font Library ), allerdings haben die mich alle nicht ueberzeugen koennen bzw. ich hatte keine Lust mehr 😉
Update (2014-06-02)
Da das Nachladen der Schrift Resourcen kostet, habe ich nun einfach nur nochsans-serif
als Schrift.
TODO #
- IPv6 😉
- Alles andere, was oben noch nicht erledigt wurde