certbot-transip-dns-01-validator v2.0

Op 4 december is de nieuwe versie van mijn TransIP DNS-01 validator script gereleased. Deze kan gebruikt worden om Letsencrypt wildcard certificaten aan te vragen. De nieuwe versie is volledig herschreven en maakt nu gebruik van de PHP package manager composer. De grootste voordelen zijn betere logging en er wordt nu altijd de juiste versie van de TransIP api geïnstalleerd.

Klik hier voor de GitHub repository

LXC – error running non-shared postrotate script for /var/log/syslog of ‘/var/log/syslog’

I’ve got a Proxmox VE host running with a couple of LXC containers which used to run on Ubuntu 16.04. After I upgraded them to 18.04 I received a daily e-mail from every LXC container with the following error:

/etc/cron.daily/logrotate:
Failed to kill unit rsyslog.service: Input/output error
error: error running non-shared postrotate script for /var/log/syslog of '/var/log/syslog'
run-parts: /etc/cron.daily/logrotate exited with return code 1

I tried to fix it a couple times but never managed to find the real issue. Today I found the solution thanks to a German thread on the Proxmox forums.

The real error message  which causes logrotate to fail can be found by executing:

logrotate -v /etc/logrotate.d/rsyslog 

error: skipping "/var/log/syslog" because parent directory has insecure permissions (It's world writable or writable by group which is not "root") Set "su" directive in config file to tell logrotate which user/group should be used for rotation.

According to our German friends there is a new version of rsyslog which fixes the issue. It can be installed with the following commands:

apt install software-properties-common
add-apt-repository ppa:adiscon/v8-stable
apt install -y rsyslog

For safety I reboot the LXC container to make sure the new version of the service is running.

There is a final note about a message appearing in /var/log/syslog every few seconds but I haven’t seen that happen.

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: