Letsencrypt wildcard certificaten bij TransIP

Sinds gister heb ik een gratis wildcard SSL certificaat van Letsencrypt. Deze zijn sinds 13 maart te verkrijgen. Omdat je deze certificaten alleen kan krijgen via een DNS validatie en deze elke 3 maanden opnieuw moet uitvoeren heb ik dit geautomatiseerd. TransIP heeft een API waarmee je o.a. de DNS records kan aanpassen. Dit script en hoe je dit kan installeren is te vinden op Github.

https://github.com/roy-bongers/certbot-transip-dns-01-validator

tmux cheatsheet

tmux is an awesome tool to manage terminal windows and to keep your terminal session running while you log on / off the computer. It works like GNU screen but better. Inside an tmux session you can have multiple windows or split your window into mulitple panes and switch betwee all of them.

Manage sessions from terminal

tmux new -s session-name         start named session
tmux a (-t session-name)         attach a (named) session
tmux ls                          list all sessions While running tmux: (ctrl+b)

While running tmux (ctrl+b)

Control windows

c        create window
w        list windows
n        next window
p        previous window
f        find window
,        name window
&        kill window

Control panes

%        vertical split
"        horizontal split
o        swap panes
q        show pane numbers
x        kill pane
+        break pane into window (e.g. to select text by mouse to copy)
-        restore pane from window
t        big clock

Control Sessions

s        list sessions
$        name session
:new<CR> new session
d        detach session

Self signed SSL certificaten

Ik draai al jaren een website met een self signed SSL certificaat. Op zich werkt dit perfect behalve dat Chrome op mijn Android telefoon van tijd tot tijd me weer een waarschuwing geeft. Open je de site vanaf je Homescreen als standalone web app dan blijf je ook altijd een balk zien met een rood kruis (ongeldig certificaat). Ik heb al eens eerder geprobeerd om het SSL certificaat toe te voegen aan Android zodat deze vertrouwd zou zijn echter lukte dit steeds niet.

Vandaag kwam ik er achter dat je aan Android alleen root CA certificaten kan toevoegen. Tegelijkertijd kwam ik er meer achter hoe SSL certificaten werken en wat nu een root Certificate Authority (CA) is. Voor de uitleg over root CA verwijs ik naar dit filmpje.

Zodra je dus een root certificaat toevoegd aan je browser worden automatische alle certificaten die ondertekend zijn met dit root certificaat zonder problemen geaccepteerd. Ideaal dus voor een testomgeving of wanneer je zelf meerdere domeinen host met een self signed certificaat.

Een root certificaat aanmaken

Als eerste genereren we een private key

$ openssl genrsa 8192 > rootca.key

Genereer daarna het certificaat. Pas het aantal dagen dat deze geldig is naar wens aan. Ik heb deze op 10 jaar staan.

$ openssl req -x509 -new -nodes -key rootca.key -days 3652 > rootca.pem

Tijdens het aanmaken van het certificaat worden je enkele gegevens gevraagd en daarna is het certificaat gegenereerd. Dit certificaat kun je nu zonder problemen toevoegen aan bijvoorbeeld Chrome en Firefox. Voor Android moeten we nog een extra stap doen.

Format aanpassen voor Android

Voer de onderstaande code uit om het format van het certificaat aan te passen naar DER.

$ openssl x509 -in rootca.pem -outform der -out rootca.der.crt

Dit aangepaste certificaat kun je het makkelijkst naar Android krijgen door deze op via een url beschikbaar te maken. Wanneer je dan naar de betreffende URL gaat op je telefoon zal automatisch gevraagd worden om het certificaat te installeren. Geef een naam op en druk op opslaan. Je kan dit certificaat terug vinden onder Settings -> Security -> Trusted Credentials -> User.

Android certificate install

Een certificaat maken

Opnieuw moeten we een private key genereren

openssl genrsa 4096 > mijndomein.nl.key

Hierna maken we een Certificate Signing Request (CSR)

openssl req -new -key mijndomein.nl.key > mijndomein.nl.csr

Vervolgens worden je wederom allerlei gegevens gevraagd. Het challenge password en de optional company name kun je gewoon leeg laten.

Wanneer je een certificaat wil maken voor een los domein kun je nu je certificaat genereren met het volgende commando. Wil je extra’s zoals een multi domain certificaat scroll sla deze stap dan over en ga naar extensions.

openssl x509 -req -days 3652 -CA rootca.pem -CAkey rootca.key -CAcreateserial -in mijndomein.nl.csr > mijndomein.nl.pem

Als laatste kun je nog een info bestand maken waarmee je de gegevens van het certificaat kan zien. Deze stap is echter optioneel.

openssl x509 -in mijndomein.nl.pem -text > mijndomein.nl.info

