Hallo, heute geht es um das Thema Ruby Webserver Thin mit Let’s Encrypt SSL Zertifikat. Das beinhaltet den Webserver Thin und dessen Betrieb mit einem SSL Zertifikat von Let’s Encrypt. Thin ist ein mächtiger und schneller Webserver für Ruby. Er ist flotter als das Apache Plugin Passenger und unterstützt im Gegensatz zu Passenger auch Websockets. Es ist damit auch ein Chat umzusetzen.
Fangen wir mal mit dem Zertifikat an:
Ich setze mal voraus, das wir von einem Linux Server sprechen. In allen aktuellen Linux Versionen, wie Debian 9, kann man certbot, das Lets‘ Encrypt Taschenmesser aus dem Repo installieren:
sudo apt install certbot
Dann kommst die Erstellung des Zertifikates:
sudo certbot certonly --standalone -d chat.demo.org
Wenn ein Apache läuft muss er währen der Erstellung des Zertifikates beendet werden:
sudo service apache2 stop
Eine umfassende Anleitung findest du hier direkt bei Let’s Encrypt.
Nach der Erstellung des Zertifikates startet den Webserver wieder:
sudo service apache2 start
Der private Schlüssel und das Zertifikat liegen unter:
/etc/letsencrypt/chat.demo.org/live
cert.pem
chain.pem
fullchain.pem
privkey.pem
Das Webroot der Seite befindet sich unter:
/var/www/chat.demo.org
Ich habe hier ein Startscript erstellt und in den Cron eingebunden:
/root/scripts/thin_restart.sh
#!/bin/bash
cd /var/www/chat.demo.org
COUNT=$(ps -ef |grep thin|grep 8443|grep thin|wc -l)
if [ $COUNT -lt 1 ]; then
thin -p 8443 -a 1.2.3.4 -d -l /var/www/chat.demo.org/app8443.log -P /tmp/pids/thin8443.pid –ssl –ssl-disable-verify –ssl-key-file /etc/letsencrypt/live/chat.demo.org/privkey.pem –ssl-cert-file /etc/letsencrypt/live/chat.demo.org/fullchain.pem -R config.ru start
fi
Dieses Script überprüft, ob der Server als Prozess noch läuft und startet ihn gegebenfalls neu.
Zerlegen wir doch mal den Aufruf
-p 8443 -> der Server läuft auf Port 8443
-a 1.2.3.4 -> das ist die IP Adresser auf der der Server läuft (bitte nicht localhost 😉 )
-d -> der Thin Server läuft als Daemon, der Prozess wird also in den Hintergrund geschoben und bleibt auch bei Abmeldung bestehen
-l /var/www/chat.demo.org/app8443.log -> das ist das Logfile
-P /tmp/pids/thin8443.pid -> hier legt der prozess seine Prozessid ab
–ssl -> SSL wird aktiviert
–ssl-disable-verify -> Clientzertifikate werden nicht akzeptiert, wichtig!!!!
–ssl-key-file /etc/letsencrypt/live/chat.demo.org/privkey.pem -> der private Schlüssel
–ssl-cert-file /etc/letsencrypt/live/chat.demo.org/fullchain.pem -> das zertifikat
-R config.ru start -> das Rac File
Hier noch der Aufruf via Cron:
*/10 * * * * /root/scripts/thin_restart.sh >/var/log/thin_restart.sh.log 2>&1
Mit dieser Konfiguration läut der Thin sauber mit SSL.
Was noch zu erwähnen ist, ist das der Websocket dann auch via SSL angesprochen werden muss, er ist ja unverschlüsselt nicht mehr erreichbar. Aufgrund der Entwicklungsumgebung, die nicht mit SSl lauft, habe ich im clientseitigen Aufruf eine Fallunterscheidung eingebaut.
chat.js
if (document.location.protocol=='http:') {
wsUri = "ws://localhost:9000";
}
else {
wsUri = "wss://localhost:8443";
}