Extensions

Aangezien ik een multi domain certificaat wil hebben moeten we nog het e.a. toevoegen. Maak een bestand aan genaamd v3.ext en voeg daar de volgende opties aan toe. Pas de DNS regels aan naar je eigen wensen.

[mijndomein_ext]
basicConstraints         = critical,CA:false
keyUsage                 = critical,keyEncipherment,dataEncipherment
subjectKeyIdentifier     = hash
authorityKeyIdentifier   = keyid,issuer
subjectAltName           = @mijndomein_ext_subject

[mijndomein_ext_subject]
DNS.1 = mijndomein.nl
DNS.2 = *.mijndomein.nl

Nu kunnen we ons certificaat aan gaan maken.

openssl x509 -req -days 3652 -CA rootca.pem -CAkey rootca.key -CAcreateserial -in mijndomein.nl.csr -extfile v3.ext -extensions mijndomein_ext > mijndomein.nl.pem

Het certificaat is nu aangemaakt, deze kun je nu gebruiken is allerlei applicaties.

Beveiliging

Private keys mogen eigenlijk alleen door root gelezen worden. Dit omdat anders iedereen met toegang tot de keys deze kan lezen en dus ook nieuwe certificaten aanmaken. Voor daarom altijd een chown en een chmod uit.

chown root:root *.key
chmod 600 *.key

Certificaat gebruiken in Apache2

Om SSL te activeren binnen apache moet je het volgende toevoegen aan je virtualhost:

SSLEngine On
SSLCertificateFile /etc/apache2/ssl/mijndomein.nl.pem
SSLCertificateKeyFile /etc/apache2/ssl/mijndomein.nl.key

Gebruikte bronnen:

Hyperion aan/uit zetten met een remote

Overdag heb je niet zo veel aan Ambilight en het leek me wel leuk als ik dit aan en uit kon zetten met mijn afstandsbediening. Mijn Rasberry Pi kan bediend worden door middel van CEC waardoor ik met de afstandsbediening van de TV direct Kodi aan kan sturen.

Als eerste moeten we een scriptje maken voor het aan / uit zetten van Hyperion. Plaats de volgende code in /storage/ledsremote.sh.

#!/bin/sh
if [ -z `pidof hyperiond` ]
then
    echo "$USER" > /storage/user.txt
    curl -v -H "Accept: application/json" -H "Content-type: application/json" -X POST -d '{"id":1,"jsonrpc":"2.0","method":"GUI.ShowNotification","params":{"title":"Hyperion","message":"Enabled","image":"/storage/hyperion.png"}}' http://127.0.0.1:80/jsonrpc
    LD_LIBRARY_PATH=/storage/hyperion/bin 
    /storage/hyperion/bin/hyperiond.sh /storage/.config/hyperion.config.json > /dev/null 2>&1 &
else
    echo "$USER" > /storage/user.txt
    curl -v -H "Accept: application/json" -H "Content-type: application/json" -X POST -d '{"id":1,"jsonrpc":"2.0","method":"GUI.ShowNotification","params":{"title":"Hyperion","message":"Disabled","image":"/storage/hyperion.png"}}' http://127.0.0.1:80/jsonrpc
    killall hyperiond
fi

Maak deze vervolgens executable.

chmod +x /storage/ledsremote.sh

Door dit script aan te roepen kunnen we nu Hyperion aan en uitzetten. We moeten alleen nog zorgen dat dit gemapped word aan de afstandsbediening. Kopieer de standaard keyboard configuratie naar de kodi userdata map zodat we deze kunnen wijzigen.

cp /usr/share/kodi/system/keymaps/remote.xml /storage/.kodi/userdata/keymaps/remote.xml

Zoek vervolgens een key uit in de <global> sectie waar je de actie aan wil koppelen. In mijn geval heb ik dit met de key <red> gedaan. Pas de waarde als volgt aan:

<red>System.Exec("/storage/ledsremote.sh")</red>

Start je Raspberry Pi opnieuw op en als het goed is kun je de leds nu aan en uitzetten met je afstandsbediening!

Met dank aan deze blog.

OpenElec 1920×1080 met de TV uit

OpenElec vind het bij mij niet leuk wanneer de TV uitstaat tijdens het booten. De resolutie blijft dan hangen op 640×480. Dit is op te lossen op de volgende manier. Login op de Raspberry Pi via SSH en dan de volgende commando’s uit.

mount -o remount,rw /flash
tvservice -d /flash/edid.dat
 
# optional you can view the edid details if you want.
edidparser /flash/edid.dat

Vervolgens moeten we het /flash/config.txt bestand wijzigen en zorgen dat daar de volgende twee regels in staan:

nano /flash/config.txt
hdmi_edid_file=1 
hdmi_force_hotplug=1